Brainbooster
JoyPad analogico solo con pulsanti e resistenze
Tutorials -
Venerdì 06 Agosto 2010 17:21
Scritto da Brainbooster

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.Prima prova

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.

Prova2 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

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi