Exibindo imagens em um display TFT com Raspberry Pi Pico Deixe um comentário

Os displays TFT possibilitam a exibição de textos e imagens coloridas com controle através de plataformas como Arduino. Neste artigo, é mostrada a programação MicroPython com uso de biblioteca para exibição de imagens em display TFT em uma Raspberry Pi Pico.

Display TFT e Raspberry Pi Pico
Display TFT e Raspberry Pi Pico

Display TFT e Raspberry Pi Pico

A Raspberry Pi Pico é uma plataforma bastante versátil, principalmente tratando-se de como é programada: através de C, Wiring, MicroPython ou CircuitPython. O MicroPython tem despontado como uma opção bastante interessante, pois o Python tem sido porta de entrada para iniciantes em programação, ou programadores mais experientes podem ter mais facilidade em ingressar no mundo do hardware através desta linguagem.

O display utilizado neste artigo é o TFT, que possui comunicação via SPI. Este protocolo permite o seu uso conectado a diversos tipos de plataformas, como o Arduino. Se quiser apreder como utiliza-lo no Arduino, confira nosso artigo: Como utilizar o display IPS LCD 0.96″ colorido

O experimento de hoje traz o uso de imagens externas a serem exibidas no display.

Materiais necessários

Montagem do circuito do display IPS LCD 1.44″ colorido

Faremos o circuito conforme mostrado na figura abaixo:

Esquemático - Display e Raspberry Pi Pico
Esquemático – Display TFT e Raspberry Pi Pico

Onde:

 

Raspberry Pi Pico Display
GND GND
VBUS VCC
GP10 SCL (ou SCK)
GP11 SDA (ou MOSI)
GP17 RES (ou RST)
GP16 DC
GP18 CS
3V3 BL (Backlight)

Instalação de biblioteca

A Raspberry Pi Pico deve estar preparada para receber arquivos em MicroPython. Veja os primeiros passos para deixar sua placa pronta para uso neste artigo aqui, na seção Primeiros passos com a Raspberry Pi Pico e MicroPython.
Faremos uso da biblioteca ST7735.py, que deve estar dentro da memória da Pico. Abra o Thonny IDE e copie o código a seguir disponível no GitHub.

https://github.com/boochow/MicroPython-ST7735/blob/master/ST7735.py

Verifique o interpretador do Thonny IDE, clicando no rodapé direto: Se estiver a opção MicroPython (Raspberry Pi Pico), clique para habilitar. Senão, clique em Configurar interpretador… e escolha esta opção.

Se tudo estiver correto e a placa configurada para receber códigos em MicroPyhon, você verá o prompt habilitado e a placa no rodapé direito.

Salve o código da biblioteca usando o menu Arquivo (File) => Salvar (save). Será aberta uma janela como mostrada a seguir:

Escolha a opção Raspberry Pi Pico. Salve com o mesmo nome e extensão *.py, para não perder as propriedades da biblioteca.

Importando a imagem na memória da Raspberry Pi Pico

Os arquivos para visualização no display devem estar em formato BMP (bitmap) e não podem ter uma resolução alta, além de respeitar o tamanho do display. Neste caso, o display possui 128 x 128 pixels, a imagem utilizada deve ser redimensionada previamente com 128 x 128 pixels. Utilizei o GIMP para redimensionar a imagem (aqui um breve tutorial).

Logo MakerHero
Logo MakerHero

A imagem precisa estar salva na memória da Raspberry Pi Pico. Para isto, acesse o menu Visualizar => Arquivos. Será mostrada na lateral as pastas referentes ao computador (acima) e à Raspberry Pi Pico (abaixo). Navegue nas pastas do computador até encontrar a imagem a ser exibida no display.

Ao encontrar o arquivo, clique com o botão direito sobre ele e escolha a opção “Enviar para /”. Será enviada uma cópia da imagem para a memória da Pico. O arquivo será mostrado na navegação na parte inferior.
Código
Este código é uma adaptação do original escrito por Adafruit e Stechiez. Realiza testes gráficos com várias cores, além de testes de escrita e a exibição da imagem.

# Código original por Stechiez (29-06-2021) e Adafruit
# Modificado por Gedeane Kenshima

