Como utilizar o módulo joystick KY-023 com Arduino
O Joystick KY-023 (Figura 1) é um módulo eletrônico desenvolvido para controlar dispositivos eletrônicos, jogos de vídeo game, carrinhos, robôs, motores, entre outros. É um dispositivo de entrada e seu princípio de funcionamento por meio do controle de dois potenciômetros conectados entre si, um para o movimento vertical (eixo Y) e outro para o movimento horizontal (eixo X). Este componente possui também um botão do tipo push button, que corresponde ao eixo Z.
O Joystick KY-023 produz uma saída de cerca de 2,5V de X e Y, quando o bastão estiver na posição de repouso (centro). Ao mover o bastão, a saída varia de 0V a 5V, dependendo da direção. Quando conectado a um microcontrolador, como a placa Arduino, espera-se que a leitura analógica do joystick em repouso seja em torno de 512 (pequenas variações podem ocorrer devido a pequenas imprecisões das molas do mecanismo). Ao mover o bastão do joystick, a leitura será de 0 a 1023 dependendo de sua posição.
Neste projeto, vamos realizar a leitura dos eixos e analisar os movimentos do bastão e botão do módulo joystick KY-023. Estas informações serão exibidas no monitor serial do Arduino IDE.
MATERIAIS NECESSÁRIOS
- 1 x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO;
- 1 x Cabo USB;
- 1 x Protoboard;
- 1 x Módulo joystick KY-023;
- Fios de jumper macho-fêmea.
ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES
Inicialmente, monte o circuito da Figura 2 utilizando o módulo joystick KY-023 e os jumpers.
Ao montar seu circuito na protoboard preste atenção nos seguintes pontos:
- Conecte os pinos GND e + 5V do módulo joystick ao GND e VCC da placa UNO, respectivamente;
- Ligue o pino VRx à porta analógica A0, o pino VRy à porta analógica A1 e o pino SW à porta digital 2 da placa UNO.
ELABORANDO O CÓDIGO
Com o esquemático elétrico montado, vamos a programação do Sketch. A proposta deste projeto realizar a leitura dos eixos e a analisar os movimentos do bastão e botão do módulo joystick KY-023. As informações coletadas serão impressas no monitor serial. Se o usuário digitar a letra A no monitor serial o resultado da leitura analógica dos eixos X e Y e digital do botão serão exibidas, mas se o usuário digitar a letra B serão exibidas informações da análise do movimento do bastão e do botão.
1.Inicializar a comunicação serial e configurações iniciais
Dentro da função setup(), inicializamos a comunicação serial através da instrução: Serial.begin(9600);.
Também na função setup(), definimos a porta digital 2, em que o botão está conectado, como entrada pull-up. A placa UNO possui resistores pull-up internos que podemos habilitar e usar em nossos projetos. Ao definir um pino como INPUT_PULLUP, garantimos que seu estado inicial seja igual a HIGH.
2. Verificar, receber e armazenar um caractere pelo monitor serial
Inicializaremos a função loop() testando se algum caractere foi enviado ao monitor serial por meio da instrução if (Serial.available()). Uma vez satisfeita essa condição, o caractere será lido e armazenado na variável sentido através da instrução modo = Serial.read();
3. Criar a função movimento()
Na função movimento() analisaremos o movimento do bastão do joystick a partir da leituras dos eixos e do botão (Figura 111), de modo que:
- Se a leitura analógica de x for igual a zero, a mensagem “Bastão movimentado para baixo” será exibida no monitor serial;
- Se a leitura analógica de x for igual a 1023, a mensagem “Bastão movimentado para cima” será exibida no monitor serial;
- Se a leitura analógica de y for igual a zero, a mensagem “Bastão movimentado para esquerda” será exibida no monitor serial;
- Se a leitura analógica de y for igual a 1023, a mensagem “Bastão movimentado para direita” será exibida no monitor serial;
- Se a leitura digital de botao for igual a zero, a mensagem “Botão pressionado” será exibida no monitor serial;
- Se a leitura digital de botao for igual a um, a mensagem “Botão solto” será exibida no monitor serial;
Ao final, o código do projeto proposto ficará da seguinte maneira :
int x = A0; //Saída analógica (Eixo X) int y = A1; //Saída analógica (Eixo Y) int botao = 2; //Saída digital do botão (Eixo Z) char modo; //Variável para armazenar o caractere digitado pelo usuário void setup() { Serial.begin(9600); //Inicializa a comunicação serial pinMode(botao, INPUT_PULLUP); //Define botao como entrada e em modo PULL UP, ou seja, lê HIGH quando o botão não estiver pressionado } void loop() { if (Serial.available()) { //Se a serial receber algum caractere modo = Serial.read(); //Lê o caractere e guarda na variável sentido Serial.println(modo); //Imprime na serial o conteúdo de sentido } //Seleção A imprime na serial a leitura analógica dos eixos e botão //Seleção B imprime na serial o movimento do bastão e botão do joystick switch (modo) { case 'A': leitura(); // Chama a função para leitura analógica dos eixos e botão break; case 'B': movimento(); // Chama a função para análise do movimento do bastão e do botão break; } } void leitura() { for (int i = 0; i < 10; i++) { //Laço para repetir 10 vezes as leituras dos eixos e botão Serial.print("Leitura do eixo X: "); Serial.println(analogRead(x)); Serial.print("Leitura do eixo Y: "); Serial.println(analogRead(y)); Serial.print("Leitura do botão: "); Serial.println(digitalRead(botao)); Serial.println("------------------"); delay(500); } } void movimento() { for (int j = 0; j < 10; j++) { //Laço para repetir 10 vezes as análises dos eixos e botão if ((analogRead(x)) == 0) { Serial.println("Bastão movimentado para baixo"); } if ((analogRead(x)) == 1023) { Serial.println("Bastão movimentado para cima"); } if ((analogRead(y)) == 0) { Serial.println("Bastão movimentado para esquerda"); } if ((analogRead(y)) == 1023) { Serial.println("Bastão movimentado para direita"); } if ((digitalRead(botao)) == 0) { Serial.println("Botão pressionado"); } if ((digitalRead(botao)) == 1) { Serial.println("Botão solto"); } Serial.println("------------------"); delay(500); } }
Espero ter ajudado,
Obrigada a todos e em caso de dúvidas deixe seu comentário abaixo!
Att. Carol Correia Viana
Bacharel em Engenharia Elétrica com ênfase em Eletrônica, mestra em Engenharia Industrial e especialista em Docência com ênfase em Educação Inclusiva. Atua no setor de Desenvolvimento de Produtos na Casa da Robótica. Editora chefe e articulista no Blog da Robótica. Fanática por livros, Star Wars e projetos Maker.