Shield TFT LCD de 3,5 polegadas: um ecrã de 480 × 320 num barramento rápido de 8 bits

A maior parte dos pequenos ecrãs usados em projetos de amadores fala SPI: uma linha de relógio, uma linha de dados e cada byte a passar espremido, um bit de cada vez. O shield vermelho de 3,5 polegadas deste artigo funciona de outra maneira. Ao virá-lo, em vez de MOSI e SCK, encontram-se oito linhas de dados, de LCD_D0 a LCD_D7, pelo que cada ciclo de relógio transporta um byte inteiro. Com 480 × 320 píxeis, uma película tátil resistiva e uma ranhura microSD, é um dos maiores ecrãs que encaixam diretamente num Arduino Uno, sem um único fio.

Vale a pena olhar para ele com atenção, mesmo para quem nunca teve um Uno. Ligámo-lo a um ESP32-S3, que tem um periférico 8080 por hardware, pusemos o barramento a 20 MHz e reproduzimos vídeo de 480 × 320 em ecrã inteiro a partir de um cartão microSD, a 25 fotogramas por segundo; o resultado pode ver-se na secção sobre a velocidade. A seguir: o que há na placa, como funciona o seu barramento e como programá-lo, de onde vem a velocidade e onde se perde, e o que construir com ele, de uma estação meteorológica a uma moldura digital ou a um painel de parede.

O verso do shield TFT LCD de 3,5 polegadas com os componentes identificados. À esquerda, as linhas de controlo LCD_RST, LCD_CS, LCD_RS, LCD_WR e LCD_RD e, a seguir, os pinos de alimentação GND, GND, 5V e 3V3. À direita, as linhas de dados LCD_D2 a LCD_D7 e, a seguir, LCD_D0, LCD_D1 e as linhas do microSD SD_CS, SD_DI, SD_DO e SD_SCK. Ao meio, dois chips de buffer do barramento, um regulador de 3,3 V, uma ranhura microSD e os quadrados impressos ILI9486 e ILI9488.
O verso do shield, onde estão todas as inscrições: linhas de controlo e alimentação à esquerda, as oito linhas de dados e as linhas do microSD à direita. Clique para ver a versão em tamanho real.

De que placa se trata

As lojas vendem-no como «3.5 inch TFT LCD Shield for Arduino UNO/Mega», e há várias fábricas a fazer placas que parecem iguais, mas diferem nos componentes. A deste artigo é vermelha, com a serigrafia «3.5″ TFT LCD Shield» e o código de data 2026-01-27. O pormenor mais revelador está num canto: dois quadrados impressos com ILI9488 e ILI9486, e nenhum deles marcado. O controlador propriamente dito está montado em chip-on-glass, escondido debaixo do painel, pelo que a placa não diz qual dos dois traz.

A nossa mostra uma imagem correta e estável com a sequência de inicialização do ILI9488, por isso o mais provável é ser um ILI9488. É uma hipótese de trabalho, não uma identificação: os dois controladores partilham os comandos básicos, e a sequência errada muitas vezes também produz imagem, só que com mau contraste ou cintilação. Outra placa da mesma loja pode trazer o outro chip. Na frente há uma película tátil resistiva de 4 fios, com um cabo flexível de quatro contactos ao longo da margem superior e o vidro marcado H1454 7-3. Não há nenhum chip controlador de toque em toda a placa.

Características técnicas

ElementoO que éNa prática
PainelTFT de 3,5 polegadas, resolução nativa de 320 × 480, 480 × 320 na horizontal153 600 píxeis: espaço para um gráfico com legendas, uma foto ou um fotograma de vídeo
ChipILI9486 ou ILI9488, em chip-on-glass; o nosso comporta-se como um ILI9488Os dois precisam de sequências de arranque diferentes; a errada também dá imagem, só que pior
InterfaceBarramento paralelo ao estilo Intel 8080: oito linhas de dados, mais CS, RS, WR, RD e RST13 pinos do anfitrião; um byte por impulso de escrita
CorRGB666, 262K cores, 3 bytes por píxel: verificado. RGB565, 65K cores, 2 bytes: deverá funcionarDois bytes por píxel cortariam o tráfego num terço
Relógio de escrita20 MHz verificados com fios de ligação; o fabricante do ILI9488 admite até 25 MHzUma imagem completa em 23 ms com três bytes por píxel
ToquePelícula resistiva de 4 fios, sem chip controladorO anfitrião mede-a com o seu próprio ADC, por pinos em comum com o ecrã
CartãoRanhura microSD ligada por SPI, pinos D10–D13 do UnoFotos, tipos de letra e vídeo na própria placa
Energia5 V no pino 5V; regulador AMS1117 de 3,3 V na placaUma só fonte para o painel, a lógica e a luz de fundo
Níveis lógicosLógica de 3,3 V do anfitrião verificada; o shield foi feito para a lógica de 5 V de um UnoFunciona com ESP32, RP2040 ou STM32, tal como com placas AVR
Luz de fundoSempre acesa; sem pino de controloSem regulação por software; para poupar energia, desligam-se os 5 V
FormatoShield para Arduino Uno R3, 28 pinosEncaixa num Uno ou num Mega; qualquer outro anfitrião precisa de fios de ligação

