Monitor TFT LCD SPI

 

 

 

 

 

 

Posizione verticale pin in basso:

 

8 7 6 5 3 2 1
LEDA CS RS RES SDA SCK VCC GND

 

Posizione orizzontale pin a sinistra:

 

NUM LCD
8 LEDA
7 CS
6 RS
5 RES
4 SDA
3 SCK
2 VCC
1 GND

 

LCD = Monitor lcd tft 1.7" 160 x 128

 

Attenzione!

Lo schema suggerito dal produttore quello rappresentato sopra non fa funzionare il display. O meglio per funzionare bisogna rispettare certe condizioni. Se si usa un Arduino Uno magari non originale si corre il riscio che l'uscita a 3.3V non sia sufficente ad alimentare il TXB0108 che la retroilluminazione del monitor.

🔍 Perché succede con l’Arduino Uno (compatibile):

  • Il pin 3.3V dell’Arduino Uno non è in grado di erogare molta corrente, perché è alimentato da un regolatore lineare (tipo LP2985 o simile) integrato.

  • Spesso il 3.3V viene fornito dal chip FTDI/CH340/ATmega16U2 (sulla porta USB), quindi se non hai il cavo USB collegato, può diventare debole o assente.

  • Nei compatibili, il regolatore può essere ancora più economico o sottodimensionato → tensione instabile = TXS0108 lavora male = segnali SPI rovinati.

❓Con un Arduino Uno originale sarebbe cambiato qualcosa?

   Forse sì, ma non necessariamente abbastanza.

  • L’Arduino originale ha un 3.3V leggermente più stabile (fino a 50 mA max!), ma è comunque insufficiente per alimentare in modo affidabile un convertitore logico + un display SPI a colori.

  • Per progetti un po’ più esigenti, è sempre meglio dare un 3.3V esterno separato e ben filtrato, come hai fatto con l’XL4015 — ottima scelta.

Infatti seguendo lo schema del produttore nell'eseguire lo sketch di test, si avevano o schermi bianchi o i comandi di ripulire lo schermo non funzionavano lo schermo rimaneva sporco con tutto rumore. Cosa era successo il convertitore logico TXB0108 è molto sensibile e per funzionare ha bisogno di essere alimentato sul suo pin VCCB con 5V e sul pin VCCA con 3.3V. Ora però mentre i 5V forniti da Arduino possono bastare in quanto eroga circa 800 mA nella peggioree delle ipotesi 500 mA, i 3.3V sono molto deboli si arriva a malapena a 50 mA e come da schema dovranno alimentare il TXB0108 il suo pin OE e la retroilluminazione del display, il solo display potrebbe consumare dagli 80 ai 100 mA, quindi avviene che il TXB0108 sottoalimentato e anche con una tensione instabile non riesce a convertire in modo corretto i segnali a 5V da Arduino in segnali a 3.3V per il display il quale non rispone correttamente ai comandi e fa quello che  abbiamo descritto sopra.

La soluzione è lasciare Ad Arduino il compito di fornire i 5V, meglio se alimentato dal Jack Barrel con una batteria da 9V che non con il cavo USB da PC che risulta più debole. Ed invece alimentare sia il pin VCCA del convertitore, che il pin di attivazione l'OE che il pin LEDA del displa (la retroilluminazione) con un modulo esterno io ho scelto l'XL4015 alimentato in ingresso con i 9V della batteria e con uscita a 3.3V con potenza fino a 5A e una magiore stabilità. A quel punto vedrete che in nostro convertitore fara il suo avoro e tutto tornerà a funzioare. Ho trovato qualche difficoltà ad impostare l'XL4015 vedi qui. 

 

Semplice codice per testare se funziona.

Orienterà il display in orizzntale (160 x 128) e scriverà "Hello World" al centro dello schermo

 

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

// Pin di collegamento
#define TFT_CS     10
#define TFT_RST    8
#define TFT_DC     9

// Creazione oggetto display
Adafruit_ST7735 display = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

void setup() {
  // Inizializzazione del display
  display.initR(INITR_BLACKTAB);

  // Imposta l'orientamento orizzontale
  display.setRotation(3); // Orizzontale

  // Svuota il display con il colore nero
  display.fillScreen(ST77XX_BLACK);

  // Imposta il font e la dimensione
  display.setTextSize(2); // Dimensione 2
  display.setTextColor(ST77XX_WHITE); // Colore testo bianco
  display.setCursor((160 - (12 * 13)) / 2, (128 - 16) / 2); // Centrato

  // Scrivi "Hello World"
  display.print("Hello World");
}

void loop() {
  // Non facciamo nulla in loop
}