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