Primeiro, um pouco de aritmética. Uma imagem tem 480 × 320 = 153 600 píxeis: 460 800 bytes com três bytes por píxel, 307 200 com dois. O barramento de 8 bits move um byte por impulso de escrita, por isso a 20 MHz transporta 20 milhões de bytes por segundo, e uma imagem completa demora 23 ms, ou 15,4 ms com dois bytes por píxel. O SPI move um bit por ciclo de relógio. A 20 MHz, o limite que a folha de características do ILI9488 fixa para a sua interface SPI, a mesma imagem demora 184 ms, e mesmo em overclock a 40 MHz demora 92 ms.

Os pinos: ligar pelas inscrições

O shield segue a disposição do Arduino Uno, mas as inscrições contam mais do que os números do Uno. O byte de dados está repartido de uma forma que surpreende muita gente: LCD_D2 a LCD_D7 ficam nos pinos D2 a D7 do Uno, enquanto LCD_D0 e LCD_D1 passaram para D8 e D9, para que D0 e D1 fiquem livres para a porta série do Uno.

Pino do UnoInscriçãoFunção
A0LCD_RDImpulso de leitura, ativo a nível baixo; manter a nível alto
A1LCD_WRImpulso de escrita, ativo a nível baixo; o painel captura os dados no flanco ascendente
A2LCD_RSSeleção de registo: 0 para comando, 1 para dados; D/C noutras bibliotecas
A3LCD_CSSeleção do chip, ativo a nível baixo
A4LCD_RSTReposição, ativo a nível baixo
D2–D7LCD_D2–D7Bits de dados 2 a 7
D8, D9LCD_D0, LCD_D1Bits de dados 0 e 1
D10SD_CSSeleção do chip do microSD
D11SD_DIEntrada de dados do microSD, MOSI
D12SD_DOSaída de dados do microSD, MISO
D13SD_SCKRelógio do microSD
5V, GND5V, GNDAlimentam toda a placa
3.3V3V3Não se sabe a que está ligado; não o usar para alimentar nada

Há duas coisas que apanham muita gente desprevenida. As inscrições estão impressas só no verso, por isso, com o ecrã virado para si, as filas da esquerda e da direita trocam de lado: a ligação faz-se estritamente pelas inscrições, nunca pela posição. E, num Uno, o shield ocupa quase tudo. O que sobra são D0 e D1, que são a porta série, o A5 sem inscrição e os pinos SPI partilhados com o cartão de memória. O I²C desaparece, porque o A4, o SDA do Uno, é o LCD_RST. Por isso, uma estação meteorológica com um par de sensores pede um Mega ou, melhor ainda, uma placa de 32 bits com fios de ligação.

Como fala o barramento de 8 bits

O barramento é do estilo Intel 8080, a que a folha de características do ILI9488 chama DBI Type B. Não tem relógio no sentido do SPI: o anfitrião põe um byte em D0–D7 e dá um impulso em WR, e o painel captura o byte no flanco ascendente. O RS diz o que é o byte: 0 para um comando e 1 para um parâmetro ou dados de píxeis. O CS delimita a transação, o RST repõe o controlador e o RD é o impulso de leitura.

SinalEm repousoFunção
CSAltoBaixo enquanto o anfitrião fala com o painel
RSQualquer0 para um byte de comando, 1 para um parâmetro ou dados de píxeis
WRAltoUm impulso baixo e curto por byte; o painel captura D0–D7 no flanco ascendente
RDAltoNunca pode ficar a flutuar; mantido alto, exceto durante leituras
RSTAltoNível baixo repõe o controlador
D0–D7—Comandadas pelo anfitrião; o painel só as comanda enquanto RD estiver baixo
Diagrama temporal de uma escrita no barramento de 8 bits. O CS desce e fica baixo. Com o RS baixo, o byte 0x2C aparece em D0–D7 e um impulso de WR envia-o. Depois o RS sobe e seguem-se os bytes R, G, B, R, G, B, um impulso de WR para cada um. Um marcador verde assinala cada flanco ascendente de WR, um período de byte está marcado como 50 ns a 20 MHz, e o RD fica alto do princípio ao fim.
Uma transação de escrita: um byte de comando com o RS baixo e, depois, os dados de píxeis com o RS alto. Cada flanco ascendente de WR move um byte.

