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