Visualizzazione post con etichetta Arduino. Mostra tutti i post
Visualizzazione post con etichetta Arduino. Mostra tutti i post

mercoledì 8 giugno 2011

Arduino: leggere i valori dal microfono

Il microfono è stato uno dei primi trasduttori inventati dall'uomo, la pressione delle onde sonore che impatta sulla superficie del microfono viene trasformata in un segnale elettrico. Se avete una vecchia radio oppure un telefono cellulare da rottamare potete procurarvi un piccolo microfono a capsula! Possiamo provarne il funzionamento misurandone la resistenza interna con un multimetro, soffiando oppure parlando nel microfono la sua resistenza interna aumenterà. Il segnale generato dal microfono risulta debole e va quindi amplificato prima di poterne apprezzare i valori con Arduino. Nel datasheet del circuito integrato LM386 ho trovato lo schema di un semplice amplificatore:


Se vogliamo utilizzare questo circuito per leggere il segnale generato da un microfono dobbiamo usare l'uscita Vout del condensatore C3 come pin di ingresso per la nostra scheda Arduino. In fase di realizzazione, per favorire il setup del circuito, ho sostituito i resistori R1 ed R2 con due resistori variabili. Il condensatore C2 permette di ottenere un guadagno pari a 200 (se omesso il guadagno scende a 20).


Il led sul pin numero 13 (variabile LED) si accenderà non appena il segnale generato dal microfono supera un valore limite (variabile NOISE_MARGIN). Il segnale di input generato dal microfono (la sua versione amplificata) è mappato sul pin (analogico) numero 0 (variabile MIC) ed è aggiornato ogni 20ms circa (variabile SAMPLING). La frequenza di campionamento e la soglia minima di rumore possono essere modificate solo all'interno del codice sorgente che trovate qui. Alcune regolazioni in fase di setup possono essere fatte attraverso i resistori R1 ed R2 che regolano il volume in ingresso.
int MIC=0;
int LED=13;
int NOISE_MARGIN=489;
int SAMPLING=10;

int value=0;

void setup() {
pinMode(MIC,INPUT);
pinMode(LED,OUTPUT);
Serial.begin(9600);
}

void loop() {
value=analogRead(MIC);
if(value>NOISE_MARGIN) digitalWrite(LED,HIGH);
else digitalWrite(LED,LOW);
Serial.println(value);
delay(SAMPLING);
}
Spero di aver disegnato bene lo sketch per Arduino, se avete problemi scrivete. Ecco un video del circuito in funzione:

giovedì 27 gennaio 2011

Arduino: lancio del dado (versione 2 e versione 3)

In questa seconda versione ho disposto i led in modo diverso, cercando di realizzare sulla breadbord i simboli tipici di un dado. A tale proposito ho aggiunto un led alla configurazione precedente. Ho quindi etichettato i led in questo modo:


Il codice sorgente dovrà, allora, accendere i led dichiarati nella configurazione in base al numero estratto dalla funzione random(1,7). Per posizionare il LED_D sulla breadboard ho dovuto modificare con una pinzetta i piedini del componente, piegandoli affinché nella configurazione vista dall'alto il led occupasse una posizione centrale pur ricevendo il segnale da un pin diverso da quello in linea sulla breadboard. Nello schema che segue, invece, per non confondere le connessioni ho messo da parte il LED_D.



Se nel codice sorgente dichiariamo le funzioni per accendere ogni singolo led (funzioni a(), b(), c(), d(), e(), f() e g()) possiamo allora ipotizzare due strutture di controllo per la scrittura dell'output. La prima è davvero molto semplice e direi anche la più naturale. Essa consiste nell'uso del valore generato dalla funzione random per l'ingresso (e l'uscita) in una struttura di controllo switch. Ecco l'elenco dei led da accendere in base al numero estratto dalla funzione random(1,7):
  1. LED_D;
  2. LED_B, LED_F;
  3. LED_B, LED_D, LED_F;
  4. LED_A, LED_B, LED_F, LED_G;
  5. LED_A, LED_B, LED_D, LED_F, LED_G;
  6. LED_A, LED_B, LED_C, LED_E, LED_F, LED_G;
