Smart IC Tester

Smart IC Tester

 

Come sempre, mai una volta che qualcosa mi funzioni al primo colpo.

Erano mesi e mesi che avevo pronti i PCB per realizzare questo progettino e alla fine ho deciso di metterci mano, convinto, di portarlo a termine in circa mezz’ora….ma come al solito, anche in progetti apparentemente semplici, c’ho perso circa 8 ore per risolvere tutti i problemi che si sono susseguiti.

Partiamo dal progetto originale. Trovate tutto in questi due link

Nel primo le istruzioni nel secondo i sorgenti su github.

Scaricato il tutto e preparato il circuito, in teoria, sarebbe sufficiente fare l’upload del codice sull’arduino e tutto dovrebbe funzionare.

Invece sono incappato subito in una bella schermata bianca, quindi ho dedotto o che l’LCD fosse guasto o che le librerie per l’LCD TFT non erano corrette. E qui casca il primo asino. Come verifico il tipo di LCD che ho? In teoria doveva essere un LCD con controller ILI9341, ma non ne avevo la certezza.

Allora mi sono messo alla ricerca di un qualcosa che mi permettesse di testare la funzionalità dello schermo e poi di identificare il tipo di controller. E alla fine ho trovato questo sketch, che permette di effettuare entrambe le operazioni. Il tipo di controller si può leggere aprendo il monitor seriale dell’Arduino IDE, dopo aver effettuato l’upload del codice.

/*
TFT LCD – TFT Simple driving
modified on 21 Feb 2019
by Saeed Hosseini

Home


*/#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define ORANGE 0xFD20
#define GREENYELLOW 0xAFE5
#define NAVY 0x000F
#define DARKGREEN 0x03E0
#define DARKCYAN 0x03EF
#define MAROON 0x7800
#define PURPLE 0x780F
#define OLIVE 0x7BE0
#define LIGHTGREY 0xC618
#define DARKGREY 0x7BEFAdafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);void setup() {

Serial.begin(9600);
Serial.println(F(“TFT LCD test”));

#ifdef USE_ADAFRUIT_SHIELD_PINOUT
Serial.println(F(“Using Adafruit 2.4\” TFT Arduino Shield Pinout”));
#else
Serial.println(F(“Using Adafruit 2.4\” TFT Breakout Board Pinout”));
#endif
Serial.print(“TFT size is “);
Serial.print(tft.width());
Serial.print(“x”);
Serial.println(tft.height());

tft.reset();

uint16_t identifier = tft.readID();

if (identifier == 0x9325) {
Serial.println(F(“Found ILI9325 LCD driver”));
} else if (identifier == 0x9328) {
Serial.println(F(“Found ILI9328 LCD driver”));
} else if (identifier == 0x7575) {
Serial.println(F(“Found HX8347G LCD driver”));
} else if (identifier == 0x9341) {
Serial.println(F(“Found ILI9341 LCD driver”));
} else if (identifier == 0x8357) {
Serial.println(F(“Found HX8357D LCD driver”));
} else {
Serial.print(F(“Unknown LCD driver chip: “));
Serial.println(identifier, HEX);
Serial.println(F(“If using the Adafruit 2.4\” TFT Arduino shield, the line:”));
Serial.println(F(” #define USE_ADAFRUIT_SHIELD_PINOUT”));
Serial.println(F(“should appear in the library header (Adafruit_TFT.h).”));
Serial.println(F(“If using the breakout board, it should NOT be #defined!”));
Serial.println(F(“Also if using the breakout, double-check that all wiring”));
Serial.println(F(“matches the tutorial.”));
return;
}

tft.begin(identifier);

Serial.println(F(“Benchmark Time (microseconds)”));

Serial.print(F(“Screen fill “));
Serial.println(FillScreen());
delay(500);

tft.setTextColor(YELLOW);
tft.setCursor(70, 180);
tft.setTextSize(1);
tft.println(“Electropeak”);
delay(200);
tft.fillScreen(PURPLE);
tft.setCursor(50, 170);
tft.setTextSize(2);
tft.println(“Electropeak”);
delay(200);
tft.fillScreen(PURPLE);
tft.setCursor(20, 160);
tft.setTextSize(3);
tft.println(“Electropeak”);
delay(500);
tft.fillScreen(PURPLE);
for (int rotation = 0; rotation < 4; rotation++) { tft.setRotation(rotation); tft.setCursor(0, 0); tft.setTextSize(3); tft.println(“Electropeak”); delay(700); } delay(500); Serial.print(F(“Rectangles (filled) “)); Serial.println(testFilledRects(YELLOW, MAGENTA)); delay(500); } void loop() { } unsigned long FillScreen() { unsigned long start = micros(); tft.fillScreen(RED); delay(500); tft.fillScreen(GREEN); delay(500); tft.fillScreen(BLUE); delay(500); tft.fillScreen(WHITE); delay(500); tft.fillScreen(MAGENTA); delay(500); tft.fillScreen(PURPLE); delay(500); return micros() – start; } unsigned long testFilledRects(uint16_t color1, uint16_t color2) { unsigned long start, t = 0; int n, i, i2, cx = tft.width() / 2 – 1, cy = tft.height() / 2 – 1; tft.fillScreen(BLACK); n = min(tft.width(), tft.height()); for (i = n; i > 0; i -= 6) {
i2 = i / 2;
start = micros();
tft.fillRect(cx – i2, cy – i2, i, i, color1);
t += micros() – start;
// Outlines are not included in timing results
tft.drawRect(cx – i2, cy – i2, i, i, color2);
}

return t;
}

 

Ok, dopo aver effettuato il test e identificato il controller ILI9341, dovevo ancora risolvere il problema della schermata bianca.

Dopo ore di test con varie librerie di adafruit (specifiche per l’ILI9341 e non) e verifiche delle corrispondenze delle piedinature con quanto riportato sulla libreria, ho trovato la soluzione utilizzando la libreria SPFD5408.

La potete trovare QUI

Scaricatela e copiatela nella cartella library dell’arduino IDE

Aprite lo sketch e nella prima tab modificate quanto segue

//TFT
//#include <Adafruit_GFX.h> // Core graphics library
//#include <Adafruit_TFTLCD.h> // Hardware-specific library
//#include <TouchScreen.h> //Touch Screen Library
#include <pin_magic.h>
#include <registers.h>
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h>
#include <SPFD5408_TouchScreen.h>
#include <SPFD5408_Util.h>

Su github della libreria SPFD5408 fa riferimento ai pin

—- Pinout XM XP, must be:

#define YP A1 // must be an analog pin, use “An” notation!
#define XM A2 // must be an analog pin, use “An” notation!
#define YM 7 // can be a digital pin
#define XP 6 // can be a digital pin

ma per far funzionare il circuito bisogna lasciare invariate le assegnazioni date in origine dal progetto, altrimenti il touch non funzionerà

#define YP A3 // must be an analog pin, use “An” notation!
#define XM A2 // must be an analog pin, use “An” notation!
#define YM 9 // can be a digital pin
#define XP 8 // can be a digital pin

Effettuato nuovamente l’upload, magicamente il display ha funzionato correttamente ma aveva il touch che non funzionava perfettamente, in quanto il punto di pressione dello schermo, non corrispondeva all’effettivo punto in cui ci si aspettava la pressione. In pratica era completamene scalibrato.

Per risolvere anche questo problema, ho modificato il codice come segue

Nel tab TFT impostare

tft.setRotation(5);

anzichè tft.setRotation(3); come di default

 

Andrà modificata anche la mappa nel tab principale ic_tester

p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.height());
p.y = map(p.y, TS_MINY, TS_MAXY, tft.width(), 0);

anzichè

p.x = map(p.x, TS_MINX, TS_MAXX, tft.height(), 0);

p.y = map(p.y, TS_MINY, TS_MAXY, tft.width(), 0);

 

Andrà modificato anche sotto la tab keypad altrimenti i numeri verranno premuti specchiati sull’asse X

 

Fatto tutto questo, adesso il tester funziona come dovrebbe funzionare. Mi sono divertito anche a tradurlo in italiano.

 

Lascio sotto tutto il materiale che ho utilizzato per questo progetto

  • Progetto originale : https://www.instructables.com/Smart-IC-Tester/
  • Pagina ufficiale : https://github.com/akshaybaweja/Smart-IC-Tester
  • Libreria SPFD5408 : https://github.com/JoaoLopesF/SPFD5408 o scaricala direttamente SPFD5408_library
  • Altre librerie necessarie : SD_library e FastLED_library

 

223 Visualizzazioni totali 2 Visualizzazioni odierne

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *