Publicidade:

quarta-feira, 24 de agosto de 2016

Arduino - Utilizando módulo Joystick

Demonstração do uso de um módulo joystick com Arduino.

O módulo possui 5 pinos: gnd, vcc, pino do botão e mais dois pinos analógicos dos eixos x e y.

Os pinos analógicos nada mais são do que dois potenciômetros ligados nas portas analógicas do Arduino. Caso não saiba como é feita a leitura de um potenciômetro, é interessante aprender antes.

Vídeo:




Código-fonte:

#include <LiquidCrystal_I2C.h>

/*************************************************************************************************************
************************************CLASSE JOYSTICK***********************************************************
*************************************************************************************************************/
class Joystick {
  private:
    boolean _isTop    : 1;
    boolean _isBottom : 1;
    boolean _isLeft   : 1;
    boolean _isRight  : 1;
    unsigned int _x   : 10;
    unsigned int _y   : 10;
    byte _pinX;
    byte _pinY;
    byte _pinZ;
    float _angle;
  public:
    Joystick(int pinX, int pinY, int pinZ){
      _pinX = pinX;
      _pinY = pinY;
      _pinZ = pinZ;
      pinMode(pinX, INPUT);
      pinMode(pinY, INPUT);
      pinMode(pinZ, INPUT_PULLUP);
    }
    update() {
      _x = analogRead(_pinX);
      _y = analogRead(_pinY);
      _isTop    = (_y < 200);
      _isBottom = (_y > 800);
      _isRight  = (_x < 200);
      _isLeft   = (_x > 800);

      float distX = 0;
      float distY = 0;

      if (_x < 480) { distX = 480 - _x; }
      if (_x > 525) { distX = 525 - _x; }
      if (_y < 480) { distY = 480 - _y; }
      if (_y > 525) { distY = 525 - _y; }

      if (!(distX == 0 && distY == 0)){
        _angle = degrees(atan2(distY, distX));    //degrees --> converte de radianos (retornado por atan2) para graus
      } else {
        _angle = 0;
      }

      if (_angle < 0) { _angle = _angle + 360; }
    }
    boolean isTop()      { return _isTop; }
    boolean isBottom()   { return _isBottom; }
    boolean isLeft()     { return _isLeft; }
    boolean isRight()    { return _isRight; }
    unsigned int readX() { return _x; }
    unsigned int readY() { return _y; }
    float readAngle()    { return _angle; }
    byte buttonRead()    { return digitalRead(_pinZ); }

    byte readTop() { if (_y < 480) { return map(_y, 480, 0, 0, 255); } return 0; }
    byte readBottom() { if (_y > 525) { return map(_y, 525, 1023, 0, 255); } return 0; }
    byte readLeft() { if (_x > 525) { return map(_x, 525, 1023, 0, 255); } return 0; }
    byte readRight() {if (_x < 480) { return map(_x, 480, 0, 0, 255); } return 0;}
};
/*************************************************************************************************************
************************************FIM CLASSE CLASSE JOYSTICK************************************************
*************************************************************************************************************/
  
Joystick joystick(A1, A2, A0);   //pino analogico eixo x,   pino analógico eixo y,   pino digita botão
LiquidCrystal_I2C lcd(0x3F,20,4);

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();

  byte c0[8] = {B00100,  B01110,  B10101,  B00100,  B00100,  B00100,  B00100,  B00000 };  //seta cima
  byte c1[8] = {B00100,  B00100,  B00100,  B00100,  B10101,  B01110,  B00100,  B00000 };  //seta baixo
  lcd.createChar(0, c0);  
  lcd.createChar(1, c1);  
}

void loop() {
  
  static unsigned long mref = 0;
  if (millis() - mref > 500) {
    mref = millis();
    
    joystick.update();             //antes de fazer a leitura dos valores, é necessário chamar o update. 
    
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print((int)joystick.readAngle());
    lcd.write(223);

    lcd.setCursor(8,0);
    
    if (joystick.isTop()) { lcd.write(0); }
    if (joystick.isBottom()) { lcd.write(1); }
    if (joystick.isLeft()) { lcd.write(127); }
    if (joystick.isRight()) { lcd.write(126); }

    lcd.setCursor(0,1);
    lcd.print("x: ");
    lcd.print(joystick.readX());
    lcd.setCursor(8,1);
    if (joystick.readLeft() > 0) { 
      lcd.print("left: ");
      lcd.print(joystick.readLeft());  //mostra a leitura analógica para a esquerda de 0 a 255
    }
    if (joystick.readRight() > 0) { 
      lcd.print("right: ");
      lcd.print(joystick.readRight()); //mostra a leitura analógica para a direita de 0 a 255
    }
    
    lcd.setCursor(0,2);
    lcd.print("y: ");
    lcd.print(joystick.readY());
    lcd.setCursor(8,2);
    if (joystick.readTop() > 0) { 
      lcd.print("top: ");
      lcd.print(joystick.readTop()); //mostra a leitura analógica para cima de 0 a 255
    }
    if (joystick.readBottom() > 0) { 
      lcd.print("bottom: ");
      lcd.print(joystick.readBottom()); //mostra a leitura analógica para baixo de 0 a 255
    }

    lcd.setCursor(0,3);
    lcd.print("z: ");
    lcd.print(joystick.buttonRead());  //mostra se o botão (eixo z) foi pressionado
    
  }
}


Um comentário: