![]() |
|
Costruiamo un Joypad !
Salve a tutti, questa volta vedremo come costruirsi una specie di joypad analogico sfruttando unicamente componenti abbastanza comuni, nella fattispecie una breadboard dei pulsanti e delle resistenze e che per di più usa 1 solo pin di Arduino!
Con quale principio funziona?
Il trucco è questo:
tutti sappiamo che arduino è in grado (tramite analogread) di leggere una tensione che và da 0 a 5V con una risoluzione di 10 bit che tradotto in linguaggio comune significa che nella scala da 0 a 5v arduino è in grado di apprezzarre 1024 "gradini" e quindi variazioni di 0.004 v. Quindi possiamo sfruttare questa capacità per nostro Joypad in uesto modo, immaginate di avere un solo pulsante con una resistenza di valore x in serie, quando il pulsante viene premuto, arduino leggerà la tensione che c'è sul pin analog "attenuata" dalla resistenza di valore x inclusa nel circuito, a questo punto aggiungiamo in parallelo a questo semplice circuito (tasto + resistenza) un circuito analogo ma con resistenza di valore Y e vediamo cosa succede...
Quando premeremo il primo tasto, questo chiuderà il suo circuito tramite la resistenza e già sappiamo cosa succederà, stessa cosa per il secondo tasto ma con la differenzaa che essendoci una resistenza diversa da quella di valore X, arduino leggerà un valore diverso, ed anche prremendo i due tasti contemporaneamente avremo una lettura su arduino che sarà diversa, come se avessimo una terza resistenza in serie ai tasti, ed il suo valore Z sarà : Z=1/x + 1/y + 1/n....
Le resistenze che andremo ad utilizzare avranno i seguenti valori:
R0=1 kOhm
R1=220 Ohm
R2=390 Ohm
R3=680 Ohm
R4=2.2 kOhm
R5=4.7 kOhm
R6 =10 kOhm
Con questo principio sarebbe possibile aggiungere molti tasti, ma in verità è difficille trovare combinazioni di resistenze che riescano a stare in un arco di valori accettabili, ma fortunatamente a noi bastano 6 pulsanti.
Collegate le resistenze ed i tasti come vedete nell'immagine qui sopra.
Questo layout và bene quando avete semplicemente bisogno di 6 tastii nel vostro progetto ed avete pochi pin dispon ibili su arduino, ma siccome il nostro obbiettivo è avere un joypad modifichiamo il montaggio come vedete nell'immagine successiva.
Così avremo una configurazione del tipo Sù, Giù, Destra, Sinistra, tasto1, tasto2.
Il codice per la lettura dei tasti scritto da Michael Pilcher ci permetterà di leggere la pressione dei tasti ed anche di alcune combinazioni!
Per comodità di lettura i commenti del codice sono stati tradotti :)
Created By: Michael Pilcher
February 24, 2010
*/
int j = 1; // integer usato per scannare l'array che conterra la colonna
//creiamo un array bidimensionale per assegnare ai rasti i valori alti e bassi
int Button[21][3] = {{1, 837, 838}, // button 1
{2, 737, 738}, // button 2
{3, 610, 611}, // button 3
{4, 318, 319}, // button 4
{5, 178, 179}, // button 5
{6, 91, 92}, // button 6
{7, 896, 897}, // button 1 + button 2
{8, 877, 878}, // button 1 + button 3
{9, 851, 852}, // button 1 + button 4
{10, 844, 845}, // button 1 + button 5
{11, 840, 841}, // button 1 + button 6
{12, 821, 822}, // button 2 + button 3
{13, 769, 770}, // button 2 + button 4
{14, 753, 754}, // button 2 + button 5
{15, 745, 746}, // button 2 + button 6
{16, 674, 675}, // button 3 + button 4
{17, 643, 644}, // button 3 + button 5
{18, 627, 627}, // button 3 + button 6
{19, 408, 409}, // button 4 + button 5
{20, 363, 364}, // button 4 + button 6
{21, 243, 243}}; // button 5 + button 6
int analogpin = 5; // analog pin usato per leggere i tasti
int label = 0; // etichetta che contiene il nome del tasto
int counter = 0; // quante volte abbiamo visto un nuovo valore
long time = 0; // l'ultima volta che il pin è stato letto
int debounce_count = 50; // bumero di millis/samples prima di considerare la variazione
int current_state = 0; // Il valore variato
int ButtonVal;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (millis() != time)
{
// leggi l' analog pin per il valore dei tasti e memorizzalo in ButtonVal
ButtonVal = analogRead(analogpin);
if(ButtonVal == current_state && counter >0)
{
counter--;
}
if(ButtonVal != current_state)
{
counter++;
}
// Se il tasto è premuto per un tempo sufficiente allora cambiamo lo stato
if (counter >= debounce_count)
{
counter = 0;
current_state = ButtonVal;
//Controlla quale tasto o combinazione è stata premuta
if (ButtonVal > 0)
{
ButtonCheck();
}
}
time = millis();
}
}
void ButtonCheck()
{
// loop per la ricerca nell'array.
for(int i = 0; i <= 21; i++)
{
// compara ButtonVal con i valori alto basso nell' array
if(ButtonVal >= Button[i][j] && ButtonVal <= Button[i][j+1])
{
// conserva il valore del tasto premuto in una variable
label = Button[i][0];
Action();
}
}
}
void Action()
{
if(label == 1)
{
Serial.println("Up Button");
}
if(label == 2)
{
Serial.println("Down Button");
}
if(label == 3)
{
Serial.println("Left Button");
}
if(label == 4)
{
Serial.println("Right Button");
}
if(label == 5)
{
Serial.println("Action Button #1");
}
if(label == 6)
{
Serial.println("Action Button #2");
}
if(label == 8)
{
Serial.println("Left and Up Buttons");
}
if(label == 9)
{
Serial.println("Right and Up Buttons");
}
if(label == 12)
{
Serial.println("Left and Down Buttons");
}
if(label == 13)
{
Serial.println("Right and Down Buttons");
}
if(label == 21)
{
Serial.println("Action Buttons #1 and #2");
}
//Serial.println("Button =:");
//Serial.println(label);
//delay(200);
}
Divertitevi a personalizzare questo semplice progetto per pilotare o filoguidare il vostro robot per casa, senza l'ausilio del pc o di componenti appositi.
Ciao
Brainbooster