E o protocolo é só isto. Um comando sai com o RS baixo, e os seus parâmetros seguem com o RS alto. Os píxeis não são diferentes dos parâmetros: depois do comando RAMWR, 0x2C, cada byte enviado com o RS alto vai parar à memória do painel, e o fluxo pode continuar o tempo que o anfitrião quiser.

Desenhar: uma janela e um fluxo

O controlador guarda a imagem inteira na sua própria memória e atualiza o vidro a partir dela sozinho, por isso o anfitrião só envia o que muda. Para desenhar, abre uma janela: o CASET, 0x2A, define a primeira e a última coluna, e o PASET, 0x2B, a primeira e a última linha. Depois do RAMWR, os píxeis preenchem essa janela da esquerda para a direita e de cima para baixo, sem coordenadas pelo meio. Duas funções de barramento, uma para um byte de comando e outra para bytes de dados, são tudo o que é preciso para portar o código:

static void set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
    uint8_t ca[4] = { (uint8_t)(x0 >> 8), (uint8_t)x0,
                      (uint8_t)(x1 >> 8), (uint8_t)x1 };
    uint8_t pa[4] = { (uint8_t)(y0 >> 8), (uint8_t)y0,
                      (uint8_t)(y1 >> 8), (uint8_t)y1 };
    lcd_write_cmd(0x2A); lcd_write_data(ca, 4);   // CASET: columns
    lcd_write_cmd(0x2B); lcd_write_data(pa, 4);   // PASET: rows
}

// A solid rectangle in RGB666: 3 bytes per pixel, one window
static void fill_rect(uint16_t x, uint16_t y, uint16_t w, uint16_t h,
                      uint8_t r, uint8_t g, uint8_t b) {
    const uint8_t px[3] = { r, g, b };
    set_window(x, y, x + w - 1, y + h - 1);
    lcd_write_cmd(0x2C);                           // RAMWR
    for (uint32_t i = 0; i < (uint32_t)w * h; i++) {
        lcd_write_data(px, 3);
    }
}

É na janela que a velocidade se ganha ou se perde. Convém enviar o maior número possível de píxeis dentro de uma só janela: uma janela por píxel custa onze bytes de comandos e coordenadas por cada três bytes de cor.

Formatos de píxel e orientação

Dois registos decidem o aspeto da imagem. O COLMOD, 0x3A, define o formato de píxel. 0x66 é RGB666, três bytes por píxel com a cor nos seis bits superiores de cada byte, e é isso que funciona na nossa placa. 0x55 é RGB565, dois bytes por píxel: as duas folhas de características indicam-no para o barramento paralelo e as bibliotecas populares usam-no aí, mas ainda não o testámos neste exemplar. Se os bytes enviados por píxel não corresponderem ao COLMOD, os preenchimentos sólidos saem como riscas finas de cores erradas que cobrem só parte da janela.

O MADCTL, 0x36, define a orientação e a ordem das cores. Nesta placa, 0x28 dá uma imagem horizontal de 480 × 320 correta e sem espelhamento, e é o bit BGR incluído nesse valor que faz as cores seguirem pela ordem simples R, G, B. O vermelho e o azul trocados corrigem-se com esse bit, o espelhamento com os bits MX e MY e os eixos trocados com o MV, nunca no código da aplicação.

MADCTLImagemNesta placa
0x48Vertical, 320 × 480Valor padrão, não testado
0x28Horizontal, 480 × 320Verificado
0x88Vertical, invertidaNão testado
0xE8Horizontal, invertidaNão testado

ILI9486 ou ILI9488?

Em teoria, o controlador identifica-se: o comando 0xD3 devolve um byte fictício seguido de 0x00, 0x94 e 0x86 ou 0x88. Na prática, muitos shields desta família são só de escrita. Os seus buffers do barramento estão ligados num só sentido, da barra de pinos para o painel, pelo que nada do que o painel diz chega alguma vez ao anfitrião. A popular biblioteca MCUFRIEND_kbv acaba então por ler de volta o seu próprio byte de comando e indica 0xD3D3 como ID; o seu sketch de teste assinala esse caso como um shield só de escrita.

Numa placa assim, o controlador identifica-se a olho. Inicializa-se com a sequência do ILI9488 e desenham-se preenchimentos sólidos, gradientes de cinzento e de cor e uma grelha de um píxel; depois repete-se com a sequência do ILI9486 e fica-se com a que der gradientes suaves, bom contraste e nenhuma cintilação. Não tentámos ler o ID na nossa. Com a sequência do ILI9488 a imagem fica certa, e por isso é essa a sequência que se segue.

A sequência de inicialização do ILI9488 que funciona nesta placa
RST: high 50 ms, low 50 ms, high 150 ms             ; hardware reset
0x01                                                ; SWRESET, wait 120 ms
0x28                                                ; DISPOFF
0xE0: 00 03 09 08 16 0A 3F 78 4C 09 0A 08 16 1A 0F  ; positive gamma
0xE1: 00 16 19 03 0F 05 32 45 46 04 0E 0D 35 37 0F  ; negative gamma
0xC0: 17 15                                         ; power control 1
0xC1: 41                                            ; power control 2
0xC5: 00 12 80                                      ; VCOM control
0x36: 48                                            ; MADCTL: portrait, BGR
0x3A: 66                                            ; COLMOD: RGB666
0xB0: 00                                            ; interface mode
0xB1: A0                                            ; frame rate
0xB4: 02                                            ; inversion control
0xB6: 02 02 3B                                      ; display function
0xB7: C6                                            ; entry mode
0xF7: A9 51 2C 82                                   ; adjust control 3
0x11                                                ; SLPOUT, wait 120 ms
0x29                                                ; DISPON, wait 25 ms
0x36: 28                                            ; MADCTL: landscape

Cada linha é um comando seguido dos seus bytes de parâmetros. Com o COLMOD a 0x55 em vez de 0x66, o painel esperaria RGB565, que ainda não testámos. Os valores dos registos coincidem com os do driver ILI9488 do TFT_eSPI, exceto que a biblioteca escolhe 0x55 para barramentos paralelos. A alternativa para o ILI9486 está no guia de programação no fim do artigo.

De onde vem a velocidade

O SPI move um bit por ciclo de relógio. O barramento de 8 bits move um byte. Com o mesmo relógio, são oito vezes mais dados, e é só por isso que esta interface antiquada ainda anda por aí: precisa de treze pinos em vez de quatro ou cinco, mas preenche um ecrã grande numa fração do tempo.

Em cima: duas linhas temporais partilham oito ciclos de relógio; no SPI transportam os oito bits de um byte, no barramento de 8 bits oito bytes inteiros. Em baixo: um gráfico de barras do tempo que uma imagem completa de 480 por 320 passa no barramento: 184 ms por SPI a 20 MHz, 92 ms por SPI a 40 MHz, 23 ms pelo barramento de 8 bits a 20 MHz com três bytes por píxel e 15,4 ms com dois. Uma linha vertical marca os 40 ms.
Com o mesmo relógio, o barramento de 8 bits move oito vezes mais dados. As barras vêm da aritmética; das quatro, só a configuração de 23 ms correu na nossa placa.

Nesta família de controladores em particular, o SPI tem ainda outra desvantagem. Por SPI, o ILI9486 só aceita cor completa em formato de 18 bits, e, embora a folha de características do ILI9488 indique cor de 16 bits para o seu modo SPI de 4 fios, na prática estes chips são comandados com três bytes por píxel, que é exatamente o que fazem as bibliotecas populares. A mesma folha de características limita a 20 MHz o relógio de escrita SPI do ILI9488. O seu barramento paralelo admite um ciclo de escrita de 40 ns, ou seja, 25 MHz, pelo que os nossos 20 MHz ficam dentro da especificação. O ILI9486 é mais lento: a sua folha de características exige pelo menos 66 ns por escrita, cerca de 15 MHz. Se a sua placa tiver afinal esse chip, convém começar abaixo desse valor.

O barramento, porém, só é tão rápido quanto o anfitrião que o comanda. Alternar treze pinos um a um com digitalWrite() transforma a interface mais rápida da placa numa das mais lentas. Escrever registos de porta inteiros é muito melhor, e um periférico por hardware com DMA é o melhor de tudo: o LCD_CAM de um ESP32-S3, o PIO de um RP2040 ou o FSMC de um STM32 enviam os bytes sozinhos enquanto o processador prepara os seguintes.

O nosso teste: vídeo a 25 fps a partir de um cartão microSD

O anfitrião foi a ESP32-S3-CAM N16R8 do nosso artigo anterior, ligada ao shield com fios de ligação. Nessa placa, as 13 linhas do barramento ficaram com GPIO que normalmente são da câmara, pelo que a câmara ficou de fora deste teste. O barramento funcionou com o driver esp_lcd i80 do ESP-IDF, no periférico LCD_CAM do S3, com um relógio de escrita de 20 MHz, a sequência do ILI9488, RGB666 e orientação horizontal. Dois buffers de DMA de 30 720 bytes, que chegam para 10 240 píxeis cada um, revezam-se: enquanto um segue a caminho do painel, o outro vai sendo preenchido.

