botton box con potenziometro ed encoder su arduino micro

Salve a tutti!
Mi sono da poco appassionato ai sim racing.
Dopo aver fatto la parte meccanica (un freno a mano collegato ad un potenziometro lineare e una botton box con encoder, switch e semplici pulsanti) ho provato ad unire due programmi gia fatti trovati in rete in modo da aver un solo cavo usb collegato al computer al posto di due.
Ho modificato il programma in modo che il anale A0 funzioni per il potenziometro lineare mentre gli altri canali servirebbero a gestire 4 encoder e 15 pulsanti.
il problema nasce che facendo una prova in impostazioni dispositivo il programma sembra funzionare ma nel momento che il potenziometro va a 0 mi si accendono 4 pulsanti e non appena sposto il potenziometro di qualche mm verso il lato opposto questi pulsanti si spengono.
Il tutto l’ho provato collegando fisicamente il solo potenziometro.
C’è qualcosa di sbagliato nel programma?

// Analog eBrake-Handbrake
// PIN A0 to 10k pot output - Throttle Axis
// Use with Arduino ProMicro.
// Tested and working in DiRT RALLY + ASSETTO CORSA
// by AMSTUDIO
// 20.1.2017

#include <Joystick.h>
#include <Keypad.h>
#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 20
#define NUMROWS 4
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
 {0, 1, 2, 3, 4},
 {5, 6, 7, 8, 9},
 {20, 21, 22, 23},
};

struct rotariesdef {
 byte pin1;
 byte pin2;
 int ccwchar;
 int cwchar;
 volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
 {0, 1, 24, 25, 0},
 {2, 3, 26, 27, 0},
 {4, 5, 28, 29, 0},
 {6, 7, 30, 31, 0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
 // R_START (00)
 {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
 // R_CCW_BEGIN
 {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
 // R_CW_BEGIN
 {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
 // R_START_M (11)
 {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
 // R_CW_BEGIN_M
 {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
 // R_CCW_BEGIN_M
 {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
 // R_START
 {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
 // R_CW_FINAL
 {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
 // R_CW_BEGIN
 {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
 // R_CW_NEXT
 {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
 // R_CCW_BEGIN
 {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
 // R_CCW_FINAL
 {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
 // R_CCW_NEXT
 {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

byte rowPins[NUMROWS] = {21, 19, 18, 15};
byte colPins[NUMCOLS] = {14, 16, 10, 9, 8};

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

void setup()

{ pinMode(A0, INPUT);
 Joystick.begin();
 rotary_init();
}

const int pinToButtonMap = A0;

void loop()

{ int pot = analogRead(A0);
 int mapped = map(pot, 0, 1023, 0, 255);
 {
   Joystick.setThrottle(mapped);
 }
 { CheckAllEncoders();

   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;
       }
     }
   }
 }
}

void rotary_init() {
 for (int i = 0; i < NUMROTARIES; i++) {
   pinMode(rotaries[i].pin1, INPUT);
   pinMode(rotaries[i].pin2, INPUT);
#ifdef ENABLE_PULLUPS
   digitalWrite(rotaries[i].pin1, HIGH);
   digitalWrite(rotaries[i].pin2, HIGH);
#endif
 }
}


unsigned char rotary_process(int _i) {
 unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
 rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
 return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
 for (int i = 0; i < NUMROTARIES; i++) {
   unsigned char result = rotary_process(i);
   if (result == DIR_CCW) {
     Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
   };
   if (result == DIR_CW) {
     Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
   };
 }
}

Grazie

>bingo1200: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, fino a quando non avrai sistemato il post qui sopra, nessuno ti potrà rispondere, quindi ti consiglio di sistemarlo al più presto. :wink:

Grazie dovrebbe essere a posto così... In caso provo a ricorreggere il post!

E' a posto, grazie.

Guglielmo

P.S.: Una nota ... quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce. Gli utenti da device "mobile" ringrazieranno per la cortesia :wink:

...anche gli altri! :slight_smile:

Scusate non avevo pensato a chi si connette da cellulare