Esta é a segunda edição do post. É mostrado mais um projeto para controlar servomotores com o joystick, usando um outro método.
Neste tutorial, é mostrado como usar o módulo joystick no Arduino para fazer projetos. Este módulo é parecido com o modelo encontrado nos controles de Playstation.
Como funciona o joystick?
O shield tem dois potenciômetros, estes dão a informação da posição do joystick.

Também tem um botão, para ser pressionado deve apertar o topo do joystick sem estar inclinado.

Tirando o pino. Repare que um potenciômetro é ligado à haste branca, esta fica no meio de dois arcos ligados à outro potenciômetro. Este é o mecanismo gimbal de 2 eixos, que permite os dois potenciômetros se movimentarem ao mesmo tempo.


Os pinos VRx e VRy são as saídas analógicas dos potenciômetros e SW é a saída do botão.


Teste com o modulo joystick
A ligação do módulo com o Arduino.

Este é o código, ao mexer o joystick, os valores analógicos “xValue” e “yValue” devem mudar na janela Serial.

Os valores “xValue” e “yValue” mudam de 0 a 1023 dependendo da posição do joystick, representam os eixos x e y. Estas são as coordenadas x e y que aparecem na tela Serial em relação à posição. Na prática, tem alguma variação.

Controlando LEDs e servomotores
Neste projeto, o joystick controla 4 LEDs de cores diferentes e um servomotor. Cada direção para o qual é inclinado, um LED acende e o servomotor gira um passo, para cada direção diagonal, 2 LEDs acendem.

Para encurtar o código, os pinos dos LEDs não têm nomes, foram chamados simplesmente de 5, 7, 8 e 11. Repare nas declarações como “pinMode(11,OUTPUT);” e nos comandos como “digitalWrite(7,HIGH);”.


Usando bibliotecas
Este é um exemplo de programa usando uma biblioteca para o módulo, aqui está o link. Este exemplo veio da fonte para mostrar o funcionamento desta biblioteca.

Esta declaração define os pinos dos eixos x, y e do botão respectivamente. Aqui foram definidos como pinos analógicas 0 e 1, a entrada do botão é a digital 4.

Este comando imprime os valores dos eixos x e y. O valor de z mostra se o botão está pressionado, no meu caso, false quando pressionado o botão e true o contrário. O 0 e o 100 são os valores mínimos e máximos das coordenadas dos eixos.

Controle de 2 servomotores e laser com joystick

Neste projeto, os potenciômetros do joystick controlam 2 servomotores e o botão controla um módulo laser. Ao apertar uma vez, o laser liga e ao apertar novamente o laser é desligado.

Abaixo o algoritmo que deve ser usado. O controle do botão foi tirado do exemplo do próprio programa do Arduino. O nome é Debounce e está em Digital.
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 | #include <Servo.h> int laserPin=8; int buttonjoy=7; int laserstate=HIGH; //Para que o laser comece desligado. int buttonstate; //O estado atual do botão. int lastbuttonstate=LOW; //O estado anterior do botão. //Ambas as variáveis em milisegundos e devem ser classificadas para //armazenarem mais memória do que int. unsigned long lastDebounceTime = 0; // A última vez que o pino de saída foi //alternado. unsigned long debounceDelay = 50; // O tempo de depuração, estado do //interruptor entre o ligado e o desligado. Aumenta se a saída variar de //forma instável. //Os servos. Servo servoH; Servo servoV; int angle1,angle2; void setup() { pinMode(laserPin,OUTPUT); pinMode(buttonjoy,INPUT); digitalWrite(laserPin,laserstate); servoH.attach(5); servoV.attach(6); servoH.write(90); servoV.write(90); } void loop(){ angle1=map(analogRead(A0),0,1023,0,180); angle2=map(analogRead(A1),0,1023,0,180); //A função map mapeia os valores //da entrada analógica do potenciômetro de 0 a 1023 para ficar entre 0 a 180 //graus. servoH.write(angle1); servoV.write(angle2); delay(50); int readbutton=digitalRead(buttonjoy); //variável que lê o botão. if(readbutton!=lastbuttonstate){ //se o botão for pressionado. lastDebounceTime = millis(); //Reseta o tempo de debouncing. } if((millis()-lastDebounceTime)>debounceDelay){ //millis é o tempo em //milisegundos que o Arduino está rodando com este algoritmo. if(readbutton != buttonstate){ //Se o estado do botão mudou. buttonstate=readbutton; if(buttonstate==HIGH){ //Só alterna o estado do laser se o botão for //pressionado. laserstate = !laserstate; //! significa negação. } } } digitalWrite(laserPin,laserstate); //Coloca o laser no estado atual. lastbuttonstate=readbutton; //Grava a última leitura. } |
Os microservos SG90 são os mais adequados para este projeto. Se usar servomotores grandes, pode correr o risco de overshoot, como mostra o vídeo abaixo.
https://youtube.com/shorts/hQZJ9EMCLSQ?feature=share
O vídeo do projeto funcionando.