O leitor reparte o trabalho pelos dois núcleos. Um lê ficheiros MJPEG do cartão microSD da própria placa; o outro descodifica cada fotograma com a biblioteca JPEGDEC e empurra os blocos descodificados diretamente para os buffers de DMA, convertendo RGB565 em RGB666 pelo caminho. O resultado é vídeo estável de 480 × 320 em ecrã inteiro a 25 fotogramas por segundo. Dos 40 ms de que cada fotograma dispõe, o barramento gasta 23. Por SPI em overclock a 40 MHz, o mesmo fotograma precisaria de 92 ms só no barramento, pelo que os 25 fps ficariam fora de alcance antes de se descodificar um único píxel.

O nosso teste em vídeo. A ESP32-S3-CAM N16R8, na placa de ensaio em baixo, comanda o shield através de uma fita de fios de ligação e reproduz clipes MJPEG de 480 × 320 a partir do seu cartão microSD a 25 fps. O pequeno ecrã à direita pertence a outra placa. 33 segundos, sem som.

Configurar o barramento exige duas estruturas. É assim que o nosso driver o faz. O RD não entra de todo: o esp_lcd não tem caminho de leitura, por isso um GPIO comum limita-se a manter o RD a nível alto.

esp_lcd_i80_bus_config_t bus_config = {};
bus_config.dc_gpio_num = PIN_LCD_RS;
bus_config.wr_gpio_num = PIN_LCD_WR;
bus_config.clk_src = LCD_CLK_SRC_PLL160M;
bus_config.data_gpio_nums[0] = PIN_LCD_D0;     // likewise [1] to [7]
bus_config.bus_width = 8;
// One DMA chunk: 32 lines of 320 pixels in RGB666
bus_config.max_transfer_bytes = 320 * 32 * 3;
esp_lcd_new_i80_bus(&bus_config, &i80_bus);

esp_lcd_panel_io_i80_config_t io_config = {};
io_config.cs_gpio_num = PIN_LCD_CS;
io_config.pclk_hz = 20 * 1000 * 1000;          // 20 MHz write clock
io_config.trans_queue_depth = 10;
io_config.lcd_cmd_bits = 8;
io_config.lcd_param_bits = 8;
io_config.dc_levels.dc_cmd_level = 0;          // RS low: command
io_config.dc_levels.dc_data_level = 1;         // RS high: data
esp_lcd_new_panel_io_i80(i80_bus, &io_config, &io_handle);

A partir daí, esp_lcd_panel_io_tx_param() envia comandos com os seus parâmetros e esp_lcd_panel_io_tx_color() coloca dados de píxeis na fila do DMA e regressa de imediato. É também aí que está a armadilha: um buffer não pode voltar a ser preenchido antes de a sua transferência terminar, senão saem blocos da imagem corrompidos.

Restam dois limites. Com as definições habituais, o controlador atualiza o vidro a partir da sua memória cerca de 60 vezes por segundo, e o shield não leva aos pinos o sinal de tearing effect que permitiria ao anfitrião sincronizar as escritas com essa atualização, pelo que um movimento rápido pode mostrar uma linha de corte. E um buffer de imagem completo, 460 800 bytes em RGB666, só cabe em PSRAM externa, e é por isso que o nosso driver envia antes pequenos blocos a partir da memória interna.

Que anfitrião, que biblioteca

O shield foi desenhado para o Uno, mas o Uno é a casa mais lenta que pode ter. A tabela resume os caminhos habituais; o guia de programação no fim tem as restrições de pinos de cada um.

AnfitriãoCaminhoCuidados
Arduino UnoEncaixa. MCUFRIEND_kbv com Adafruit_GFX, mais Adafruit TouchScreen para a película2 KB de SRAM: sem buffer de imagem, as imagens vão sendo lidas do cartão. O byte de dados está repartido por duas portas, o que custa tempo
Arduino MegaEncaixa. MCUFRIEND_kbvOs pinos do Uno caem em portas dispersas do Mega, um mapeamento mais lento do que no Uno; memória e pinos de sobra
ESP32esp_lcd i80 através do I2S, LovyanGFX, TFT_eSPIOs GPIO34–39 são só de entrada. Placas em formato Uno, como a Wemos D1 R32, põem neles LCD_RS, LCD_CS e LCD_RST, e esses três têm de ser religados
ESP32-S3esp_lcd i80 no LCD_CAM com DMA, como no nosso teste; o LovyanGFX e o Arduino_GFX também usam o LCD_CAMQualquer GPIO pode levar qualquer sinal. O TFT_eSPI também funciona, mas no S3 alterna os registos GPIO sem DMA
RP2040TFT_eSPI com PIO e DMAD0–D7 têm de ficar em GPIO consecutivos
STM32FSMC ou FMC em modo 8080, onde o encapsulamento o permita; caso contrário, escrita nas portasOs pinos do FSMC são fixos para cada encapsulamento

Seja qual for o anfitrião, convém planear os pinos a pensar no toque: a película partilha linhas com o ecrã, e os seus terminais analógicos precisam de pinos com ADC. Mais sobre isso adiante.

Num Uno, o arranque mais rápido é com o MCUFRIEND_kbv. Nós próprios não corremos este sketch num Uno: é o caminho habitual da biblioteca, com um acrescento para placas só de escrita.

#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>

MCUFRIEND_kbv tft;

void setup() {
  Serial.begin(9600);
  uint16_t id = tft.readID();
  Serial.print(F("ID = 0x"));
  Serial.println(id, HEX);
  // A write-only shield reads back 0xD3D3: name the controller yourself
  if (id == 0xD3D3) id = 0x9488;
  tft.begin(id);
  tft.setRotation(1);              // landscape, 480 × 320
  tft.fillScreen(0x0000);          // black
  tft.setTextColor(0x07E0);        // green
  tft.setTextSize(3);
  tft.setCursor(24, 24);
  tft.print(F("Hello, 480 x 320"));
}

void loop() {}

Toque sem controlador tátil

A película tátil é do tipo resistivo clássico de 4 fios: duas camadas resistivas que se tocam onde se carrega. Não há nenhum XPT2046 ou chip semelhante para a ler. Em vez disso, os seus quatro elétrodos estão ligados a linhas que o ecrã já usa, e o anfitrião mede-os com o seu próprio ADC. Aplica uma tensão a uma das camadas e lê o ponto em que a outra camada lhe toca; depois troca os papéis para o outro eixo.

As linhas que levam os elétrodos variam de placa para placa, e na nossa ainda não as identificámos. Nos shields desta família, os terminais analógicos costumam estar em LCD_WR, LCD_RS ou LCD_CS, e os digitais em linhas de dados como LCD_D6 e LCD_D7. Um multímetro encontra-os num minuto: com a placa sem alimentação, dois pares entre as linhas de controlo e as linhas de dados medem algumas centenas de ohms, cerca de 300 numa camada e 500 na outra.

Ler o toque significa então pedir esses pinos emprestados ao ecrã. Espera-se até o barramento estar em repouso, mantém-se inativa a linha de controlo que não é elétrodo, para que o painel ignore o ruído, recolhem-se várias amostras e devolve-se cada pino ao seu papel no ecrã antes da transferência seguinte. Sem este último passo, o resultado são píxeis aleatórios e um ecrã congelado. Com um periférico por hardware como o LCD_CAM é ainda mais difícil, porque os pinos têm de ser libertados do periférico e voltar a ser associados a ele, por isso convém decidir como se vai ler o toque antes de fixar o mapa de pinos. A película também prefere alvos grandes: botões do tamanho da ponta de um dedo servem-lhe muito melhor do que uma interface ao estilo de um telemóvel.

microSD, alimentação e retroiluminação

A ranhura microSD tem as suas próprias linhas SPI, SD_CS, SD_DI, SD_DO e SD_SCK, nos pinos D10 a D13 do Uno, eletricamente separadas do barramento do ecrã. Em qualquer outro anfitrião, pode ir para quaisquer pinos com SPI. Não a testámos neste exemplar: para o vídeo acima, o ESP32-S3 leu a ranhura da sua própria placa. Se não for usada, deixam-se as suas linhas desligadas ou mantém-se o SD_CS a nível alto.

A alimentação entra como 5 V no pino 5V. O regulador da placa produz 3,3 V para o painel e para os buffers, e um anfitrião de 3,3 V comanda a lógica diretamente. O pino 3V3 é para deixar em paz: não se sabe a que está ligado, e não substitui a alimentação de 5 V. A retroiluminação não tem pino de controlo e fica acesa enquanto a placa tiver alimentação, pelo que não pode ser regulada nem desligada por software; DISPOFF e SLPIN apagam a imagem, não a luz. Não medimos a corrente. Como referência aproximada, a especificação do painel de um shield Uno semelhante de 3,5 polegadas indica 90 mA típicos para a sua retroiluminação de seis LED, pelo que uma alimentação USB fraca ou o pequeno regulador de uma placa de desenvolvimento merecem ser verificados com um amperímetro.

O que construir com ele

480 × 320 é um tamanho confortável: grande o bastante para um gráfico com legendas legíveis, uma fotografia ou uma fila de botões do tamanho da ponta de um dedo, e pequeno o bastante para se preencher depressa. É por isso que esta classe de ecrã aparece constantemente em projetos, tanto neste mesmo shield como nos seus parentes.

Quatro interfaces desenhadas a 480 por 320. Um ecrã meteorológico escuro com 18 graus, parcialmente nublado, humidade de 64 %, pressão de 1014 hPa, vento de 3 m/s e um gráfico da temperatura em 24 horas. Uma imagem de um lago de montanha com os pontos do diaporama. Um painel tátil claro com seis botões grandes para as luzes, o aquecimento, a ventoinha, a impressora 3D, a porta de entrada e uma cena para o serão. Um ecrã de osciloscópio com uma grelha, uma onda sinusoidal e uma onda quadrada.
Quatro tarefas que o ecrã faz bem, desenhadas na sua resolução real de 480 × 320.

1. Uma estação meteorológica

A montagem mais popular de todas. No projeto do Instructables Second Multi-functional Weather Station, um Arduino Mega leva exatamente este tipo de shield ILI9486 de 3,5 polegadas, juntamente com um relógio DS3231 e sensores DHT22 e BMP280, e usa a ranhura de cartão do shield para um álbum de cerca de mil fotografias convertidas para BMP. Outras montagens dispensam por completo os sensores. No blogue thesolaruniverse, um ESP32 com um shield de 3,95 polegadas do mesmo desenho vai buscar o estado do tempo ao OpenWeatherMap por Wi‑Fi e desenha-o através do barramento de 8 bits com o TFT_eSPI. Um projeto da Elektor de dezembro de 2023 faz o mesmo numa placa Makerfabs ESP32-S3 com um ILI9488 de 3,5 polegadas e lê as definições de Wi‑Fi e a cidade de um ficheiro no cartão de memória.

2. Uma moldura digital

A ranhura microSD faz do shield uma moldura quase por si só. O MCUFRIEND_kbv traz um exemplo showBMP que lê ficheiros BMP diretamente do cartão nos pinos 10 a 13 e indica quanto tempo cada um demorou a carregar. Num ESP32, o driver esp-idf-parallel-tft de nopnop2002 mostra ficheiros BMP, JPEG e PNG em shields desta família e também calibra a sua película tátil. É nas transições, como esbatimentos e cortinas, que o barramento paralelo compensa: cada passo de uma transição redesenha o ecrã inteiro, e uma imagem completa custa 23 ms neste barramento, contra um décimo de segundo ou mais por SPI.

3. Um leitor de vídeo

O nosso próprio teste fica no extremo mais pesado: MJPEG de um cartão a 25 fps. Como ponto de partida já feito, os exemplos MJPEG da biblioteca Arduino_GFX mostram a taxa média de fotogramas e repartem o tempo entre leitura, descodificação e desenho, o que os torna uma boa referência de desempenho para qualquer placa. Larry Bank, o autor do JPEGDEC, o descodificador que o nosso leitor usa, comandou um velho shield Uno ILI9486 de 3,5 polegadas a partir de um RP2040 através de PIO e DMA e reproduziu nele GIF animados; o seu artigo chama-se Breathing new life into an old LCD shield.

4. Uma consola de jogos

Os jogos precisam exatamente daquilo em que este barramento é bom: redesenhar muitos píxeis muitas vezes por segundo. O projeto ESP32-S3_Uno-nofrendo corre o emulador de NES nofrendo numa placa ESP32-S3 em formato Uno, com um shield ILI9488 de 8 bits encaixado diretamente, e carrega as ROM a partir do cartão; ainda não tem joystick nem som. No extremo mais simples, um clone do Tetris para Arduino Mega com um shield ILI9486 vai buscar a música a um transmissor FM de automóvel, e para a ouvir sintoniza-se um rádio nos 87,5 MHz. A série de tutoriais da Dumblebots constrói um programa de desenho ao estilo do Paint e um jogo do galo no mesmo tipo de shield de 3,5 polegadas, com película tátil incluída.

5. Um painel tátil na parede

Um painel de casa inteligente é a utilização óbvia para um ecrã tátil deste tamanho, e aqui os parentes já prontos costumam ganhar. O WT32-SC01 Plus junta um ESP32-S3 a um ecrã de 3,5 polegadas e 480 × 320 no mesmo tipo de barramento de 8 bits. O openHASP transforma-o num painel controlado por MQTT e construído sobre LVGL, e, com um componente da comunidade, o ESPHome pode comandá-lo para o Home Assistant. O AirQualitySensor-IDF transforma a mesma placa num monitor da qualidade do ar: lê sensores de partículas, CO₂, temperatura e humidade e desenha seis horas de histórico com LVGL. Quem tem uma impressora 3D pode já ter um ecrã desta classe: o Color UI do Marlin corre em ecrãs táteis de 3,5 polegadas e 480 × 320, como o MKS TFT35, ligados ao STM32 da impressora pelo barramento paralelo FSMC.

6. Instrumentos

O traço de um osciloscópio tem de ser redesenhado muitas vezes por segundo, o que convém a um barramento rápido. Um projeto aberto junta um STM32F303 a um ecrã ILI9486 de 3,5 polegadas para fazer um osciloscópio de 2 Msps com um registo de 4096 pontos. O DLO-138, firmware aberto para o popular kit DSO-138, comanda o ILI9341, mais pequeno, desse kit por um barramento de 8 bits e transforma-o num osciloscópio de dois canais com mais dois canais digitais. Para mostradores, medidores e gráficos, o TFT_eSPI tem uma pasta inteira de exemplos escritos para 480 × 320.

Mais algumas ideias que outros já puseram em prática com ecrãs de 480 × 320:

Parentes: o mesmo ecrã noutros formatos

O shield pertence a uma grande família. Se o seu formato ou o seu barramento não servirem para um projeto, talvez sirva um dos seus parentes. Todos têm 480 × 320, exceto os shields Uno mais pequenos:

EcrãChip e barramentoA saber
Shields Uno de 2,4 e 2,8 polegadasILI9341 e outros; paralelo de 8 bitsA mesma pinagem e as mesmas bibliotecas, a 240 × 320
Módulos SPI de 3,5 polegadas, como o MSP3520ILI9488; SPI de 4 fiosPoucos pinos, toque nas suas próprias linhas SPI, três bytes por píxel
Shields Uno de 3,95 polegadasILI9486 e outros; paralelo de 8 bitsVidro maior, as mesmas ligações
WT32-SC01 PlusST7796; paralelo de 8 bits, ESP32-S3 na placaUm painel acabado para openHASP, ESPHome e LVGL
Makerfabs ESP32-S3 Parallel TFT, 3,5 polegadasILI9488; paralelo de 16 bits, ESP32-S3 na placaO dobro da largura de barramento
ESP32-3248S035, o Cheap Yellow Display de 3,5 polegadasST7796; SPI, ESP32 na placaCompleto e barato, mas SPI
MKS TFT35ILI9488 ou ST7796; paralelo FSMCO ecrã tátil de muitas impressoras 3D

Pontos fortes e fracos

A favorContra
Encaixa diretamente num Uno ou num MegaNum Uno ocupa quase todos os pinos, incluindo os do I²C
480 × 320 com toque e microSD numa só placaILI9486 ou ILI9488: a placa não diz qual, e pode ser só de escrita
Um barramento de 8 bits: uma imagem completa em 23 ms a 20 MHz, frequência verificadaTreze fios de sinal em qualquer anfitrião onde não encaixe
Funciona com anfitriões de 3,3 V: ESP32, RP2040, STM32Sem um periférico de barramento por hardware, perde-se a maior parte da velocidade
Vídeo em ecrã inteiro a 25 fps a partir de um ESP32-S3Sem sinal de tearing effect nos pinos
Toque sem chip extraA película tátil partilha pinos com o ecrã e precisa do ADC do anfitrião
Uma ranhura microSD em linhas SPI separadasA retroiluminação está sempre acesa, sem forma de a regular

Conclusão

O shield TFT LCD de 3,5 polegadas parece uma relíquia da era do Arduino Uno, e num Uno comporta-se como tal: ocupa quase todos os pinos e preenche o ecrã ao ritmo de um processador de 8 bits. Mas, com um anfitrião que tenha um verdadeiro periférico paralelo, o velho barramento mostra porque sobreviveu: um byte por ciclo de relógio, uma imagem completa de 480 × 320 em 23 ms, vídeo a 25 fps.

Para uma estação meteorológica, uma moldura digital, um painel de controlo ou um pequeno instrumento, isso chega e sobra, desde que o primeiro arranque parta de uma configuração comprovada:

  1. Verificar se há curto-circuitos entre 5V, 3V3 e GND e, depois, ligar primeiro o GND e os 5 V ao pino 5V.
  2. Ligar pelas inscrições do verso, nunca pela posição, e manter o LCD_RD a nível alto desde o início.
  3. Usar a sequência do ILI9488, COLMOD 0x66 e MADCTL 0x28 a 10 MHz ou menos.
  4. Desenhar primeiro preenchimentos sólidos e gradientes; se a imagem sair desbotada ou cintilar, experimentar a sequência do ILI9486.
  5. Subir o relógio passo a passo, até 20 MHz num ILI9488.
  6. Acrescentar a película tátil e o cartão microSD no fim, um de cada vez.

Tudo o que ficou dito acima e mais, num único ficheiro: o guia de programação deste shield. A pinagem pelas inscrições, a temporização do barramento e os limites das folhas de características, as sequências de inicialização dos dois controladores, os formatos de píxel, a rotação, o toque e o microSD, um procedimento de primeiro arranque e um guia de avarias, com cada afirmação marcada como verificada, provável ou desconhecida. Convém entregá-lo a um agente de programação antes de ele escrever uma única linha de código do driver.