Go Down

Topic: Aiuto button box con 32 pulsanti (Read 1 time) previous topic - next topic

fausto90

Aug 17, 2019, 07:35 pm Last Edit: Aug 18, 2019, 11:57 pm by fausto90
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?


Code: [Select]

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

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
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

uwefed

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

Quote
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

Standardoil

concorquoto,
ma aspetto che lo OP mi risponda
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

fausto90

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.

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
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

fausto90

#6
Aug 26, 2019, 09:12 am Last Edit: Aug 26, 2019, 10:11 am by gpb01
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?

Standardoil

Pulsanti contemporanei senza diodi?
E cosa vorresti usare?
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

docdoc

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.

Quote
Posso mettere il link della pagina del forum?
Certamente
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

fausto90

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.

https://forum.arduino.cc/index.php?topic=596921.0

Standardoil

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...
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

docdoc

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.
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

fausto90

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.

Standardoil

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
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

Claudio_FF

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.
* * * * Una domanda ben posta è già mezza risposta * * * *

Go Up