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.
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:
- Joystick Analógico Arduino/raspberry Pi – Pronta Entrega
- Arduino R3 Uno
- Dccele Dccduino (clone do Arduino Uno)
- Cabo macho-macho 10cm
- Protoboard 400 furos
- Protoboard 830 furos
- 40 Cabos Jumper Para Protoboard Macho-femea Com 10cm
- Micro Servo Tower Pro 9g Sg90 Pronta Entrega
- Servo Motor Futaba S3003 – Pronta Entrega
- Servo Mg995 Alto Torque – Pronta Entrega
Obrigado a todos e até o próximo post!