Ciao a tutti, sto per costruire una button box per simulatori di guida, sostanzialmente una tastiera con un aspetto più "racing" e avrei alcune domande prima di iniziare la costruzione. Al momento il mio codice gestisce 30 pulsanti in una matrice usando la libreria "Keypad" più un segnale analogico, il tutto interfacciato tramite la libreria "Joystick" e sembra funzionare perfettamente. Per la button box volevo aggiungere alcuni interruttori on-off e degli switch momentanei a 3 posizioni e qui iniziano i miei dubbi.
Sugli switch on-off volevo collegare dei led che si accendano quando l'interruttore chiude il circuito, pensavo di metterli banalmente in serie prima o dopo l'interruttore. Sapreste dirmi se la disposizione è corretta e se serve un qualche tipo di resistenza?
Per quanto riguarda invece gli interruttori momentanei volevo sapere se fosse possibile avere un segnale "pulsato" tramite codice? (mi servirebbe per delle regolazioni della vettura su più livelli (tipo TC e ABS) e devo premere il pulsante per ogni livello di regolazione, mentre io vorrei tenerlo premuto e scorrere tra i livelli)
Capisco siano richieste abbastanza generiche ma purtroppo ho un'esperienza molto limitata su arduino e non ho trovato spiegazioni molto chiare online, soprattutto combinando queste due librerie.
Inserisco il mio codice (senza ancora nessuna modifica particolare per questo uso) giusto per rendere più chiaro il tutto.
#include <Keypad.h> //libreria per la matrice di pulsanti
#include <Joystick.h>
#define ENABLE_PULLUPS
//variabili
#define ROWS 6 //6 righe
#define COLS 5 //5 colonne
int PinFAM = A3; //Pin Freno a mano = A1
int FAM;
char keys[ROWS][COLS] = { // inserisco i nomi dei pulsanti, posso usare qualsiasi lettera/numero
{0,1,2,3,4}, // il programma funziona solo se parto da 0
{5,6,7,8,9},
{10,11,12,13,14},
{15,16,17,18,19},
{20,21,22,23,24},
{25,26,27,28,29}
};
byte rowPins[ROWS] = {4,5,6,7,8,9}; //definisco i pin che compongono le righe della matrice a cui andrò a collegare gli interruttori
byte colPins[COLS] = {A0,15,14,16,10}; // definisco i pin che compongono le colonne della matrice a cui andrò a collegare gli interruttori
Keypad matrix = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // creo la tastiera
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_JOYSTICK,
30, 0, // Button Count, Hat Switch Count
false, true, false, // X, Y, NO Z Axis
false, false, false, // No Rx, Ry, or Rz
false, false, // No rudder or throttle
false, false, false); // No accelerator, brake, or steering
void setup() {
//Inizializzo il segnale del freno a mano a 0
Joystick.begin(); //inizializzo la libreria
}
void loop() {
// put your main code here, to run repeatedly:
FAM= analogRead(PinFAM); //Leggo il valore sul pin A1 per il freno a mano
//Serial.println(FAM);
//delay(1);
int FAM_MAP=map(FAM, 480, 670, 0, 1023); //tramite lo sketch analogReadSerial leggo i valori in uscita dal potenziometro montato nella configurazione scelta, mappo il più basso (più una piccola zona morta) a 0 e il massimo a 1023
//in questo modo evito di partire da un valore non nullo e utilizzo tutto il range del potenziometro. (POSSIBILE PERDITA DI RISOLUZIONE DOVUTA AL FATTO CHE FAM E FAM_MAP SONO int)
{Joystick.setYAxis(FAM_MAP);} //Mando il valore del pin A1
CheckAllButtons(); //RIchiamo la funzione per controllare i pulsanti
}
void CheckAllButtons(void) { //Creo una funzione per controllare lo stato dei pulsanti
if (matrix.getKeys())
{
for (int i=0; i<LIST_MAX; i++)
{
if ( matrix.key[i].stateChanged )
{
switch (matrix.key[i].kstate) {
case PRESSED:
case HOLD:
Joystick.setButton(matrix.key[i].kchar, 1);
break;
case RELEASED:
case IDLE:
Joystick.setButton(matrix.key[i].kchar, 0);
break;
}
}
}
}
}