Archive for marzo 30th, 2011

Loop

mercoledì, marzo 30th, 2011

Ciao a tutti, il titolo del tutorial si chiama Loop anche se sinceramente mi piace di più chiamarlo Supercar, la serie televisiva girata nel 1983 dove c’era la macchina Kitt dotata di un’ intelligenza artificiale (a cui ci sto lavorando per crearla ;)) e davanti al cofano aveva una serie di led rossi che si accendevano in sequenza. L’esempio che vediamo in questo tutorial fa uso di sei LED collegati ai pin da 2 a 7 in serie con sei resistenze da 220 ohm. Lo scopo del codice , da scrivere, sarà quello di far lampeggiare i LED in sequenza, uno dopo l’altro utilizzando due funzioni già conosciute: digitalWrite() e delay().

Il circuito da costruire è il seguente:

Fate attenzione come collegate i led…

Ora vediamo il codice da scrivere:

#define timer 100  //Tempo di ritardo
#define num_pins 6  //Numero dei pins
int pins[] = { 2, 3, 4, 5, 6, 7 };  //Array dei pin
int i;
void setup()
{
     //Dichiara tutti i pins come OUTPUT
     for (i = 0; i < num_pins; i++)
         pinMode(pins[i], OUTPUT);
}
void loop()
{
     int i;
     //loop per accendere e spegnere i led
     for(i = 0; i < num_pins; i++)
     {
         digitalWrite(pins[i], HIGH);
         delay(timer);
         digitalWrite(pins[i], LOW);
     }
     for (i = num_pins - 1; i >= 0; i--)
     {
         digitalWrite(pins[i], HIGH);
         delay(timer);
         digitalWrite(pins[i], LOW);
     }
}

Analisi del codice:

-int pins[] = { 2, 3, 4, 5, 6, 7 };: In questo modo definiamo un array di numeri interi, ossia possiamo immaginarlo come una cassettiera che contiene n cassetti contente un numero per ogni cassetto. Come vedete ci sono dei cicli for nel codice che “aprono un cassetto” alla volta estraendo il numero dell i-esimo cassetto, in questo modo vengono richiamati i numeri dell’array. Non sò se sono stato chiaro e semplice, ad ogni modo vi faccio un piccolo schemino che vi può essere utile in questo esempio e in altri.

Costruiamo un array di 6 numeri contente i numeri da 2 a 7:

Da scrivere nel codice:  int pins[] = { 2, 3, 4, 5, 6, 7 }

Rappresentazione: Cassetti                      1      2      3      4    | 5|    6

N° nei cassetti                                        2      3      4      5    |6 |    7

Richiamiamo il numero nel cassetto N° 5:

da scrivere nel codice:  int n = pins[5];   //n diventa uguale a 6

Come vedete un numero dentro un array lo possiamo richiamare con  un ciclo for oppure nel modo detto sopra.

Debounce

mercoledì, marzo 30th, 2011

Ciao a tutti, oggi parliamo del debounce ossia in italiano anti-rimbalzo. Nel terzo tutorial abbiamo visto come è possibile far accendere e spegnere un led tramite un pulsante, se noi quel pulsante lo premiamo e lo rilasciamo molto velocemente possiamo notare delle cose strane, ad esempio il led rimane sempre acceso o viceversa. Questo fenomeno capita a causa della velocita di lettura del pulsante. In parole semplici per brevi tempi arduino non capisce se abbiamo effettivamente premuto il pulsante oppure no. La cosa migliore da fare, per risolvere il problema, è fare uso della funzione millis() per tenere traccia del tempo in cui si preme il pulsante. Il circuito da fare rimane lo stesso del tutorial 3. Vediamo ora il codice da scrivere sull’IDE:

#define inPin 2  //INPUT PULSANTE
#define outPin 13  //OUTPUT LED
#define debounce 200  //Tempo di rimbalzo
int state = HIGH;  //Stato del pin OUTPUT LED
int reading;  //Lettura corrente del pin INPUT PULSANTE
int previous = LOW;  //Lettura precedente del pin INPUT PULSANTE
long time = 0;  //Ultimo tempo in cui il pin di OUTPUT è stato attivato

void setup()
{
     pinMode(inPin, INPUT);  //Imposto il pulsante come INPUT
     pinMode(outPin, OUTPUT);  //Imposto il LED come OUTPUT
}

void loop()
{
     reading = digitalRead(inPin);  //Leggo il valore in ingresso dato dal pulsante

     //Se abbiamo premuto in pulsante (HIGH) e la volta prima il suo stato
     //era LOW ed è trascorso il tempo necessario
     if (reading == HIGH && previous == LOW && millis() - time > debounce) {
         //Inverte l'OUTPUT
         if (state == HIGH)
             state = LOW;
         else
             state = HIGH;

         //Ricorda quando l'ultima volta è stato premuto il pulsante  
         time = millis();
     }

 digitalWrite(outPin, state);  //Scrivo lo stato sul LED

 previous = reading;
}

In pratica il programma legge il valore del pulsante poi passa dentro l’IF  e controlla lo stato della lettura e guarda se è trascorso il tempo necessario, se la condizione è vera allora esegue le azioni al suo interno invertendo lo stato di uscita per il led, altrimenti esce e registra lo stato corrente nelle stato passato, è un pò difficile da spiegare ma spero si sia capito 😉

Ora per chi non sa cosa sia questo simbolo && integro qui dentro la spiegazione degli operatori booleani:

&&  = (and) in italiano e

|| = (or) in italiano o

! = (not) in italiano no

E’ piu semplice spiegarli con degli esempi:

&&:     if ( a == 2 && b == 3)     Se a è uguale a 2 e b è uguale a 3

||:     if ( a == 2 || b == 3)     Se a è uguale a 2 o b è uguale a 3

!:     if (!x){Azioni}   La condizione è vera se x è falsa, ossia vengono eseguite le azioni tra le parentesi {} solo le x è falsa