joystick bottoni e axis

Ciao,

Ho trovato uno sketch e modificato per arduino micro pro
siccome di informatica non so nulla, come posso fare per creare 16 bottoni con 4 righe e 4 colonne?

#include <Joystick.h>

#define PINS 13
#define ENABLE_ANALOG1 true
int Z = A1;
int rudder = A2;
int throttle = A3;

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, PINS, 0, 
  true, true, false, false, false, false, false, false, false, false, false);

class CButton {
  public:
  int pin = NULL;
  int lastState = 0;
  
  CButton(int p) {
    pin = p;
  }
};

CButton Buttons[PINS] ={2,3,4,5,6,7,8,9,10,16,14,15,A0};

void setup() {
  for(int i=0 ; i<PINS ;i++) {
    pinMode(Buttons[i].pin, INPUT_PULLUP);
  }

  Joystick.begin();
  if (ENABLE_ANALOG1) {
    Joystick.setZAxisRange(-512, 512);
    Joystick.setRudderRange(0, 1023);
    Joystick.setThrottleRange(0, 1023);
  }
}

void JButtonStates() {
  if (ENABLE_ANALOG1) {
    Joystick.setZAxis(analogRead(Z) - 512);
    Joystick.setRudder(analogRead(rudder));
    Joystick.setThrottle(analogRead(throttle));
  }
  
  for (int i = 0; i < PINS; i++) {
    int currentState = !digitalRead(Buttons[i].pin);
    
    if (currentState != Buttons[i].lastState) {
      Joystick.setButton(i, currentState);
      Buttons[i].lastState = currentState;
    }
  }  
}

void loop() {
  JButtonStates();
  delay(50);
}

grazie

ho trovato un codice sul forum, ho cercato di adattarlo al mio arduino micro pro

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS

#define NUMBUTTONS 16
#define NUMROWS 4
#define NUMCOLS 4


int X1 = A0;
int Y1 = A1;
int rudder = A2;
int throttle = A3;

byte buttons[NUMROWS][NUMCOLS] = {
  {0, 1, 2, 3},
  {4, 5, 6, 7},
  {8, 9, 10, 11},
  {12, 13, 14, 15},
};

byte rowPins[NUMROWS] = {6, 7, 8, 9};
byte colPins[NUMCOLS] = {2, 3, 4, 5};

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 16, 0,
                   true, true, false, false, false, false, false, false, false, false, false);

void setup() {
  Joystick.begin();
  Joystick.setXAxisRange(-512, 512);
  Joystick.setYAxisRange(-512, 512);
  Joystick.setRudderRange(0, 1023);
  Joystick.setThrottleRange(0, 1023);
}

void JButtonStates() {
  Joystick.setXAxis(analogRead(X1) - 512);
  Joystick.setYAxis(analogRead(Y1) - 512);
  Joystick.setRudder(analogRead(rudder));
  Joystick.setThrottle(analogRead(throttle));
}

void loop() {
  JButtonStates();
  delay(50);
}

void loop() {

  CheckAllButtons();
}

void CheckAllButtons(void)
{
  if (buttbx.getKeys())
  {
    for (int i = 0; i < LIST_MAX; i++)
    {
      if ( buttbx.key[i].stateChanged )
      {
        switch (buttbx.key[i].kstate)
        {
          case PRESSED:
          case HOLD:
            Joystick.setButton(buttbx.key[i].kchar, 1);
            break;
          case RELEASED:
          case IDLE:
            Joystick.setButton(buttbx.key[i].kchar, 0);
            break;
        }
      }
    }
  }
}

mi da il seguente errore

Arduino:1.8.12 (Windows Store 1.8.33.0) (Windows 10), Scheda:"Arduino Micro"

C:\Users\clabi\AppData\Local\Temp\arduino_modified_sketch_584403\botton.ino: In function 'void loop()':

botton:57:6: error: redefinition of 'void loop()'

 void loop() {

      ^~~~

C:\Users\clabi\AppData\Local\Temp\arduino_modified_sketch_584403\botton.ino:52:6: note: 'void loop()' previously defined here

 void loop() {

      ^~~~

exit status 1
redefinition of 'void loop()'

come posso risolvere?
Grazie

risolto avevo ripetuto void loop

... esatto, sia della funzione setup(), che della funzione loop(), può essere presente solo UNA definizione all'interno del tuo programma. :wink:

Guglielmo

per collegare i pulsanti conviene utilizzare dei diodi?

Perché non prendi una semplice tastiera a membrana che ha già tutte le connessioni a matrice già fatte ?

Comunque NO ... se tu attivi colonna per colonna e leggi riga per riga.

Guglielmo

per il mio progetto non mi piace la tastiera a membrana

invece i valori dei axis li vedo dopo se sono corretti?

come posso collegare un rotary encoder quando lo ruoto a sx mi preso tasto 14 e ruotando a destra mi preme il tasto 15?

ho un problema con Rudder e Throttle nel pannello di controllo di Windows funziona, ma nel gioco non viene riconosciuto quando faccio la configurazione, solo i bottoni mi riconosce.
che cosa posso fare?