Placarduino++: adicionando um display maior para exibir mais informações

Featured image

Com várias ideias para o projeto do Placarduino, o display de 16x2 não será suficiente para exibir todas as informações. E além disso, da forma como o display está montado hoje, são utilizados muitos pinos do Arduino, que poderiam ser aproveitados para outras funções. Então, nesse post, eu vou mostrar como eu fiz a substituição do display 16x2 por um display 20x4 com um módulo adaptador I²C.


Antes de mais nada: a escolha do display. Eu utilizei um LCD que já veio com o controlador I²C soldado na parte de trás do display. Existe a possibilidade de comprar apenas o módulo adaptador e soldar ao display ou montar em uma protoboard.

Apenas para deixar claro: eu estou trocando o tamanho do display e também adicionando o controlador I²C ao mesmo tempo por conveniência. Isso não significa que o display 20x4 sempre deve ser utilizado com I²C: você pode utilizar o display 20x4 ligado diretamente ao Arduino como foi feito antes com o display 16x2, e também pode utilizar o controlador I²C com o display 16x2.

Utilizando um controlador I²C para ligar o LCD é possível reduzir consideravelmente os pinos utilizados: sem ele são necessários 6 pinos digitais do Arduino; com ele são apenas 2 pinos analógicos.

O I²C (sigla de Inter-Integrated Circuit) é um barramento com comunicação serial que utiliza apenas duas linhas: uma para o clock (SCL - Serial Clock) e outra para os dados seriais (SDA - Serial Data). Vários periféricos podem ser conectados ao mesmo tempo no barramento, mas sempre deve existir um nodo master para gerar o clock e controlar a comunicação. Os outros nodos são os slaves e cada um possui um endereço único dentro do barramento.

Montagem

Antes de começar, o antigo display 16x2 pode ser removido da protoboard, junto com todos os cabos e resistores que foram utilizados para ele. Como o novo display possui o controlador soldado na parte de trás, ele não precisa ser montado na protoboard. Vou utilizar apenas 4 cabos macho-fêmea ligados nos pinos do controlador.

Display LCD utilizado Display LCD que estou utilizando, com os cabos conectados no controlador I²C

O Arduino possui dois pinos analógicos específicos para comunicação I²C: a linha SDA deve ser ligada no pino A4 e a linha SCL deve ser ligada no pino A5 (no Arduino UNO). Como nesse momento eu só terei o display LCD conectado no barramento I²C, eu irei conectar esses pinos do Arduino diretamente aos pinos da placa controladora do display. Fora isso, só é necessário ligar o GND e o Vcc (5V) e a montagem está pronta:

Esquema de ligação do display com I²C

Atualizando o código para I²C

Com a montagem finalizada, resta atualizar o código. A primeira alteração que precisa ser feita é incluir uma biblioteca que suporte a comunicação com o LCD por I²C. Como agora eu estou utilizando o PlatformIO, eu apenas precisei editar o platformio.ini e substituir a biblioteca LiquidCrystal@1.3.4 por LiquidCrystal_I2C@1.1.2(eu testei algumas outras bibliotecas, mas essa pareceu funcionar melhor). Como foi alterada a biblioteca, também é necessário alterar o #include dela.

Diff das alterações:

-#include <LiquidCrystal.h>
+#include <LiquidCrystal_I2C.h>

A única configuração necessária para comunicar com o display I²C é o endereço dele no barramento. Os controladores já vem com um endereço configurado que pode ser diferente entre diferentes modelos e fabricantes, mas pode ser descoberto com um I²C scanner como mostrado em um tutorial no site do Arduino (em inglês). O display LCD que eu estou utilizando possui o endereço 0x3F, mas se o seu for diferente, lembre-se de alterar no código abaixo.

Diff das alterações:

-#define PIN_LCD_D7        8
-#define PIN_LCD_D6        9
-#define PIN_LCD_D5       10
-#define PIN_LCD_D4       11
-#define PIN_LCD_EN       12
-#define PIN_LCD_RS       13
+#define LCD_I2C_ADDR   0x3F
+#define LCD_COLS         20
+#define LCD_ROWS          4

Com a antiga biblioteca, os pinos utilizados na comunicação eram configurados no construtor do objeto e o tamanho do display era configurado com o método begin(). Com essa nova biblioteca tudo isso é feito no construtor.

Diff das alterações:

-// Inicializa o objeto LCD configurando os pinos de comunicação
-LiquidCrystal lcd(
-    PIN_LCD_RS,
-    PIN_LCD_EN,
-    PIN_LCD_D4,
-    PIN_LCD_D5,
-    PIN_LCD_D6,
-    PIN_LCD_D7
-);
+// Inicializa o objeto LCD configurando o endereço de comunicação e tamanho
+LiquidCrystal_I2C lcd(LCD_I2C_ADDR, LCD_COLS, LCD_ROWS);

A função setupLCD() também precisa ser alterada. Em vez de chamar o método lcd.begin() com o tamanho do display, é necessário chamar o método init() sem parâmetros, que irá inicializar a comunicação I²C e também o display. Além disso, também é necessário habilitar a luz de fundo do LCD explicitamente via código.

Diff das alterações:

 void setupLCD()
 {
-    // Configura o tamanho do LCD: 16 colunas e 2 linhas
-    lcd.begin(16, 2);
+    lcd.init();
+    lcd.backlight();
 }

Com isso feito, o display já deve estar funcionando. Mas os dados que são exibidos nele ainda estão formatados para um display 16x2, então vamos ocupar melhor o espaço, começando pela tela de início.

Diff das alterações:

 void printWelcome()
 {
     lcd.clear();

-    // Posiciona o cursor na primeira coluna da primeira linha
-    lcd.setCursor(0, 0);
+    // Posiciona o cursor na terceira coluna da segunda linha
+    lcd.setCursor(2, 1);
     lcd.print("PLACARDUINO v1.0");

-    // Posiciona o cursor na terceira coluna da segunda linha
-    lcd.setCursor(2, 1);
+    // Posiciona o cursor na quinta coluna da terceira linha
+    lcd.setCursor(4, 2);
     lcd.print("a.k.a. DAMN");
 }

A parte do placar que exibe a pontuação eu vou manter como está - por enquanto 😉

Roadmap

Agora que a protoboard tem bastante espaço livre para novos componentes e o display é grande o suficiente para exibir muitas informações, o projeto pode evoluir muito mais. Eu já fiz uma grande mudança na tela que exibe a pontuação (que merece um post separado) e já estou pesquisando a tecnologia de tags RFID para identificar os jogadores. Ideias não faltam, e o conhecimento se adquire.

Como sempre, o código-fonte e o projeto do Fritzing estão no GitHub: