Como usar o módulo Joystick Arduino
Para iniciar este post sobre o módulo joystick Arduino eu ia elaborar uma definição sobre o joystick, mas não encontrei nenhuma mais “elegante” do que esta do Wikipedia:
Joystick é um periférico de computador e videogame pessoal ou um dispositivo geral de controle que consiste em uma vara vertical na qual os pivôs se aproximam de uma extremidade e transmitem seu ângulo em duas ou três dimensôes a um computador
Bonito não? Bonito e útil. Você encontra joysticks (e suas variações) em computadores, videogames, guindastes, helicópteros e caminhões, apenas para citar alguns exemplos.
Bom, Joystick é o assunto do post de hoje, onde vou testar um módulo Joystick, mostrar como você pode acompanhar as variações dos valores dos eixos pelo serial monitor e ainda montar um circuito simples com leds, que serão controlados pelo movimento do módulo.
Conexão do módulo joystick Arduino
Falando primeiramente do módulo, ele consiste em uma haste vertical que controla dois potenciômetros (eixos X e Y), que ligaremos nas portas analógicas, e um push-button (eixo Z), que ligaremos em uma porta digital. A ligação ao Arduino é feita por meio de 3 conectores (X, Y e Z) na lateral, onde cada conector tem 3 fios: GND, 5V e S (sinal).
No meu circuito, acrescentei ainda 5 leds, que acendem conforme o joystick é movimentado : eixo Y (esquerda e direita), eixo X (superior e inferior), e também ao pressionar o botão (eixo Z).
Devido à quantidade de conexões, uma boa idéia é utilizar um shield para sensores como este, principalmente se, além do joystick, você utilizar em seus projetos outros sensores e motores:
O programa não exige nenhuma biblioteca especial, já que estamos apenas lidando com portas digitais e analógicas e os comandos básicos do Arduino.
//Programa : Teste modulo Joystick //Autor : Arduino e Cia int valorx = 0; //Armazena o valor lido do potenciometro - Eixo X int valory = 0; //Armazena o valor lido do potenciometro - Eixo Y int valorz = 0; //Armazena o valor lido do botão - Eixo Z int pinoledesquerda = 2; //Pino Led Esquerdo int pinoledsuperior = 3; //Pino Led Superior int pinoleddireita = 4; //Pino Led Direito int pinoledinferior = 5; //Pino Led Inferior int pinoledz = 10; //Pino Led Eixo Z void setup() { pinMode(7, INPUT); //Pino Eixo Z Serial.begin(9600); pinMode(pinoledesquerda, OUTPUT); pinMode(pinoledsuperior, OUTPUT); pinMode(pinoleddireita, OUTPUT); pinMode(pinoledinferior, OUTPUT); pinMode(pinoledz, OUTPUT); } void loop() { //As linhas abaixo apagam todos os leds digitalWrite(pinoledesquerda, LOW); digitalWrite(pinoledsuperior, LOW); digitalWrite(pinoleddireita, LOW); digitalWrite(pinoledinferior, LOW); digitalWrite(pinoledz, LOW); //Le o valor do potenciometro ligado à porta analogica A0 - Eixo X valorx = analogRead(0); //Mostra o valor do eixo X no serial monitor Serial.print("X:"); Serial.print(valorx, DEC); //Testa o valor do Eixo X e aciona o led correspondente if (valorx > -1 & valorx <200) { digitalWrite(pinoledinferior, HIGH); //Acende o led inferior } if (valorx > 700 & valorx <1025) { digitalWrite(pinoledsuperior, HIGH); //Acende o led superior } //Le o valor do potenciometro ligado à porta analogica A1 - Eixo Y valory= analogRead(1); //Mostra o valor do eixo Y no serial monitor Serial.print(" | Y:"); Serial.print(valory, DEC); //Testa o valor do Eixo Y e aciona o led correspondente if (valory > -1 & valory <200) { digitalWrite(pinoleddireita, HIGH); //Acende o led da direita } if (valory > 700 & valory <1025) { digitalWrite(pinoledesquerda, HIGH); //Acende o led da equerda } //Lê o valor da porta Digital 7 - Eixo Z valorz = digitalRead(7); //Mostra o valor do Eixo Z no serial monitor Serial.print(" | Z: "); Serial.println(valorz, DEC); //Caso o botão do Eixo Z seja pressionado, acende o led verde if (valorz != 1 ) { digitalWrite(pinoledz, HIGH); } }
Carregue o programa, abra o serial monitor e movimente o potenciometro, observando a variação dos valores do Eixo X (Porta analógica A0), Eixo Y (porta analógica A1) e Eixo Z (porta digital 7).
Gostou? Confira outros posts com Arduino aqui mesmo no Arduino e Cia!
Acho que temos um engano em:
void setup() {
pinMode(7, OUTPUT);
Esse pino deveria ser INPUT, não?
Bom dia Torricelli,
Realmente há um erro, o pino deve ser definido como INPUT.
Remontei o circuito, e vi que por padrão o sinal recebido do eixo Z é HIGH (1), então também será necessário alterar essa linha que acende o led referente ao eixo Z :
//Caso o botão do Eixo Z seja pressionado, acende o led verde
if (valorz != 1 )
O programa já foi corrigido. Muito obrigado e um abraço !
Se mexer na diagonal acendera dois leds ?
Oi Diojaime,
Depende do modelo. Esse especificamente que estou usando não tem uma variação de resistência, tipo um potenciômetro, então o sinal vai ser 0 ou 1, mas existem modelos que tem essa variação, assim você consegue valores intermediários para acender por exemplo dois leds.
Abraço!
Adilson
como você determinou os valores (-1,200,700,1025) a serem testados no if?
Obrigado
Bom dia Leandro,
Usei esse mesmo programa para verificar os valores no serial monitor. Como o joystick é formato por potenciômetros e os valores lidos pela porta analógica variam de 0 a 1024, você terá o 0 (ou -1) em um dos extremos, e 1024 (ou perto disso), quando você girar o potenciômetro para o outro lado.
Espero ter ajudado. Abraços !
teria como acrescentar mais um joystick e mais 4 leds
Boa tarde Marco,
Tem sim, vai ficar meio "apertado", no Arduino Uno, mas é possível.
Abraço !
Excelente Tutorial. O código é limpo e permite uma fácil adaptação para controlar outros componentes através do joystick, como motores DC, etc.
Muito obrigado a toda a equipa.
Um abraço
Boa tarde,
Muito obrigado ! E realmente a idéia é deixar o código o mais enxuto possível para facilitar a adaptação à qualquer projeto.
Abraço e aguardamos sua visita novamente !
na pergunta acima -teria como acrescentar mais um joystick e mais 4 leds, vc me disse que teria como, mais tou tentando e não estou conseguindo, teria como escrever o codigo e enviar ao meu e-mail, obrigado.
[email protected]
na pergunta acima -teria como acrescentar mais um joystick e mais 4 leds, vc me disse que teria como, mais tou tentando e não estou conseguindo, teria como escrever o codigo e enviar ao meu e-mail, obrigado.
[email protected]
Estou com projeto utilizado um joystick e três motores de passo. como faria para controlar o motor utilizado o botão para fazer o girar o motor, apertado uma unica vez, e apertado duas vezes, para motor girasse no sentido contrario e ficasse parado.
Qualquer ajuda seria ótima.
#include
const int passosPorVolta = 300;
Stepper myStepper1(passosPorVolta, 10,11,12,13);
Stepper myStepper2(passosPorVolta, 6,7,8,9);
Stepper myStepper3(passosPorVolta, 2,3,4,5);
int valorx = 0; //Armazena o valor lido do potenciometro – Eixo x
int valory = 0; //Armazena o valor lido do potenciometro – Eixo y
int valorz = 0;
void setup()
{
pinMode(22,INPUT);
myStepper1.setSpeed(100);
myStepper2.setSpeed(100);
myStepper3.setSpeed(100);
}
void loop()
{
valorx = analogRead(6);
if(valorx> -1 & valorx< 200)
{
myStepper2.step(passosPorVolta);
}
if(valorx> 700 & valorx< 1025)
{
myStepper2.step(-passosPorVolta);
}
valory = analogRead(7);
if(valory> -1 & valory< 200)
{
myStepper1.step(passosPorVolta);
}
if(valory> 700 & valory< 1025)
{
myStepper1.step(-passosPorVolta);
}
valorz = digitalRead(22);
}
Aonde eu compro os conectores iguais a esses usados no joystick, com a trava?
Boas, sei que o blog é antigo, mas queria usar 3 joysticks de uma única direção para controlar 3 eixos X, Y, e Z.
Esquerda/Direita X no joystick 1, Cima/Baixo Y no joystick 2, e Cima/Baixo Z no joystick 3. Esta solução não é muito boa no meu ver, trabalho com CNC Industrial e cada eixo têm o seu joystick com 2 movimentos, na vossa solução 1 único joystick com 5 movimentos, mas os 3 eixos são 6 movimentos, gostava de saber como funciona o Z como fazem subir ou descer com um só premir de botão