Manual
do
Maker
.
com
Tudo o que eu tinha pra falar de bom desse display já está nesse artigo do display e-paper com esp32. Esse display é tudo de bom, o problema é que deixa o maker viciado, mas a culpa é da Saravati, que fica trazendo essas jóias de e-ink e ESP32 diferentes para tentar os desenvolvedores.
No artigo de hoje veremos como configurar esse display e-paper no Raspberry Pi, de modo simples e rápido. Aliás, só não poderia deixar de fazê-lo porque prometi no artigo anterior uma série, mas é tão fácil que dá até vergonha de escrever a respeito.
Esse display está disponível em nosso parceiro Saravati, que você pode acessar clicando no link do produto. A compra é recomendada, principalmente para pagamento à vista.
O driver para o display e-paper pode ser pego em meu repositório no github. Renomeei as pastas que estavam em chinês, falta traduzir os documentos, mas sinceramente, já escrevi no artigo anterior tudo relacionado ao que está no documento. E antes que alguém ache que sou chinês, não; Djames Suhanko é húngaro.
Será necessário instalar essa biblioteca, que você encontra aqui.
Agora, temos que conectar o display ao Raspberry. Não é das tarefas mais simples; tem o pino físico, o BCM e o WiringPi. Fora isso, os pinos são todos misturados, uma loucura!
Mas fazendo 10 vezes, acaba dando certo, só não erre 3V3 e GND.
Agora, vamos à receita. Primeiramente, execute o comando:
sudo raspi-config
Vá ao ítem 5 do menu (Interfacing Options) e habilite o SPI. Quando finalizar, reinicie.
Baixe a biblioteca BCM2835 recém baixada. Entre no diretório e siga o processo padrão:
./configure
make
sudo make install
Agora, entre no diretório raspberry/bcm2835 e digite:
make clean
make
./epd
Pronto! Só um detalhe, o programa precisa ser executado como root, senão dá falha de segmentação. O programa de exemplo é ótimo, mas não tem tratamento de exceção, portanto, isso fica por sua conta.
Acima, foi feita a compilação do código de exemplo. É bem fácil manipular esse display, basta fazer uma cópia de backup do main.cpp e modificar o original. Apenas para apreciação:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "epd1in54.h"
#include "epdpaint.h"
#include "imagedata.h"
#define COLORED 0
#define UNCOLORED 1
int main(void)
{
time_t now;
struct tm* timenow;
Epd epd;
if (epd.Init(lut_full_update) != 0) {
printf("e-Paper init failed\n");
return -1;
}
unsigned char* frame_buffer = (unsigned char*)malloc(epd.width / 8 * epd.height);
Paint paint(frame_buffer, epd.width, epd.height);
paint.Clear(UNCOLORED);
/* For simplicity, the arguments are explicit numerical coordinates */
/* Write strings to the buffer */
paint.DrawFilledRectangle(0, 10, 200, 34, COLORED);
paint.DrawStringAt(30, 14, "DobitAoByte", &Font16, UNCOLORED);
paint.DrawStringAt(30, 34, " RPi e-ink ", &Font16, COLORED);
/* Draw something to the frame_buffer */
paint.DrawRectangle(16, 60, 56, 110, COLORED);
paint.DrawLine(16, 60, 56, 110, COLORED);
paint.DrawLine(56, 60, 16, 110, COLORED);
paint.DrawCircle(120, 90, 30, COLORED);
paint.DrawFilledRectangle(16, 130, 56, 180, COLORED);
paint.DrawFilledCircle(120, 160, 30, COLORED);
/* Display the frame_buffer */
epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
epd.DelayMs(2000);
if (epd.Init(lut_partial_update) != 0) {
printf("e-Paper init failed\n");
return -1;
}
/**
* there are 2 memory areas embedded in the e-paper display
* and once the display is refreshed, the memory area will be auto-toggled,
* i.e. the next action of SetFrameMemory will set the other memory area
* therefore you have to set the frame memory and refresh the display twice.
*/
epd.SetFrameMemory(IMAGE_DATA, 0, 0, epd.width, epd.height);
epd.DisplayFrame();
epd.SetFrameMemory(IMAGE_DATA, 0, 0, epd.width, epd.height);
epd.DisplayFrame();
char time_string[] = {'0', '0', ':', '0', '0', '\0'};
while (1) {
time(&now);
timenow = localtime(&now);
time_string[0] = timenow->tm_min / 10 + '0';
time_string[1] = timenow->tm_min % 10 + '0';
time_string[3] = timenow->tm_sec / 10 + '0';
time_string[4] = timenow->tm_sec % 10 + '0';
paint.SetWidth(32);
paint.SetHeight(96);
paint.SetRotate(ROTATE_270);
paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 4, time_string, &Font24, COLORED);
epd.SetFrameMemory(paint.GetImage(), 80, 72, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
epd.DelayMs(500);
}
return 0;
}
Fiz um curso pequeno de Raspberry, abordando os temas fundamentais para sair do zero e terminar com o backup de um sistema personalizado e replicável; o curso não fará de você um hacker, mas o intuito é que não precise utilizar tutoriais cada vez que for dar um passo com o Raspberry. O curso tem apenas 16 aulas, indo da instalação básica em Linux ou Windows, depois o resto é mão-na-massa pelo console, nada de desktop.
Abordo personalização, comandos do shell, shell script básico, GPIO com shell script abordando a maioria dos conceitos, uma introdução (com exemplo funcional) em C e Python para manipular os GPIO, bitwise com expansor de IO, proteção do sistema contra corrupção do sistema de arquivos, backup etc.
Coloquei o preço mais baixo da Udemy, mas ainda assim estava acima do que eu esperava cobrar, por isso utilize o cupom de desconto DOBITAOBYTE para obter o melhor preço - esse sim, o que era pretendido. Não que eu ache que venderei tanto, mas coloquei 200 cumpons.
Ficarei feliz por sua aquisição, espero encontrá-lo por lá!
Já nos próximos dias o curso deve ser aprovado pela Udemy, aí escrevo um artigo e passo o link. Separem 20 mangos aí!
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.