Esta é mais uma daquelas plaquinhas que a gente acha em vários lugares (eu comprei no Mercado Livre). Um detalhe importante é que existem muitas variações com a aparência semelhante (este site estranho lista uma dezena de variações). A que eu tenho tem a identificação "tftlcd for arduino uno (spiflash)".
Examinando a placa encontramos:
- O display em si
- Um botão (ligado entre os pinos Reset e GND do Arduino)
- Dois integrados SM245TS (que creio funcionarem como um buffer entre o display e os sinais do Arduino, para poder operar tanto a 3,3V como a 5V)
- Um soquete para micro SD
Obs.: onde eu falar 'Arduino', entendam o que estiver ligado nos conectores da shield
A placa possui indicação de quais pinos do conector Arduino estão ligados ao display e ao SD. O SD está ligado ao SPI, o que é usual. Vou ignorar ele neste post e me concentrar no display. Na página que mencionei no começo tem um esquemático. Ele inclui um regulador para gerar 3,3V a partir de 5V, a minha placa não tem isso (usa os 3,3V do conector do Arduino).
Uma primeira preocupação minha foi quanto a operação com microcontroladores operando a 3,3V, minha conclusão é que não existe problema e o display pode ser usado com PiPico, ESP32, Blue Pill, etc.
O meu display usa o controlador ILI9341 (datasheet). Este chip suporta várias formas de interface com um microcontrolador, no display ele está configurado para operar no paralelo de 8 bits. Isto possibilita maior velocidade que um modo serial (SPI ou I2C) à custa de mais sinais de conexão. Os sinais dão:
- D0 a D7: os oito bits do dado (bidirecional), ligados aos pinos 2 a 9 do Arduino
- RST: reset do controlador, ligado ao pino A4 do Arduino
- CS: seleciona o controlador (ativo no nível baixo), ligado ao pino A3 do Arduino
- RS: indica se o byte sendo transferido é um dado ou comando (0 = comando, 1 = dado), ligado ao pino A2 do Arduino
- WR: indica que o byte será escrito no controlador , ligado no pino A1 do Arduino
- RD: indica que o byte será lido do controlador, ligado ao pino A0 do Arduino
Com estas informações e o datasheet, podemos ligar o display num Arduino Uno e obter a identificação do controlador. No programa abaixo uso digitalWrite() para controlar cada pino, mas para obter mais velocidade o ideal seria acessar direto os registradores do ATmega.
const int lcdRST = A4; const int lcdCS = A3; const int lcdRS = A2; const int lcdWR = A1; const int lcdRD = A0; const int lcdDATA[] = {8, 9, 2, 3, 4, 5, 6, 7 }; void setup() { for (int i = 0; i < 8; i++) { pinMode(lcdDATA[i], INPUT); } pinMode(lcdRST, OUTPUT); digitalWrite (lcdRST, HIGH); delay(10); digitalWrite (lcdRST, LOW); delay(10); digitalWrite (lcdRST, HIGH); delay(10); pinMode(lcdCS, OUTPUT); digitalWrite (lcdCS, HIGH); pinMode(lcdRS, OUTPUT); digitalWrite (lcdRS, HIGH); pinMode(lcdRD, OUTPUT); digitalWrite (lcdRD, HIGH); pinMode(lcdWR, OUTPUT); digitalWrite (lcdWR, HIGH); Serial.begin (115200); Serial.println(lcdId(), HEX); } void loop() { delay (100); } // Lê a identificação do controlador uint32_t lcdId() { digitalWrite (lcdCS, LOW); lcdCmd(0xD3); for (int i = 0; i < 8; i++) { pinMode(lcdDATA[i], INPUT_PULLUP); } lcdRead(); // despreza o primeiro byte uint32_t id = 0; for (int i = 0; i < 3; i++) { id = id << 8; id += lcdRead(); } digitalWrite (lcdWR, LOW); digitalWrite (lcdCS, HIGH); return id; } // Envia um comando para o controlador do display void lcdCmd(byte cmd) { digitalWrite (lcdRS, LOW); digitalWrite (lcdWR, LOW); lcdWrite(cmd); digitalWrite (lcdWR, HIGH); digitalWrite (lcdRS, HIGH); } // Lê uma valor do controlador do display byte lcdRead() { byte b = 0; digitalWrite (lcdRD, LOW); for (int i = 0; i < 8; i++) { b = b >> 1; if (digitalRead(lcdDATA[i]) == HIGH) { b |= 0x80; } } digitalWrite (lcdRD, HIGH); return b; } // Coloca um valor nos pinos de dados void lcdWrite(byte b) { for (int i = 0; i < 8; i++) { pinMode(lcdDATA[i], OUTPUT); digitalWrite(lcdDATA[i], b & 1 ? HIGH : LOW); b = b >> 1; } }
No próximo post espero falar sobre a detecção de toque, que por enquanto está me dando um baile.
Nenhum comentário:
Postar um comentário