# Bibliotecas
from ST7735 import TFT,TFTColor
from sysfont import sysfont
import time
import math
from machine import SPI,Pin
# Configurações SPI
spi = SPI(1, baudrate=20000000, polarity=0, phase=0,
          sck=Pin(10), mosi=Pin(11), miso=None)
tft=TFT(spi,16,17,18)

#Iniciação do display
tft.initr()
tft.rgb(True)
tft.fill(TFT.BLACK)
# Rotação (de 0 a 3)
tft.rotation(2)

def figura():
    # Fundo preto
    tft.fill(TFT.BLACK)
    # Arquivo da figura
    f=open('MakerHero.bmp', 'rb')
    if f.read(2) == b'BM':  #header
        dummy = f.read(8) #file size(4), creator bytes(4)
        offset = int.from_bytes(f.read(4), 'little')
        hdrsize = int.from_bytes(f.read(4), 'little')
        width = int.from_bytes(f.read(4), 'little')
        height = int.from_bytes(f.read(4), 'little')
        if int.from_bytes(f.read(2), 'little') == 1: #planes must be 1
            depth = int.from_bytes(f.read(2), 'little')
            if depth == 24 and int.from_bytes(f.read(4), 'little') == 0:#compress method == uncompressed
                print("Image size:", width, "x", height)
                rowsize = (width * 3 + 3) & ~3
                if height < 0:
                    height = -height
                    flip = False
                else:
                    flip = True
                w, h = width, height
                if w > 128: w = 128
                if h > 128: h = 128
                tft._setwindowloc((0,0),(w - 1,h - 1))
                for row in range(h):
                    if flip:
                        pos = offset + (height - 1 - row) * rowsize
                    else:
                        pos = offset + row * rowsize
                    if f.tell() != pos:
                        dummy = f.seek(pos)
                    for col in range(w):
                        bgr = f.read(3)
                        tft._pushcolor(TFTColor(bgr[2],bgr[1],bgr[0]))
    spi.deinit()

# Teste de linhas
def testlines(color):
    tft.fill(TFT.BLACK)
    for x in range(0, tft.size()[0], 6):
        tft.line((0,0),(x, tft.size()[1] - 1), color)
    for y in range(0, tft.size()[1], 6):
        tft.line((0,0),(tft.size()[0] - 1, y), color)

    tft.fill(TFT.BLACK)
    for x in range(0, tft.size()[0], 6):
        tft.line((tft.size()[0] - 1, 0), (x, tft.size()[1] - 1), color)
    for y in range(0, tft.size()[1], 6):
        tft.line((tft.size()[0] - 1, 0), (0, y), color)
        
# Função padrão
def test_main():
    new_line = '\n'
    tft.fill(TFT.BLACK)
    # Mensagens no display com tamanhos e cores diferentes
    tft.text((0, 4), "Raspberry Pi", TFT.WHITE, sysfont, 1)
    tft.text((0, 15), "Pico no display", TFT.YELLOW, sysfont, 2)
    tft.text((0, 60), "TFT", TFT.BLUE, sysfont, 3)
    time.sleep_ms(1000)
   

while True:
    # Padrão inicial
    test_main()
    # Aguarda 500 ms
    time.sleep_ms(500)
    # Exibe figura
    figura()
    # Aguarda 1s
    time.sleep_ms(1000)
    # Exibe animação com linhas vermelhas
    testlines(TFT.RED)
    # Aguarda 500 ms
    time.sleep_ms(500)

Execute o código na sua Raspberry Pi Pico. As imagens do display devem aparecer como mostrado a seguir.

Funcionamento do Projeto - Display TFT e Raspberry Pi Pico
Funcionamento do Projeto – Display TFT e Raspberry Pi Pico

Você pode realizar alterações nas cores das linhas (testlines(TFT.RED)), substituindo RED por outra cor em inglês, além de personalizar o texto, seu tamnho, cores e a imagem de exibição.
Gostou de conhecer o display IPS LCD e como exibir nele imagens usando a Raspberry Pi Pico? Amplia muito as possibilidades de uso desta plataforma, além de poder exibir imagens personalizadas em seus projetos!

Deixe seu comentário logo abaixo se gostou do artigo. E considere nos seguir no Instagram =)

E se quiser aprender mais sobre MicroPython, confira nosso curso Curso de Programação em MicroPython com Raspberry Pi,

Faça seu comentário

Acesse sua conta e participe