jogo-math-lcd
Tutorial: Math Game com LCD Display I2C – Protoboard
Índice

Neste tutorial, iremos aprender a fazer o Math Game na protoboard usando um display LCD e botões.

 
1. Introdução

No tutorial “Math Game com Monitor Serial”, o canal que utilizamos para interagir com o usuário foi o Monitor Serial. Agora, iremos usar um display LCD para fazer a comunicação com o jogador. Como desafio, o programa sorteará a operação e a solução, ou seja, o jogador pressionará Verdadeiro ou Falso, por exemplo, 4 x 5 = 41, V ou F?.

 
2. Biblioteca

Antes de começarmos a escrever o programa, vale ressaltar que alguns componentes necessitam de bibliotecas.

O ambiente do Arduino pode ser ampliado por meio delas, assim como na maioria das plataformas. São elas que proporcionam funcionalidades extras para usar em determinados projetos, trabalhando com hardwares específicos ou manipulando informações. Podemos inserí-las de duas formas: a primeira delas é incluir a biblioteca diretamente pela IDE do Arduino. Para achar uma e instalar, siga esse caminho: Sketch > Import Library > Manage Libraries. Feito isso busque pela biblioteca e clique em “Install”. Feche a IDE e abra novamente, ou, caso necessário, reinicie seu computador.

A segunda forma é mais trabalhosa, porém necessária às vezes. Dependendo do componente que você adquiriu ou do seu projeto, você precisará buscar pela biblioteca na Internet, ler as instruções e instalar. Quando a mesma for encontrada copie e cole ou arraste a pasta correspondente para a pasta “bibliotecas” dentro da pasta Arduino. Segue o caminho (no nosso caso): C:\Program Files (x86)\Arduino\libraries.

A terceira forma de incluir uma biblioteca é baixar a pasta correspondente e, na IDE do Arduino fazer o seguinte caminho a partir do menu principal: Sketch > Incluir Biblioteca > Abrir Biblioteca .ZIP e abrir a pasta.

No tutorial “Math Game com Monitor Serial”, tivemos que “traduzir” para o programa a leitura das teclas por meio da tabela ASCII, pois ele não entende símbolos ou letras, somente números binários, mas caso você não se lembre, clique aqui e reveja; a biblioteca desempenhará esse papel, facilitando o desenvolvimento da escrita.

Cada display LCD tem a sua própria biblioteca, portanto é necessário pesquisar na internet para descobrir qual a sua e como instalar. Nosso projeto utilizou um LCD 16×2 (16 colunas e 2 linhas) com módulo I2C. Descobrindo qual a sua biblioteca, é necessário instalar na pasta libraries dentro do Arduino (Caminho: C:\Program Files (x86)\Arduino\libraries).

 
3. Estrutura do programa

Segue a estrutura completa do programa:

  • Biblioteca, declaração do LCD, #define e variáveis
  • Para incluir a biblioteca do LCD, você deve escrever logo no início #include e #include . Lembre-se de que essa parte varia conforme o seu LCD e respectiva biblioteca.

    Na linha abaixo, devemos declarar o LCD e elementos que serão utilizados ao longo do programa. Como elaboramos o projeto com dois botões para interação (botão verdadeiro e falso), escreveremos os defines para ambos, sendo que o botão do pino 4 será nosso botão para responder Verdadeiro (V) e o pino 6 o botão para responder Falso (F).

    Em seguida as variáveis, que já estavam presentes no tutorial do jogo Math, incluindo agora a variável tipo_de_resposta.

  • void setup
  • No setup, vamos configurar os pinos como entradas, as frases de introdução e o primeiro e único sorteio feito por um dos botões (os outros serão automáticos).

    Os dois botões serão nossas entradas, então devemos descrever como INPUT_PULLUP. Logo depois, inicializamos o display (lcd.begin(16,2)) com a sua quantidade de colunas e de linhas (existem LCDs de outros tamanhos).

    Lcd.home significa que posicionaremos a informação na primeira linha do display e a primeira ação do programa será introduzir o que é o jogo com as frases “Jogo de perguntas e respostas”, “Aperte verdadeiro ou falso” e “Aperte qualquer botão para iniciar”. Com a finalidade de apenas mostrar o nosso jogo de matemática funcionando apresentaremos as frases de forma bem simples, sem efeito algum. Para isso precisamos separar as frases para se encaixarem nas 16 colunas e 2 linhas.

    Neste trecho, ordenamos que o programa imprima na tela (lcd.print(frase)), posicionamos onde queremos que ele imprima (lcd.setCursor(coluna, linha)), dizemos por quanto tempo deve imprimir (delay(tempo)) e depois limpamos a tela (lcd.clear()). Observe que o lcd.setCursor é essencial para posicionarmos mais de uma frase para aparecer ao mesmo tempo: (0,1) significa que a frase ficará na primeira coluna (0) da segunda linha (1).

    Após fazer a descrição de como as frases aparecerão inicializaremos o gerador de números aleatórios com um valor qualquer randomSeed(analogRead(0)). Vimos como esse gerador funciona no tutorial “Jogo Genius (Simon)”.

    Como foi escrito, neste tutorial vamos começar o sorteio das funções quando o jogador pressionar um dos botões. Para que isso aconteça, elaboramos uma função chamada le_botao(), descreveremos a mesma de forma independente após o loop. Limpamos a tela para iniciar o jogo.

  • void loop
  • No void loop instruímos qual a ordem dos acontecimentos.

    Primeiramente, sortearemos o tipo de operação (multplicação ou divisão) com a função tipo_de_conta. O random(1,3) significa que estamos sorteando dois elementos, pois a expressão significa “maior ou igual a um e menor que 3”.

    Na multiplicação (case 1) e na divisão (case 2), usaremos os fator_1 e fator_2 com 9 elementos para serem sorteados (random(1,10)).

    O que temos de diferente do tutorial anterior são os comandos para imprimir no display, mas estes acabamos de conferir no bloco void setup: posicionamos o cursor (lcd.setCursor), ordenamos o programa imprimir a operação lcd.print(fator_1); lcd.print(” x “); lcd.print(fator_2); lcd.print(” = “) e finalizamos a operação com o break para descrever a próxima. Se escrevemos um lcd.print um em seguida do outro, os elementos aparecem na mesma linha.

  • Tipo de resposta
  • Feito o bloco dos tipos de operação, agora precisamos dizer ao programa para sortear um dos dois tipos de resultado com a função tipo_de_resposta. Ele sorteia resposta certa ou errada e depois pergunta se é verdadeira ou falsa (lcd.print(“V ou F ?”)). Supondo que ele sorteie a resposta correta (case 1), vamos descrever duas reações possíveis, uma quando o jogador acerta e outra quando erra. Por eliminação, se o programa não sortear a resposta correta ele automaticamente seleciona uma resposta errada (case 2) que corresponde a qualquer valor até 99 (random(1, 100)).

    No case 1, ou resposta correta, vamos seguir o mesmo raciocínio das outras linhas para imprimir as sentenças no display, posicionando o cursor e imprimindo: lcd.setCursor ( 8, 0 ); lcd.print(resultado); lcd.setCursor ( 0, 1 ); lcd.print(“V ou F ?”).

    Quando o programa sortear uma resposta errada, ordenamos que ele sorteie qualquer número até 99 (random(1, 100)) enquanto o resultado errado for igual ao resultado correto (while (resultado_qualquer == resultado);), ele sorteará outro número aleatório. Depois é só mandar imprimir da mesma forma que o case 1.

  • Leitura da resposta
  • Agora, precisamos criar uma variável booleana para o botão que o programa leu. Faremos isso já pensando no próximo passo que será como o programa comparará o botão lido com a resposta esperada.

    Na primeira linha, definimos uma variável chamada digitado, que é igual à função le_botao() – detalharemos isso ao final do programa. O programa imprime no display qual botão foi pressionado por meio da lógica da nossa variável: se considerarmos o botão verdadeiro (V) como true na lógica booleana, o display mostrará que o jogador apertou o V (if (digitado == true) { lcd.print(“V”); }), caso contrário, mostrará F (else { lcd.print(“F”); }).

  • Comparação da resposta
  • Pergunta feita e resposta recebida, precisamos agora comparar com a solução sugerida pelo programa.

    Voltando à função de tipo de resposta consideramos duas opções para sorteio: a resposta correta (case 1) e a incorreta (case 2). Caso o programa sorteie a resposta correta, o número de acertos será contado quando o jogador apertar V (if (digitado == true) { lcd.setCursor ( 0, 0 ); lcd.print(“Muito bem :-)”);) e contará erro quando pressionar o botão F (lcd.setCursor ( 0, 0); lcd.print(“O resultado era”); lcd.setCursor ( 0, 1); lcd.print(“verdadeiro 🙁 “);). Agora, se o programa sortear a resposta incorreta, o processo de acertos e erros inverte: contam-se acertos quando o jogador clica no F (lcd.setCursor ( 0, 0 ); lcd.print(“Errou :-(“); delay(1500); lcd.clear(); lcd.setCursor ( 0, 0 ); lcd.print(“O valor correto era: “); lcd.setCursor ( 0, 1 ); lcd.print(resultado);) e conta erro quando clica em V (lcd.print(“Muito bem :-)”);).

    Depois, o programa mostra quantos acertos e erros pontuou até o momento. Na função tipo_de_resposta, o programa já contabilizava automaticamente, portanto para mostrarmos essa informação é preciso chamar as variáveis dentro dos lcd.print, por exemplo lcd.setCursor(0, 0); lcd.print(“Acertos: “); lcd.print(acertos); lcd.clear().

    Fazemos isso com o número de acertos e número de erros ao mesmo tempo em linhas distintas.

  • Função ler os botões
  • Fora do void loop, ainda precisamos declarar o função le_botao. Ela será uma função booleana, ou seja, tem a característica de ser lógica e obrigatoriamente retornar um valor.

    Indicamos para cada botão uma variável (tecla_V para a ler o botão V e tecla_F para ler o botão F) e consideremos que, enquanto nenhum dos botões estiver pressionado (while (tecla_V == HIGH && tecla_F == HIGH);) a tecla_V ou o botão V ao ser pressionado será true na lógica booleana (return (tecla_V == LOW);). Para ler o botão pressionado e comparar as respostas do jogador com as do jogo, temos que partir de algum parâmetro, no nosso caso, testamos o botão V como true.

 
