Utilizando o módulo de joystick

Olá a todos,

nesse post demonstraremos como utilizar o módulo de joystick, que pode ser utilizado tanto para jogos como para controlar outros projetos como veículos, drones e braços de robôs. Esse módulo possui cinco pinos seguindo a seguinte distribuição:

  • Gnd: que deve ser ligado ao terra da placa;
  • +5V: que deve ser ligado ao 5V da placa;
  • VRx: pino onde faremos a leitura do valor do eixo X;
  • VRy: pino onde faremos a leitura do valor do eixo Y;
  • SW: pino onde faremos a leitura do estado do botão (pressionado ou não).

O funcionamento desse módulo é bem simples, pois ele é composto de dois potenciômetros, um para cada eixo do joystick e um botão. Portanto ao movimentarmos o joystick em alguma direção movemos os potenciômetros. Portanto a leitura desses potenciômetros deve ser realizada pelos pinos analógicos do Arduino ou outra placa que esteja utilizando.

Devido a simplicidade do módulo faremos nesse post um projeto um pouco mais elaborado: O joystick controlará dois servos, um para o eixo X e outro para o eixo Y e o botão acionará dois leds, um no circuito e outro na placa.

Caso tenha dúvidas sobre o uso dos servos consulte esse outro post dedicado a esse assunto.

O primeiro passo é montarmos o circuito. Conecte cabos do tipo macho-femea no joystick e em seguida conecte os pinos Gnd e 5V do módulo nas linhas da protoboard. O próximo passo é conectar os cabos dos pinos VRx e VRy aos pinos A0 e A1 do Arduino (ou os pinos equivalentes da sua placa). Em seguida conecte o cabo do pino SW na protoboard.

Agora passaremos para a montagem dos servos: Conecte os cabos de Vcc dos servos na mesma linha de furos da protoboard onde você conectou o pino 5V do joystick. Conexão semelhante deve ser feita com os cabos Gnd dos servos na linha de furos onde foi conectado o pino Gnd do joystick. Finalize essa etapa conectando os cabos de sinais dos servos nos pinos 9 e 10 do Arduino (ou outros pinos que tenham suporte a PWM).

Para finalizar o circuito, conecte o terminal negativo de um led ao cabo que está ligado ao pino SW do módulo e em seguida um resistor ao led e a linha do proboard que possui as conexões de 5V. Ligue finalmente um cabo do pino 5V do Arduino a essa última linha e outro cabo do pino Gnd do Arduino na linha onde foram conectados os Gnds tanto do módulo como dos servos.

Diagrama de montagem do circuito
Diagrama de montagem do circuito
Circuito montado
Circuito montado

Passaremos agora para o desenvolvimento do código. Primeiro declare o uso da biblioteca Servo e em seguida as variáveis para indicar os pinos de leitura do módulo de joystick, escrita dos valores para os servos e escrita do led embutido no Arduino (pino 13). Declare também uma variável que armazenará o valor do eixo X e dois objetos para do tipo Servo.

#include <Servo.h>

int joystickX = A0;

int joystickY = A1;

int botao = 7;

int led = 13;

int eixoX = 9;

int eixoY = 10;

int valorX;

Servo servoX;

Servo servoY;

 

Passaremos agora para a inicialização do projeto na função setup. Configure o pino do botão do joystick como INPUT e o pino do led da placa como OUTPUT. Em seguida utilize a função attach para indicar ao Arduino em quais pinos estão conectados os cabos de sinal dos servos. Finalize a função setup posicionando os servos em 90 graus e atribua esse valor na variável que armazena o valor do servo X.

void setup() {

pinMode(botao, INPUT);

pinMode(led, OUTPUT);

servoX.attach(eixoX);

servoY.attach(eixoY);

servoX.write(90);

servoY.write(90);

valorX = 90;

}

Passaremos agora para a função loop, que executará a lógica de controle do nosso projeto.

O primeiro trecho fará a leitura do botão e quando acionado ligará o led da placa. Devido a montagem do circuito a leitura está invertida, ou seja, quando o botão é acionado o estado do pino é LOW e quando o botão é solto ele volta para o estado HIGH. Por isso foi colocado o if para a inversão da lógica:

 

void loop() {

int valor = digitalRead(botao);

if (HIGH == valor)

digitalWrite(led, LOW);

else

digitalWrite(led, HIGH);

}

 

O próximo passo é o controle do eixo X. O servo desse eixo será movimentado somente quando o valor do joystick ultrapassar um determinado valor para evitar acionamentos indevidos, e continuará movimentando no sentido até que seja atingido o valor máximo ou que a alavanca do módulo volte para a posição inicial. Essa característica foi implementada com os dois conjunto de IFs. O primeiro verifica o valor do potenciômetro que controla o eixo e o segundo garante que o servo não movimentará mais do que o limite que desejamos:

 

valor = analogRead(joystickX);

if (800 < valor)

valorX += 1;

else if (200 > valor)

valorX -= 1;

 

if (valorX > 160)

valorX = 160;

else if (valorX < 10)

valorX = 10;

 

servoX.write(valorX);

 

Já para o eixo Y teremos outro comportamento: o servo movimentará proporcionalmente ao movimento da alavanca do joystick. Para realizar esse comportamento faremos a leitura do valor do eixo Y e em seguida utilizaremos a função map, que produz o efeito de uma “regra de 3” calculando o valor do grau do servo baseado no valor do eixo Y:

 

valor = analogRead(joystickY);

int valorY = map(valor, 0, 1023, 10, 160);

servoY.write(valorY);

 

Para finalizar o código vamos fazer o Arduino aguarda 50 microsegundos, abaixo temos o código completo da função loop:

 

 

void loop() {

int valor = digitalRead(botao);

if (HIGH == valor)

digitalWrite(led, LOW);

else

digitalWrite(led, HIGH);

 

valor = analogRead(joystickX);

if (800 < valor)

valorX += 1;

else if (200 > valor)

valorX -= 1;

 

if (valorX > 160)

valorX = 160;

else if (valorX < 10)

valorX = 10;

 

servoX.write(valorX);

valor = analogRead(joystickY);

int valorY = map(valor, 0, 1023, 10, 160);

servoY.write(valorY);

delay(50);

}

 

Onde encontrar:

Obrigado a todos e até o próximo post!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *