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
}
}
buenisimo!..muchas gracias
ResponderExcluir