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