Componentes eletrônicos, Eletrônica analógica, Hobby, Microcontroladores, Projetos

Tutorial de Arduino (Parte 13, joystick), 2ª edição

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

servos e laser controlados por 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.

Este é o esquemático do projeto. Para o botão do joystick funcionar como uma entrada digital, é necessário ter um resistor de pull-up de 10 kΩ. Os servomotores precisam ser alimentados por uma fonte CC externa, para terem corrente elétrica o suficiente para a operação.

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.

About Pedro Ney Stroski

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *