Olá, tudo bem? Hoje vamos utilizar o Joystick com Arduino e criar um projeto bem bacana. Certamente você já utilizou ele em seus projetos ou já tenha utilizado ele e nem sabia.
Então, vamos agora conhecer um pouco melhor o seu funcionamento, além de criar um super projeto, vamos nessa?
Funcionamento Joystick
Quando falamos sobre Joystick, a primeira ideia que vem é de jogos, mais especificamente um controlador de jogo. Inegavelmente, é exatamente isso. Então, este joystick não é nada além de uma combinação de dois potenciômetros para o plano X e Y, respectivamente.
Dessa forma, ele realiza a leitura da tensão através dos potenciômetros e envia valores analógicos ao Arduino. Assim, é esperado que o valor analógico mude à medida que movemos o eixo do joystick (que é simplesmente o ponteiro do potenciômetro).
Agora falando mais sobre o nosso módulo e da utilização do joystick com Arduino, ele normalmente fornece saídas do tipo analógicas e as suas tensões de saída são alteradas de acordo com a direção em que nós o movemos.
Por fim, para obtermos as direções do movimento, temos que interpretar a mudanças de tensão seguindo os valores da imagem abaixo.
Display Nokia 5110
A escolha do display Nokia se baseou muito na forma que iremos apresentar o nosso projeto e no espaço que ele ocupa no circuito. Pois, comparando ele com o famoso Display LCD, notamos que ele possui maior largura o que facilita na parte gráfica.
Outro ponto importante é o fato dele aceitar imagens no formato bitmap. Esse e outros pontos sobre o Display Nokia, eu expliquei no post sobre a sua utilização. Confere lá clicando no botão abaixo.
Explicando o Projeto Joystick com Arduino
Mas o que iremos fazer hoje? No post de hoje vamos desenvolver um jogo no display Nokia. Para tal jogo, será importante a prática do conhecimento de Joystick que expliquei até o momento sobre a leitura dos valores de tensão. Combinado?
Basicamente, vamos utilizar o espaço que nosso display dispõe. Utilizaremos a resolução de 84*48 para alocar toda a parte gráfica do jogo. A qual consiste em um placar e naves do nosso jogo espacial.
Serão três ruas onde duas sempre terão naves alienígenas e o jogador com sua nave deverá ir para a pista vazia sem poder chocar com as naves inimigas. Beleza? Simples assim!
Componentes do Projeto Joystick com Arduino
Vamos então a nossa lista de componentes de hoje. Separe todos eles e realize a ligação do joystick no arduino seguindo o circuito na imagem logo abaixo.
- 01x Arduino UNO
- 01x Módulo Joystick
- 01x Módulo Display Nokia 5110
- 01x Resistores 220
- 01x Protoboard
- Alguns Jumper’s
Montagem do Circuito com Joystick
Código do Projeto Comentado
<code>/* ================================================================================================== Projeto: Jogo Espacial com Joystick e Display 5110 Autor: Danilo Nogueira Data: 04/08/2019 **Código Modificado de Circuit Digest** // ==================================================================================================*/ // --- Declaração Bibliotecas --- #include <SPI.h> // Biblioteca para realizar a comunicação #include <Adafruit_GFX.h> // Bibliteca Gráfica para usar no Display #include <Adafruit_PCD8544.h> // Biblioteca do Display 5110 // ================================================================================================== // --- Declaração das Variáveis --- // Imagem em Bitmap da Nave Espacial static const unsigned char PROGMEM ship[] = { B00000000,B00000000, B00000001,B00000000, B00000011,B10000000, B00000010,B10000000, B00000010,B11000000, B00000111,B11000000, B00001101,B11100000, B00011111,B11110000, B00111111,B11111000, B01111111,B11111100, B01111111,B11111100, B01111111,B11111100, B00011111,B11110000, B00000111,B11100000, B00000000,B00000000, }; // Imagem em Bitmap da Nave Inimiga static const unsigned char PROGMEM enemy[] = { B00000101,B11000000, B00001011,B11100000, B00000011,B11100000, B00110011,B11111000, B01111111,B11111100, B10111111,B11111010, B01110111,B11011100, B01111110,B11111100, B00111111,B11111100, B11101111,B11101110, B11000001,B00000110, B10000001,B00000010, B10000000,B00000010, B00000000,B00000000, }; // Passando a pinagem de ligação do Display no Arduino Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12); // Criando o construtor e passando a pinagem dele int enemy_0_pos, enemy_1_pos, enemy_phase; int Joy_X; int game_speed = 0; int pontuacao = 0; char POS = 2; boolean enemy_dead = true; boolean control = true; // ================================================================================================== // --- Configurando o void setup() --- void setup() { Serial.begin(9600); // Velocidade de Comunicação da Seial display.begin(); // Iniciando a comunicação do Display display.setContrast(55); // Configurando o contraste do Display display.clearDisplay(); // Limpando o Display } // ================================================================================================== // --- Configurando o void loop() --- void loop() { display.clearDisplay(); TelaJogo(); // Chamando a função para desenhar o jogo na tela. // Coletando os dados do Joystick Joy_X = analogRead(A1); // Realizando a leitura do eixo X if (Joy_X > 800 && POS!=1 && control==true) // Caso o Joystick mova p/ ---> { POS--; // Vai trocar de pista (decrementar sua posição) control = false; } if (Joy_X < 312 && POS!=3 && control==true) // Caso mova-se novamente para <-- { POS++; control = false; } if (Joy_X > 490 && Joy_X < 522) // Se o joystick voltar ao estado parado control = true; player_car(POS); // Posição da nave na tela de acordo com a posição do joystick delay(100); if (enemy_dead) // Verifica se a nave inimiga morreu (não teve choque das naves) { enemy_0_pos = POS; // Cria uma nave inimiga na mesma pista que a nossa nave enemy_1_pos = random(0,4); // Cria a segunda nave numa posição sorteada aleatoriamente enemy_phase = 0; // As naves inimigas iniciam no topo da tela enemy_dead = false; } // Função para desenhar a nave inimiga na pista indicada e no topo da tela enemy_ship (enemy_0_pos,enemy_phase); enemy_phase++; enemy_ship (enemy_1_pos,enemy_phase); enemy_phase++; // Caso a nossa nave toque em alguma nave inimiga é GAME OVER! if (enemy_phase>22 && ((enemy_0_pos == POS) || (enemy_1_pos == POS))) game_over(); // Mostra no Display a mensagem 'game over' // Caso não ocorra nenhuma batida, o jogador ganha 1 ponto if (enemy_phase>40) { enemy_dead = true; // O inimigo é morto e novos inimigos são criados pontuacao++; } // Função para aumentar a velocidade de acordo com a pontuacao Controle_Veloc(); display.display(); // Atualiza o display com as alterações } void Controle_Veloc() { if (pontuacao>=0 && pontuacao<=10) { game_speed = 0; delay(100); } if (pontuacao>10 && pontuacao<=20) { game_speed = 1; delay(80); } if (pontuacao>20 && pontuacao<=30) { game_speed = 2; delay(75); } if (pontuacao>30 && pontuacao<=40) { game_speed = 3; delay(55); } } void enemy_ship(int place, int phase) { if (place==1) display.drawBitmap(2, phase, enemy, 15, 15, BLACK); if (place==2) display.drawBitmap(18, phase, enemy, 15, 15, BLACK); if (place==3) display.drawBitmap(34, phase, enemy, 15, 15, BLACK); } void game_over() { while(1) { delay(100); display.clearDisplay(); display.setCursor(16,20); display.println("SE FUDEO!"); display.display(); } } void TelaJogo() { // Desenha a linha que separa jogo | pontuacao display.drawLine(0, 0, 0, 47, BLACK); display.drawLine(50, 0, 50, 47, BLACK); display.drawLine(0, 47, 50, 47, BLACK); display.setTextSize(1); display.setTextColor(BLACK); display.setCursor(52,2); display.println("Km/h"); display.setCursor(54,12); display.println(game_speed); display.setCursor(52,25); display.println("Pont."); display.setCursor(54,35); display.println(pontuacao); } void player_car(char pos) { if (pos==1) display.drawBitmap(2, 32, ship, 15, 15, BLACK); if (pos==2) display.drawBitmap(18, 32, ship, 15, 15, BLACK); if (pos==3) display.drawBitmap(34, 32, ship, 15, 15, BLACK); } // =========================== FIM ===============================</code>
Explicação do Código
O nosso código inicia com a declaração das bibliotecas que iremos utilizar. Que seria a parte gráfica do display fora a comunicação entre os módulos.
<code>#include <SPI.h> // Biblioteca para realizar a comunicação #include <Adafruit_GFX.h> // Bibliteca Gráfica para usar no Display #include <Adafruit_PCD8544.h> // Biblioteca do Display 5110</code>
Em seguida, temos a declaração das variáveis que iremos utilizar. Vamos começar com a criação das naves, PROGMEM ship e PROGMEM enemy.
Logo após, definimos a pinagem dos módulos e as variáveis para pontuação e deslocamento na tela.
<code>// Passando a pinagem de ligação do Display no Arduino Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12); int enemy_0_pos, enemy_1_pos, enemy_phase; int Joy_X; int game_speed = 0; int pontuacao = 0; char POS = 2; boolean enemy_dead = true; boolean control = true;</code>
Já no void setup(), iniciamos a comunicação serial e setamos o display definindo um valor inicial do contraste.
<code>void setup() { Serial.begin(9600); // Velocidade de Comunicação da Seial display.begin(); // Iniciando a comunicação do Display display.setContrast(30); // Configurando o contraste do Display display.clearDisplay(); // Limpando o Display }</code>
Por fim, entramos no void loop() onde toda a parte lógica é executada onde chamamos as funções para executar os comandos.
Ao entrar nos if, vamos analisar o valor da tensão enviado pelo joystick e realizar o movimento necessário.
<code>// Coletando os dados do Joystick Joy_X = analogRead(A1); // Realizando a leitura do eixo X if (Joy_X < 312 && POS!=1 && control==true) // Caso o Joystick mova p/ ---> { POS--; // Vai trocar de pista (decrementar sua posição) control = false; } else if (Joy_X > 712 && POS!=3 && control==true) // Caso mova-se novamente para ---> { POS++; control = false; } //??? else if (Joy_X >502 && Joy_X<522) // Se o joystick voltar ao estado parado control = true;</code>
Resultado do Projeto
Mas e ai? Gostou do post? Caso tenha ficado algo incompleto para você, comenta abaixo 📝
Dicas? 😄 Dúvidas? 👀 Críticas? 😱 Só comentar abaixo!
Forte abraço e compartilha se gostou! 🤘