14 setembro 2013

Módulo Joystick Arduino

Para iniciar este artigo eu ia elaborar uma definição sobre o joystick, mas não encontrei definição 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 artigo de hoje, onde vou testar um módulo Joystick fornecido pela FilipeFlop, 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 joystick.

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).


Joystick - detalhe potenciômetrosJoystick - detalhe conectores

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).

Circuito - Arduino com módulo joystick

Devido à quantidade de conexões, uma boa idéia é utilizar este shield para sensores, que você também encontra na Loja FILIPEFLOP. Principalmente se, além do joystick, você utilizar em seus projetos outros sensores e motores :
Arduino Sensor Shield
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. 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).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 //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);  
 }  
}  

11 comentários:

  1. Acho que temos um engano em:
    void setup() {
    pinMode(7, OUTPUT);
    Esse pino deveria ser INPUT, não?

    ResponderExcluir
    Respostas
    1. 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 !

      Excluir
  2. como você determinou os valores (-1,200,700,1025) a serem testados no if?

    Obrigado

    ResponderExcluir
    Respostas
    1. 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 !

      Excluir
    2. teria como acrescentar mais um joystick e mais 4 leds

      Excluir
    3. Boa tarde Marco,

      Tem sim, vai ficar meio "apertado", no Arduino Uno, mas é possível.

      Abraço !

      Excluir
  3. 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

    ResponderExcluir
    Respostas
    1. 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 !

      Excluir
  4. 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.
    marcoamars@hotmail.com

    ResponderExcluir
  5. 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.
    marcoamars@hotmail.com

    ResponderExcluir
  6. 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);
    }

    ResponderExcluir