Possiamo, quindi, invocare in ognuno dei casi detti sopra le relative funzioni per l'accensione dei led. Trovate qui il codice sorgente che adotta questa soluzione (versione 2).
Per risparmiare qualche riga di codice ho pensato di riscrivere il codice in questo modo, qui (versione 3). In questa versione, come nella prima (versione 1), il numero estratto dalla funzione random(1,7) stabilisce il punto di ingresso all'interno della struttura di controllo switch. Il punto di uscita, quindi l'istruzione break, è prevista solo per l'ultimo caso. All'interno di ogni caso ho disposto le varie funzioni per l'accensione dei led in questo modo (risparmiando qualche riga di codice):
  switch (dado) {
case 6:
a();
case 5:
if(dado==6) b();
else a();
case 4:
if(dado==6) c();
else if(dado==5) b();
else a();
case 3:
if(dado==6) e();
else if(dado==5) d();
else if(dado==4) b();
else b();
case 2:
if(dado==6 || dado==5 || dado==4) f();
else if(dado==3) d();
else b();
case 1:
if(dado==6 || dado==5 || dado==4) g();
else if(dado==3) f();
else if(dado==2) f();
else d();
break;
}

mercoledì 26 gennaio 2011

Arduino: lancio del dado (versione 1)

Il lancio del dado per Arduino è davvero un'operazione semplice. Per generare un numero casuale possiamo utilizzare una delle seguenti funzioni:
  • random(max): ritorna un numero compreso fra 0 e max-1;
  • random(min,max): ritorna un numero compreso fra min e max-1;
Per caratterizzare il seme con cui generare una sequenza di numeri casuali possiamo invocare la funzione randomSeed(seme), dove seme è un long int (possiamo passare a randomSeed anche un valore sporco prelevato da uno dei pin analogici di arduino, se inutilizzato nello sketch).
Dopo aver generato un numero casuale e averlo raccolto in una variabile temporanea dobbiamo organizzare l'output. Ho previsto due versioni che si differenziano proprio nel modo in cui esse riportano il risultato (il lancio del dado) all'esterno, di seguito vi parlerò della prima. Qui invece potete vedere la seconda soluzione.
Nella prima soluzione ho pensato di disporre in sequenza 6 led, uno affianco all'altro. Nel codice, il numero casuale generato da Arduino viene analizzato con l'istruzione switch. Ovviamente i possibili casi da differenziare sono 6, avendo fissato i numeri casuali con l'istruzione random(1,7). Ognuno di questi decide, allora, il punto di ingresso all'interno della struttura di controllo switch. Nel codice sorgente, avendo riportato l'istruzione break solo per l'ultimo caso, in base al numero estratto si passerà necessariamente per tutti i casi sottostanti. Ogni caso previsto comanda l'accensione (digitalWrite()) di uno dei 6 led disposti in sequenza sulla breadboard.
Ad esempio, se il numero estratto dalla funzione random() è 5 si accenderanno tutti i led dal quinto al primo, escluso il sesto poiché il punto di ingresso nell'istruzione switch è appunto 5 (che esclude il caso superiore, il sesto led non verrà pertanto acceso). Solo l'ultimo caso prevede, infine, l'uscita dall'istruzione. Qui trovate il codice dello sketch (estrazione di un numero da 1 a 6 ogni 3 secondi).
switch (dado) {
case 6:
digitalWrite(LED6,HIGH);
case 5:
digitalWrite(LED5,HIGH);
case 4:
digitalWrite(LED4,HIGH);
case 3:
digitalWrite(LED3,HIGH);
case 2:
digitalWrite(LED2,HIGH);
case 1:
digitalWrite(LED1,HIGH);
break;
}

sabato 6 novembre 2010

Incontri ravvicinati del terzo tipo

Ricordate la sequenza di note suonate nel film di Steven Spielberg, Incontri ravvicinati del terzo tipo? La famosa sequenza (casuale, anche se ci sono diverse teorie) fu scritta da John Williams, così come la colonna sonora del film. Perché non usare quella sequenza di note per farla suonare ad Arduino?
Per generare suoni con Arduino possiamo ricorrere alla funzione tone(pin, frequence), dove pin è il pin a cui è collegato l'altoparlante e frequence è la frequenza della nota da suonare. Esiste anche una seconda versione di tone, tone(pin, frequence, duration) dove duration specifica la durata (in millisecondi) della nota da suonare!
Adesso sappiamo quello che ci occorre per far suonare ad Arduino qualche melodia! Per la frequenza delle note possiamo ricorrere all'header pitches.h (che trovate qui). Si tratta di un file (da includere nel sorgente del programma per Arduino) che definisce con delle costanti mnemoniche le note da far suonare ad Arduino.


Nell'immagine di sopra potete osservare lo schema. Non vi sembra semplice? Il codice da me usato per provare la funzione tone lo trovate in questa pagina. Per descrivere la melodia mi sono servito di due array di interi. Il primo array, song[], contiene le note della melodia. Il secondo array, time[], contiene la tempificazione da applicare alle note del primo array! L'esecuzione della melodia avviene in un ciclo for che, partendo dai primi elementi dei due array, passa ad ogni iterazione i valori utili alla funzione tone che suonerà per noi la melodia!

domenica 31 ottobre 2010

Arduino: semaforo (versione 2)

Vi ricordate il semaforo visto ieri? Il circuito mostrato sopra ne estende le capacità aggiungendo adesso un bottone (collegato al pin 3) per l'attraversamento dei pedoni. L'interazione è come sempre gestita attraverso il software. Qui trovate il codice sorgente per l'IDE di Arduino.
Per questo sketch ho usato la libreria Metro per Arduino. All'interno del programma mi occorreva qualcosa che mi liberasse dal conteggio del tempo per dedicarmi alla gestione del bottone. La libreria Metro fa proprio questo! Qui trovate la pagina che spiega come installarla e utilizzarla all'interno dell'IDE. Fondamentalmente, una volta importato l'header (Metro.h) occorre creare una variabile per il conteggio con l'omonimo costruttore Metro(interval), dove interval è un unsigned long ed esprime l'intervallo di conteggio (in millisecondi) per la variabile dichiarata. In altre parole la variabile, appena viene dichiarata, fa scorrere il tempo fino all'intervallo di tempo impostato. Con il metodo reset() è possibile far ripartire il conteggio. Esiste un secondo costruttore che prevede come secondo argomento un valore logico che, se settato a true, fa ripartire il conteggio automaticamente.
Il metodo più importante offerto dalla libreria, a mio avviso, è il metodo check(). Questa funzione ritorna true se l'intervallo di tempo impostato nel costruttore è passato, altrimenti restituisce false. Se abbiamo bisogno di modificare l'intervallo di tempo da conteggiare va usato il metodo interval(new_interval), dove new_interval è un unsigned long che esprime (in millisecondi) il nuovo intervallo di tempo.
Dopo aver dichiarato dove sono mappati i led ed il bottone, ho dichiarato le costanti di tempo usate per le pause nel corso del programma. Ogni nuova costante di tempo per la durata di un led va quindi modificata nella parte iniziale del codice. Il programma usa due variabili globali, una per segnare lo stato del bottone e una per la presenza di pedoni. In realtà lo stato delle due variabili coincidono: se il bottone è stato premuto è evidente che ci sono pedoni! Tuttavia, per facilitare la gestione del codice ho deciso di tenere separate le due variabili, i cui stati sono gestiti in diversi istanti del ciclo di funzionamento.
La variabile Metro è dichiarata solo in una funzione (green_light()), a livello locale quindi, sicché nessun'altra funzione può interferire con il conteggio. La stessa funzione fa quindi partire il timer (variabile timer) e accende la luce verde. L'istruzione per verificare lo stato del bottone (button_stat=digitalRead(BUTTON)) è inserita in un ciclo do-while() la cui condizione di uscita è la verifica del timer con timer.check(). Tale ciclo può allora terminare per due motivi: per la fine del conteggio, per un cambiamento di stato del bottone. Quest'ultimo evento viene eventualmente segnato nella variabile globale people, in questo modo la funzione red_light() saprà se aggiungere un ulteriore tempo alla sosta delle macchine (per permettere a più pedoni di attraversare).

sabato 30 ottobre 2010

Arduino: semaforo (versione 1)

Il codice che realizza il loop per l'accensione in sequenza dei led è davvero molto semplice. Con l'istruzione digitalWrite(LED,HIGH) viene acceso un singolo led per un tempo seguito dall'istruzione delay(TIME). Passati TIME millisecondi (la funzione delay interpreta l'argomento passato in millisecondi) occorre spegnere il led acceso con digitalWrite(LED,LOW) e accendere, quindi, il led successivo. Qui trovate il file per l'IDE di Arduino.
E se qualche pedone deve attraversare?

lunedì 7 giugno 2010

Arduino: qualche informazione in più

Dopo aver visto il primo sketch realizzabile con Arduino (una sorta di "Hello world!") e la realizzazione dell'interfacciamento a un sensore di luce (fotoresistenza) mi piacerebbe lasciarvi qualche altra informazione su Arduino. So bene che solitamente avviene il contrario ma a volte per far capire una cosa si può invertire la regola.
I più attenti avranno sicuramente notato la presenza di un grosso chip sulla scheda Arduino, si tratta del cuore della scheda di tinker ovvero del microcontrollore ATmega328. Cos'è un microcontrollore?
Prima di ancora di iniziare a interessarmi di Arduino ho avuto qualche piccola esperienza con altri microcontrollori, in particolar modo con la famiglia dei PIC (programmable interrupt controller) e nello specifico con il PIC16F84.
Tutti i microcontrollori si presentano esternamente come dei circuiti integrati, all'interno del package si trovano tuttavia diversi dispositivi tipici di un sistema a microprocessore! Solitamente l'involucro comprende:
  • una CPU (central process unit) per l'interpretazione dei programmi compilati dall'utente;
  • un'area di memoria di tipo PROM (programmable read only memory) per memorizzare il programma da eseguire;
  • un'area di memoria di tipo RAM (random access memory) per memorizzare le variabili del programma e le elaborazioni della CPU;
  • una linea per i segnali I/O per ricevere in ingresso i segnali provenienti dai sensori e produrre in uscita i segnali diretti agli attuatori (le linee di I/O possono essere dedicate a segnali analogici e/o binari, quindi digitali);
  • altri dispositivi vari fra cui contatori, convertitori A/D, bus e porte per la comunicazione (quest'ultima implementata sia nella forma parallela, PIA, che seriale, USART);
Detto ciò se non specifichiamo subito le caratteristiche interne di un microcontrollore rischiamo davvero di confonderlo con un vero e proprio microprocessore! Lo stesso Massimo Banzi definisce, in un suo video, Arduino come: un piccolo computer dalle dimensioni di una carta di credito. Nel corso degli anni si sono succedute diverse famiglie di microcontrollori, ognuna di queste con una propria struttura organizzativa interna che tuttavia possiamo ritenere pressapoco simile. Ecco allora che possiamo associare ad un microcontrollore un'architettura interna di riferimento che ci permette di iniziare ad apprezzarne le potenzialità:


Tutti i dispositivi elencati prima come periferiche dei microcontrollori possono trovare una loro collocazione in uno dei blocchi illustrati in figura. Ogni linea ha il suo significato, la disponibilità di così tanti dispositivi in uno spazio estremamente contenuto offre al progettista un valido strumento per la realizzazione di sistemi di controllo e altro! Con il microcontrollore ATmega328 la Atmel, l'azienda che produce il chip, ha dato inizio a una nuova famiglia di microcontrollori, quella a 8 bit. Alcuni parametri che definiscono meglio Arduino si possono trovare sul datasheet del costruttore. La memoria flash dedicata ai programmi è di 32KB, Arduino prevede un EEPROM di 1KB e un'area SRAM di 2KB (la memoria ram!). La frequenza di clock della cpu (che prevede poco più di 130 istruzioni) è di 20MHz.
Veniamo alle periferiche, in Arduino trovate due contatori a 8 bit, un contatore a 16 bit, 6 canali analogici dedicati all'output di tipo PWM (pulse-width modulation), 23 pin per la programmazione dell'I/O (di cui 6 di tipo PWM, quelli di prima, 6 di tipo analogico e il restante di tipo digitale), una periferica seriale per la comunicazione e tanta altra roba ancora.
Il microcontrollore è stato sistemato su una scheda (Arduino) assieme ad altri componenti per permettere l'interfacciamento, attraverso una porta usb, al PC. L'alimentazione (5V) utile alla scheda può essere rimediata attraverso la stessa porta usb oppure in maniera del tutto autonoma dal PC, attraverso un comune jack. Un led (PWR) indica lo stato della scheda: accesa o spenta. Altri due led (TX ed RX) si accendono non appena la scheda scambia bit con il PC (o con altri dispositivi). Di default è presente un ulteriore led collegato al pin (digitale) 13 del chip. Questo favorisce la prova della scheda, ad esempio con il primo sketch, il led può in ogni caso essere impiegato per altre funzioni, quali? Quelle che noi decideremo di programmare.

venerdì 14 maggio 2010

Arduino: dove c'è più luce?


Il primo sketch con Arduino è servito a introdurne solo alcune delle caratteristiche. In questo secondo esempio realizzeremo l'interfacciamento con alcuni dispositivi: un sensore di luce o fotoresistenza e un servocomando. L'obiettivo è quello di farci suggerire da Arduino l'angolazione da cui proviene più luce.
Come avrete già capito il fotoresistore realizzerà per Arduino l'input, il servocomando sposterà invece il sensore facendolo ruotare di 180°. L'output viene realizzato comunicando l'angolo di massima luce rilevato attraverso la porta usb. Dopo la rotazione completa del sensore faremo inoltre puntare il servocomando (con il sensore) nell'angolo misurato.
Il fotoresistore è un componente elettronico la cui resistenza varia al variare della luce che lo colpisce. All'interno del programma faremo riferimento al sensore attraverso la costante SENSORE, che ne indica tra l'altro il pin usato nel collegamento con Arduino. Con la funzione analogRead(SENSORE) avviene la lettura del valore di tensione applicata ai morsetti del fotoresistore. Il valore ritornato è un numero compreso fra 0 e 1023, esso rappresenta intervalli di tensione compresi fra 0 e 5V. Possiamo rimediare la tensione da applicare al sensore direttamente da uno dei pin di Arduino. Se dunque la tensione ai morsetti del sensore è di 2,5V la funzione analogRead(SENSORE) ritornerà il valore 512. Nel circuito ho aggiunto un resistore di pochi ohm per cercare di correggere i valori tornati dal sensore (in maniera tale da farli ricadere in una fascia di valori più distante dall'ultimo valore leggibile).
La comunicazione fra Arduino e il PC avviene attraverso la porta usb. L'inizializzazione della porta seriale è stata già accennata in occasione del primo articolo con Arduino.
Il fotoresistore viene montato sull'albero del servocomando che ruotando sposta dunque il sensore. All'interno del programma faremo riferimento al servocomando attraverso la costante SERVO, passata in fase di setup alla funzione attach dell'oggetto Servo (per indicare su che pin è mappato il motore). Manovrare un servocomando con Arduino è semplice, ecco come fare:
  • dichiarare un oggetto Servo: Servo myservo;
  • mappare il servomotore in fase di setup con la funzione myservo.attach(int pin);
  • spostare il servomotore scrivendo con la funzione myservo.write(int angolo);
Altre funzioni per i servocomandi possono essere trovate a questo indirizzo. Ogni volta che spostiamo il servocomando, prima di impartire allo stesso una nuova posizione occorre dare al motore il tempo di raggiungere quella posizione. Ecco quindi l'importanza dell'istruzione delay(WAIT1)!
Con un ciclo for possiamo orientare il servocomando facendolo muovere di STEP (altra costante del programma) gradi per volta. Questi ultimi due parametri sono in qualche modo legati fra loro, il valore letto dal sensore è cioè influenzato dal precedente valore. In altre parole occorre dare al sensore il tempo di far assestare la lettura. Tuttavia se spostiamo il fotoresistore di pochi gradi per volta possono basatare pochi millisecondi. In tutti gli altri casi occorre introdurre un ritardo dopo ogni spostamento del servomotore.
Quest'ultima osservazione mi ha permesso di correggere un fastidioso difetto che ho riscontrato nel circuito poi provato. Dopo aver completato la scansione il servocomando si sposta nella posizione con più luce (ricordate la descrizione fatta all'inizio?) e vi rimane fino a una nuova scansione (che inizierà non appena termine una funzione di blinking per un led di stato). L'inizio di una nuova scansione provoca la rotazione del servomotore, quindi del sensore, dalla vecchia posizione (quella con più luce) a quella iniziale. Il valore immediatamente letto si porta allora dietro l'influenza dei valori che si alternano ai morsetti del sensore proprio durante questo spostamento. Ecco allora che l'aggiunta di una banale istruzione può correggere il comportamento falsato appena descritto. Se il sensore sta leggendo il valore della prima posizione (il servomotore è quindi a 0°) viene osservata una pausa di WAIT3 secondi (if (position==0) delay(WAIT3)). Questo farà assestare i valori prima di leggerli!
Niente di complicato nell'algoritmo che rileva l'angolo con più luce. Per ogni valore del ciclo for vengono memorizzati i valori letti dal sensore e la posizione del servomotore. Tali valori vengono quindi scartati solo se uno dei successivi valori di tensione, letti dal sensore, supera quello precedentemente memorizzato.

#include

#define SENSORE 0
#define SERVO 11
#define LED 13
#define WAIT1 40
#define WAIT2 1000
#define WAIT3 1000
#define STEP1 1

Servo myservo;
int max_light;
int max_light_position;
int current_light;
int position;

void setup() {
   Serial.begin(9600);
   myservo.attach(SERVO);
   pinMode(LED, OUTPUT);
}

void loop() {
   max_light=0;
   max_light_position=0;
   current_light=0;
   digitalWrite(LED, HIGH);
   for (position=0;position<180;position+=STEP1) {
      myservo.write(position);
      delay(WAIT1);
      if (position==0) delay(WAIT3);
      current_light=analogRead(SENSORE);
      Serial.println(current_light);
      if (current_light>max_light) {
         max_light=current_light;
         max_light_position=position;
      }
   }
   digitalWrite(LED, LOW);
   Serial.print("Massima luce rilevata a: ");
   Serial.print(max_light_position);
   Serial.print(" gradi.\n");
   myservo.write(max_light_position);
   blink(10);
}

void blink(int nBlink) {
   while (nBlink!=0) {
      digitalWrite(LED, HIGH);
      delay(WAIT2/2);
      digitalWrite(LED, LOW);
      delay(WAIT2/2);
      nBlink--;
   }
}


domenica 25 aprile 2010

Arduino: primo sketch

Arduino è una piattaforma open source di physical computing basata su una semplice scheda input/output e un ambiente di sviluppo che implementa il linguaggio Processing, assai simile al linguaggio C. Arduino può essere usato per sviluppare oggetti interattivi indipendenti o può essere collegato a un software in esecuzione sul computer. Le schede possono essere assemblate a mano oppure acquistate in rete. In questi giorni è stato aperto il primo store ufficiale a Milano.L'IDE (Integrated Development Environment) open source può essere scaricato gratuitamente da www.arduino.cc. Altre informazioni su Arduino possono essere trovate all'indirizzo già indicato. L'ideatore di Arduino è Massimo Banzi, diffidate dalle tante imitazioni che girano in rete, il vero Arduino è made in Italy!
I programmi scritti per Arduino sono chiamati sketch. La compilazione del programma, attraverso l'IDE, genera il bytecode (il programma tradotto in linguaggio macchina) che viene quindi trasferito nella memoria di Arduino.
Terminata la ricezione del programma, Arduino inizia ad eseguire quest'ultimo in un loop continuo, è possibile eventualmente effettuare il reset dello stato attraverso un interruttore posizionato sulla scheda.
Questo è uno dei primi sketch da me eseguito su Arduino per verificarne il funzionamento:

/* intermittenza e comunicazione - di Luca Petrosino */
#define GREEN 13
#define RED 12
#define PAUSE 500
#define STOP 60

int start=0;

/* setup dei pin e della porta seriale */
void setup() {
   pinMode(GREEN,OUTPUT);
   pinMode(RED,OUTPUT);
   Serial.begin(9600);
}

/* ciclo da eseguire */
void loop() {
   if (start==STOP) {
      start=0;
      blinkLed(RED);
   }
   else {
      blinkLed(GREEN);
   }
   start++;
}

/* fa lampeggiare il led collegato al pin number */
void blinkLed(int number) {
   Serial.println(start);
   digitalWrite(number,HIGH);
   delay(PAUSE);
   digitalWrite(number,LOW);
   delay(PAUSE);
}

Si tratta di un semplice programma per l'intermittenza di due led, uno verde e l'altro rosso. Per ogni ciclo di loop viene fatto lampeggiare il led verde. Una variabile conteggia il numero di cicli. Quando il conteggio raggiunge il valore STOP, la variabile viene azzerata e il led rosso viene fatto lampeggiare al posto di quello verde.
Ogni programma prevede due distinte funzioni. Attraverso la funzione setup vengono mappati gli input (ad esempio sensori e interruttori) e gli output (ad esempio attuatori e led) usati nel corso del programma. Con la funzione pinMode è possibile specificare se un pin deve funzionare da input o da output. Attenzione, pinMode imposta i pin digitali di Arduino (che ha anche pin analogici e di tipo pwm, pulse width modulation). La funzione riceve come argomenti il numero del pin (nel programma ho definito delle costanti per ogni pin usato) e una costante che può assumere i valori INPUT o OUTPUT a seconda dei casi.
Sempre in fase di setup ho indicato la possibilità di usare nel corso del programma la comunicazione seriale fra Arduino e il PC (con Serial.begin(9600) indico una comunicazione di 9600 bps).
L'altra funzione sempre presente all'interno di programmi per Arduino è la funzione loop. Tutte le istruzioni all'interno di loop vengono eseguite ciclicamente. E' qui che va scritto il codice per istruire Arduino affinché faccia quello che vogliamo! In altre parole la funzione loop è l'equivalente della funzione main per i programmi scritti in c.
Nel programma ho indicato a Arduino di usare i pin 13 e 12 rispettivamente per i led verde e rosso. Il nome dato alle costanti mi aiuta a capire il significato del pin! All'esterno delle due funzioni ho poi dichiarato una variabile per il conteggio, tale variabile sarà visibile all'interno della funzione loop. Essa viene infatti usata per verificare, attraverso il confronto con la costante STOP, il valore di conteggio.
Con Serial.println invio attraverso la porta seriale l'attuale valore di conteggio che leggerò quindi sul monitor del PC. L'accensione di un led avviene con la funzione digitalWrite che invia al pin indicato un livello di tensione HIGH tale da accendere il led collegato. Se si vuole invece spegnere il led bisogna rimettere a LOW il valore di tensione al medesimo pin associato al led. Fra un istruzione e quella successiva ho poi aggiunto dei ritardi attraverso la funzione delay. Il valore dato come argomento alla funzione delay indica il tempo (in millisecondi) da attendere prima di riprendere l'esecuzione delle istruzioni contenute in loop. Arduino ha una velocità di clock pari a 20 MHz e l'esecuzione del programma mostrato risulterebbe eccessivamente veloce!