fbpx

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.

Imagem que mostra a foto física e real de um modulo joystick analógico KY-023
Figura 1 – Módulo Joystick Analógico – KY-023.

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


ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES

Inicialmente, monte o circuito da Figura 2 utilizando o módulo joystick KY-023 e os jumpers.

A imagem mostra um circuito ilustrativo do projeto leitura dos eixos do modulo joystick KY-023
Figura 2 – Circuito para Projeto leitura dos eixos do módulo joystick KY-023.

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;
A imagem faz uma análise de maneira ilustrativa do movimento do bastao joystick a partir da leitura dos eixos e do botão.
Figura 3 – Análise do movimento do bastão do joystick a partir da leitura dos eixos e do botão.


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

Dúvidas? Deixe seu comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.