4. Componentes e materiais

  • Um Arduino UNO.
  • Uma Shield Sensor V5.
  • Uma protoboard.
  • Dois botões.
  • Cinco cabos jumper macho-macho.
  • Sete cabos jumper fêmea-fêmea.
  • Um LCD Display I2C.
  • Um cabo USB.

 

placa arduino uno

Arduino UNO

 

cabo usb

Cabo USB

 

Lcd Display I2C

LCD Display I2C

 

Placa Sensor Shield

Placa Sensor Shield

 

Cabo Jumper fêmea

Cabo jumper fêmea

 

Cabo Jumper macho

Cabo jumper macho

 

botao acionamento

Botão

 

protoboard

Protoboard

 

5. Montagem

Começando pelas menores partes vamos conectar os botões na protoboard, lembrando sempre que eles possuem sentidos certos para funcionar:

 

sentido botao

Sentido correto botão

 

Como usaremos uma placa shield precisamos conectar alguns cabos jumper fêmea com macho. Repita esse processo em dois cabos machos com dois fêmeas. Quatro cabos fêmeas serão utilizados no display e três machos na conexão dos pólos negativos dos botões e da protoboard com o Arduino.

 

Encaixe cabos

Encaixe cabos jumper

 

Agora é só posicionar dois cabos jumper combinados nos pinos correspondentes (cabos azul e verde; pinos 4 e 6) aos botões:

 

Encaixe nos pinos da placa Arduino

Encaixe nos pinos dos botões no Arduino

 

Os polos negativos de cada botão e o pólo negativo da protoboard serão postos dessa forma:

 

Encaixe pólo negativo na Protoboard

Encaixe polo negativo na protoboard

 

E a parte negativa da protoboard deverá ser ligada ao Arduino assim:

 

Ligação do pólo negativo da Protoboard com o Arduino

Ligação do pólo negativo da Protoboard com o Arduino

 

O LCD já vem com um módulo de comunicação I2C, então ao invés de conectarmos cabo por cabo no componente, precisamos apenas conectar 4 cabos com a placa shield:

 

Encaixe dos cabos do Display com a placa Shield

Encaixe dos cabos do LCD com a placa shield

 

Encaixe dos cabos do Display com a placa Shield

Encaixe dos cabos do LCD com a placa shield

 

Por último, devemos encaixar a placa shield com o Arduino. O resultado deverá ser este:

 

Resultado da montagem

Resultado da montagem

 

6. Upload

Lembre-se de conectar o Arduino à entrada USB do seu computador. Verifique se a placa e portas estão já estão configuradas na IDE. Em caso de dúvida, clique aqui e reveja como fazer.

Para efetuar o Upload, clique na seta indicada em vermelho.

 

upload

Upload do programa

 

7. Dicas

  • Em caso de erro com a biblioteca, apague a pasta LiquidCrystal e deixe apenas a pasta do LCD que você vai trabalhar.
  • Em muitos casos, a biblioteca pode “sumir”. Para resolver repita o processo para inserir a biblioteca novamente na pasta do Arduino.
  • Troque de porta (entrada USB).
Produtos
Promoção!
Arduino UnoArduino Uno

Uno SMD – Arduino compatível

R$59,90 R$54,90

Ideal para iniciantes, o Uno é um Arduino compatível bem capaz, barato e com diversos shields e sensores compatíveis disponíveis. Se você está começando a aprender sobre microcontroladores e Arduinos, esta é a placa perfeita! Ela é a nossa placa principal nos nossos tutoriais de Arduino.

display-lcd

Display LCD 16X2 caracteres com I2C

R$24,90

Nosso display 16×2 vem equipado com uma placa I2C. Isto significa que com apenas duas conexões para alimentação e mais duas para comunicação pode-se fazer o display funcionar!

Muito mais simples que as conexões paralelas dos outros displays.

protoboard-830-2Out Of Stock

Protoboard transparente 830 pontos

R$24,90

Protoboard transparente com 830 pontos para prototipagem é ideal para trabalhos elétricos e eletrônicos com Arduino e microcontroladores em geral. É fácil tem muito espaço para conectar leds, cabos, resistores entre outros.

Os pólos negativos e positivos estão bem identificados para facilitar seu trabalho com vários componentes.

Deixe uma resposta

Seu endereço de e-mail não será publicado. Campos obrigatórios estão marcados *

limpar formulárioPostar Comentário