Aiuto button box con 32 pulsanti

Salve, vorrei sapere se è possibile usare arduino Leonardo per costruire un Button Box con 32 funzioni (Pulsanti N.O.). Ho trovato su internet tante soluzioni ma nessuno che impieghi cosi tanti comandi di solito vengonmo impiegati i pin analogici ma non capisco i collegamenti.
Sotto metto lo sketch che ho trovato ma nella guida usano arduino micro e come sapete gia le uscite non combaciano con l’arduino leonardo in mio possesso.

Qualcuno mi puo aiutare?

//Simple buttonbox sketch
//Supports up to 25 buttons and up to 4 encoders
//version 0.2 by TOPMO3
//
//
//Arduino IDE 1.6.6 (or above) !
//
//Joystick library from  Matthew Heironimus, https://github.com/MHeironimus/ArduinoJoystickLibrary
// 
//Encoders code from Ben Buxton
//More info: http://www.buxtronix.net/2011/10/rotary-encoders-done-properly.html
// 
//Thank you guys! :)
//



//Uncomment this for HALFSTEP encoder operation
//#define HALF_STEP

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



#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 25
#define NUMROWS 5
#define NUMCOLS 5


//define the symbols on the buttons of the keypads
byte buttons[NUMROWS][NUMCOLS] = {
 {1,2,3,4,5},
 {6,7,8,9,10},
 {11,12,13,14,15},
 {16,17,18,19,20},
 {21,22,23,24,25},
};



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

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



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

#ifdef HALF_STEP
// Use the half-step state table (emits a code at 00 and 11)
#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
// Use the full-step state table (emits a code at 00 only)
#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,20,19,18,15}; //connect to the row pinouts of the keypad
byte colPins[NUMCOLS] = {14,16,10,9,8}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 

//initialize an Joystick with 34 buttons;
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
 JOYSTICK_TYPE_JOYSTICK, 34, 0,
 false, false, false, false, false, false,
 false, false, false, false, false);


void setup() {
 Joystick.begin();
 rotary_init();
}



void loop() { 

 CheckAllEncoders();

 CheckAllButtons();

}


void CheckAllButtons(void) {
     if (buttbx.getKeys())
   {
      for (int i=0; i<LIST_MAX; i++)   // Scan the whole key list.
       {
          if ( buttbx.key[i].stateChanged )   // Only find keys that have changed state.
           {
           switch (buttbx.key[i].kstate) {  // Report active key state : IDLE, PRESSED, HOLD, or RELEASED
                   case PRESSED:
                   case HOLD:
                             Joystick.setButton(buttbx.key[i].kchar, 1);
                             break;
                   case RELEASED:
                   case IDLE:
                             Joystick.setButton(buttbx.key[i].kchar, 0);
                             break;
           }
          }   
        }
    }
}


/* Call this once in setup(). */
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
 }
}


/* Read input pins and process for events. Call this either from a
* loop or an interrupt (eg pin change or timer).
*
* Returns 0 on no event, otherwise 0x80 or 0x40 depending on the direction.
*/
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);
   };
 }
}

Boh, non vedo problema
Specifica se hai 32 pulsanti o 32 interruttori
E se sono pulsanti se è possibile che siano premuti anche più di uno contemporaneamente

Lo sketch é per una matrice 5x5 ovvero 25 pulsanti.

Sotto metto lo sketch che ho trovato ma nella guida usano arduino micro e come sapete gia le uscite non combaciano con l’arduino leonardo in mio possesso.

Il Leonardo e il MICRO hanno lo stesso controllore percui gli sketch funzionano al 100%
Non ho capito cosa intendi per le uscite che non combaciano. Non combaciano meccanicamente ma elettricamente sono uguali.

Una matrice di pulsanti é facile da controllare e se ogni pulsante é in serie con un diodo possono essere letti anche piú pulsanti premuti contemporaneamente. La lettura non é specifica per un controlare che vuol dire che funziona con tutti i diversi controller.

Senza diodi non puoi leggere 2 pulsanti premuti contemporaneamente.

Le entrate analogiche possono essere usate come entrate/uscite digiali con numerazione 14 a 19.

Si possono leggere pulsanti anche usandoli con ripartitori resistivi ma anche in questo caso non puoi riconoscere 2 tasti premuti in contemporanea. noltre il numero di pulsanti per entrata analogica é limitata.

Ciao Uwe

concorquoto,
ma aspetto che lo OP mi risponda

Standardoil:
Boh, non vedo problema
Specifica se hai 32 pulsanti o 32 interruttori
E se sono pulsanti se è possibile che siano premuti anche più di uno contemporaneamente

Ciao grazie per la risposta, allora a me occorre modificare quello sketch in modo da poter usare sia pulsanti N.O. sia interruttori on/off.
Il problema sopra è che quello sketch ha solo la funzione di impulsi quindi con pulsanti momentanei e poi tra l'altro la matrice come detto è per 25 pulsanti ma se provo a collegare i pulsanti e schiaccio un paio mi ritrovo con tutta la matrice in on quindi non riesco a capire se c'è un problema di collegamento oppure un errore software.
Per questo chiedevo un aiuto sia nella realizzazione dello sketch sia nella realizzazione di uno schema di collegamento fisico dei pulsanti.

Modificare quel programma è inutile
Fai prima a partire da zero
Nel post 2 UWE ti ha spiegato come evitare il problema con 2 o più tasti premuti
Se cerchi un po' qui sul forum trovi suggerimenti

Standardoil:
Modificare quel programma è inutile
Fai prima a partire da zero
Nel post 2 UWE ti ha spiegato come evitare il problema con 2 o più tasti premuti
Se cerchi un po' qui sul forum trovi suggerimenti

Non posso utilizzare diodi o resistenze ma utilizzerei la resistenza interna di Arduino sul forum ho trovato qualcun'altra che ha realizzato come me un Button box ma ovviamente non condivide lo sketch finale ma soltanto quelli dove aveva problemi.
Mi potete aiutare voi?
Posso mettere il link della pagina del forum?

Pulsanti contemporanei senza diodi?
E cosa vorresti usare?

fausto90:
Non posso utilizzare diodi o resistenze ma utilizzerei la resistenza interna di Arduino

Stando così le cose (non capisco bene la limitazione ma ok diamola per buona) i pulsanti non puoi metterli in una matrice perché se vuoi poter avere più di un pulsante premuto contemporaneamente devi usare 32 ingressi digitali.

Io non ho mai usato una Leonardo ma temo che o usi uno schema con diodi e pulsanti a matrice, oppure devi passare ad una Mega.

Posso mettere il link della pagina del forum?

Certamente

docdoc:
Stando così le cose (non capisco bene la limitazione ma ok diamola per buona) i pulsanti non puoi metterli in una matrice perché se vuoi poter avere più di un pulsante premuto contemporaneamente devi usare 32 ingressi digitali.

Io non ho mai usato una Leonardo ma temo che o usi uno schema con diodi e pulsanti a matrice, oppure devi passare ad una Mega.

Certamente

Allora qui sul forum ho trovato questo che guarda caso è proprio come lo devi realizzare io. Il Button box lo devo collegare al PC come periferica joystick per questo credo di non dover usare nessun diodi o resistenza.
Vi lascio il link dell'altro post in modo che chi ha più esperienza di me in campo potrà farsi un idea di cosa vorrei realizzare.

Bah, io continuo a non vedere problemi…
Per cominciare chiedi allo OP di quella discussione se ti posta (e magari lo pubblica anche) la soluzione che ha trovato (con l’aiuto di docdoc)
e poi puoi sempre ‘leggere’ quella discussione, che come la soluzione esiste(va) per quello OP esiste(rà) anche per te.
Casomai fai domande mirate per le cose che non ti sono chiare…

fausto90:
Allora qui sul forum ho trovato questo che guarda caso è proprio come lo devi realizzare io.

Quello è un keypad, e si preme UN pulsante per volta. Tu hai detto di volerne premere anche più di uno contemporaneamente (tra l'altro hai anche parlato di interruttori oltre che di pulsanti), e Standardoil ha postato come fare, aggiungendo i diodi.

Per cui o ti basta un pulsante per volta e quindi non devi usare diodi, o vuoi poterne premere 2 o più contemporaneamente e quindi devi usare lo schema di Standardoil.

Altre alternative implicano altri circuiti da aggiungere (un multiplexer ad esempio), che sono sicuramente più complicati per te da gestire rispetto ai diodi.

docdoc:
Quello è un keypad, e si preme UN pulsante per volta. Tu hai detto di volerne premere anche più di uno contemporaneamente (tra l'altro hai anche parlato di interruttori oltre che di pulsanti), e Standardoil ha postato come fare, aggiungendo i diodi.

Per cui o ti basta un pulsante per volta e quindi non devi usare diodi, o vuoi poterne premere 2 o più contemporaneamente e quindi devi usare lo schema di Standardoil.

Altre alternative implicano altri circuiti da aggiungere (un multiplexer ad esempio), che sono sicuramente più complicati per te da gestire rispetto ai diodi.

Grazie per la risposta, io non devo necessariamente pigiare di pulsanti/interruttori contemporaneamente, ma devo fare in modo che pigiando il pulsante/interruttore 1 e quindi dando il comando on e supponendo di volerlo lasciare in ON posso ugualmente pigiare e magari mantenere in On anche altri 10 pulsanti/ interruttori.
Ho provato a chiedere direttamente in quell'altro post ma nessuno mi ha dato risposta quindi credo che nessuno mai risponderà li.

Quello che cerchi non esiste
O metti i diodi
Oppure non premi tasti in contemporanea
Decidi e facci sapere
Inoltre io ti avevo detto di chiedere non sulla discussione, ma direttamente a quel OP,
E di 'leggerla' quella discussione

fausto90:
non devo necessariamente pigiare di pulsanti/interruttori contemporaneamente, ma devo fare in modo che pigiando il pulsante/interruttore 1 e quindi dando il comando on e supponendo di volerlo lasciare in ON posso ugualmente pigiare e magari mantenere in On anche altri 10 pulsanti/ interruttori.

Se capisco bene vuoi attivare una particolare funzione facendo click su un pulsante, e lasciarla attiva anche facendo poi click su altri pulsanti dopo aver rilasciato il primo (come se fossero interruttori bistabili). Questo non è un problema hardware di collegamenti, ma software di gestione.

Claudio_FF:
Se capisco bene vuoi attivare una particolare funzione facendo click su un pulsante, e lasciarla attiva anche facendo poi click su altri pulsanti dopo aver rilasciato il primo (come se fossero interruttori bistabili). Questo non è un problema hardware di collegamenti, ma software di gestione.

Metto il link di un video così vi chiarite le idee di cosa devo creare.
Non credo che non si possa fare in quanto altri hanno fatto quello che vorrei fare io ma molti usano Arduino micro o qualcosa del genere e come saprete già i pin non sono uguali con Arduino leonardo.

Non guarderò un video per sapere quello che vuoi per poi fare io il lavoro per te
Non ci credi che quello che cerchi è impossibile?
Ok, ok dimostra di essere più bravo di me: chiedi tu a quello che ha fatto il video, fallo anche tu, dimostra a tutti che mi sbagliavo....
Non è difficile.... Basta farlo

Ma non venire qui a chiedere per poi ignorare quello che ti si dice, se chiedi abbi almeno la 'decenza' di darci fiducia, altrimenti cosa chiedi a fare?

>Standardoil: ancora una volta ti invito SOLO a dare risposte e soluzioni tecniche e NON tuo commenti o opinioni personali. Se non vuoi aiutare nessuno ti obbliga, ma, anche nel rispetto del REGOLAMENTO, punti 16.2 e 16.4 astieniti da tue considerazioni personali.

Questo è il mio ultimo avviso prima di prendere altri provvedimenti (... te lo avevo già scritto in MP a suo tempo, MP che tu ignori).

Guglielmo

C'è del giusto in quello che dice Guglielmo
Purché non finisca come quell'altro, che dopo ci ha anche accusato di avergli fatto perdere tempo e soldi...

Standardoil:
Non guarderò un video per sapere quello che vuoi per poi fare io il lavoro per te
Non ci credi che quello che cerchi è impossibile?
Ok, ok dimostra di essere più bravo di me: chiedi tu a quello che ha fatto il video, fallo anche tu, dimostra a tutti che mi sbagliavo....
Non è difficile.... Basta farlo

Ma non venire qui a chiedere per poi ignorare quello che ti si dice, se chiedi abbi almeno la 'decenza' di darci fiducia, altrimenti cosa chiedi a fare?

Guarda io non sono di certo bravo, se lo fossi non sarei qui a chiedere aiuto non credi?!?
Lasciando il fatto della scortesia, io chiedo veramente aiuto e non capisco perché mai una persona non deve guardare qualcosa, forse perché si renderebbe conto di avere sbagliato?
Io sto cercando aiuto per un progetto semplice non posso realizzare cose complesse non avrebbe senso visto che il buttonbox utilizza la libreria joystick e la libreria keyboard, e da quello che ho letto non occorre utilizzare resistenze e/o diodi per la matrice, per questo insisto nell'invitarvi a guardare i 1000video che ci sono su internet per rendervi conto che in effetti con questo progetto non occorre nessun tipo di hardware ulteriore.
Ho chiesto più volte lasciando commenti in tutti i video ma mai nessuno mi ha risposto dandomi delle soluzioni, e ad oggi mi ritrovo con uno sketch semifunzionante.