Arduino: Il primo progetto

E’ tempo di cominciare a sporcarsi le mani ed iniziare a stendere il primo progetto.

Cominceremo a scrivere il nostro primo sketch dopo una descrizione della scheda Arduino duemilanove. Il termine sketch, per chi se lo stesse chiedendo, è mutuato dall’ambiente di sviluppo per Processing, e sarà da ora in poi, sinonimo di programma.

La famiglia Arduino è composta da una serie di schede che soddisfano diverse necessità: si parte da Arduino nano, passando da mini fino alla scheda standard, che utilizzeremo noi come cavia in questa serie di post, per arrivare ad Arduino Mega. Ovviamente ci sono varie versioni delle singole schede che vengono rilasciate via via che il progetto evolve. Io utilizzerò per le mie prove la versione duemilanove per due motivi, è quella più aggiornata in questo momento e, soprattutto, è quella che ho disponibile. Vediamo comè fatta.

Immagine Arduino Duemilanove
Arduino Duemilanove

In definitiva, Arduino duemilanove può essere grosso modo divisa in due tre sezioni: A nordovest giace l’area che si occupa delle comunicazioni USB, a sudovest la sezione alimentazione mentre il resto della scheda è occupato da una sezione che decora il chip Atmel che ospita.

Sulla scheda sono presenti quattro led smd denominati L, TX, RX e PWR. Il led PWR, è facile dedurlo, si accende quando la scheda è alimentata. Anche i led RX e TX sono semplici da interpretare: se la scheda sta trasmettendo sull’interfaccia seriale allora il led TX lampeggia, il led SX si comporta analogamente in ricezione. Il led Denominato L, invece, è in serie sul pin 13 e si accende a comando.
Lo piloteremo nel nostro primo sketch.

Oh, no! esclamerà qualcuno, il solito, trito e ritrito programma per pilotare un led. Si. Lo ammetto, manco di originalità, ma non ho trovato nulla di meglio per illustrare le basi di un programma per arduino che ci permettesse di non dover utilizzare materiale aggiuntivo.

Solitamente questo tipo di programmi, prevede la creazione di un semplice circuito composto da una resistenza ed un led, per pilotare quest’ultimo. Sfruttando il pin 13, però è possibile fare a meno della resistenza perché già montata in serie su quel pin (vedremo tra poco cosa siano questi pin, a cosa servono e come possono essere utilizzati).

Volendo essere minimalisti, o meglio pigri, e sfruttando il led embedded, potremo fare a meno anche del led ed usare quello già presente.

Il perché di questo approccio è semplice: nel physical computing nella fase di debugging dovremo tener conto non solamente del programma che abbiamo davanti ma anche di tutti i componenti hardware che abbiamo assemblato.

Per chi inizia, come il sottoscritto, anche un semplicissimo circuito come quello che ho descritto può essere fonte di notevole frustrazione:

  • Se il led viene montato a polarità invertita non funzionerà,
  • se le connessioni tra i vari pezzi non sono salde il circuito potrebbe non funzionare,
  • il led potrebbe essere rotto,
  • una resistenza, se presente, potrebbe non soddisfare le specifiche, vedremo quant’è facile
    leggere male il valore di una resistenza (per me che sono daltonico, poi, è impossibile).

Aggiungiamo a tutto questo i bachi che possono essere presenti nel programma, a cominciare da quelli logici per finire a quelli più subdoli come ad esempio dichiarare di utilizzare un pin per pilotare un componente che poi viene effettivamente montato sul pin adiacente (Non guardate me! Io non c’entro, a me non succede quasi mai).

Il primo Progetto

Cosa ci serve per questo esperimento?

  • Una Scheda Arduino duemilanove o compatibile
  • Un cavo usb di tipo A/B
  • Un computer con installato Arduino Ide

Analizziamo il codice e cerchiamo di capire come funziona:


/*
* Blink
* Accende e spegne un led ad intervalli di un secondo.
* Note: Useremo il led embedded  sulla scheda Arduino 2009
*         che è collegato al pin 13.
*
* basato sul lavoro di David Cuartielles
* http://arduino.cc/en/Tutorial/Blink
* a sua volta basato su un programma di H. Barragan per una scheda Wiring
*/

#define LEDPIN 13
#define N_SECONDI 1
int status = LOW;

void setup()   {
  pinMode(LEDPIN, OUTPUT);
}

void loop() {
  digitalWrite(LEDPIN, (status= !status));
  delay(N_SECONDI * 1000);
}

I più attenti avranno notato che abbiamo a che fare con un linguaggio molto simile al C. La sintassi
è virtualmente identica ma manca la funzione main. Al suo posto trovate due funzioni diverse: setup e loop (si tratta di una derivazione da Processing, un linguaggio che affronteremo più avanti).

All’avvio viene eseguita la funzione setup (l’avreste mai creduto? 😉 ) e successivamente viene ripetuta
fino allo spegnimento dell’apparato la funzione loop.

Se la cosa vi fa sentire più a vostro agio, potete pensare che la funzione main sia predefinita
ed equivalente a questa:


void
function main()
{
    setup();
    while(true) {
        loop();
    }
}

Nella nostra funzione di setup provvediamo ad inizializzare il pin su cui il team di arduino
ha già montato un led. La prima domanda che dovremmo farci è: che cos’è un pin?

Arduino ha 12 porte digitali e 6 analogiche (nella versione duemilanove). In gergo queste vengono dette pin. La differenza tra i due tipi di porte è presto detta: quelle digitali possono assumere solo un valore alto/basso (+5V/0V) mentre quelle analogiche possono assumere tutti i valori intermedi.

L’istruzione pinmode(ledPin,OUTPUT) serve a dichiarare che la porta numero 13 è una porta su cui
si effettuerà output (ed a commutarne la fisicamente modalità nel chip Atmel).

Il codice della funzione loop è banale: invia sulla porta un segnale con il valore corrispondente
allo stato attuale invertendone il valore. Aspetta per un secondo. Ovviamente non utilizziamo un ciclo
per gestire il lampeggiamento perché questo è implicitamente creato dalla funzione loop.

Il nome delle due funzioni predefinite che abbiamo utilizzato sono autoesplicativi: la funzione
delay blocca il programma per il numero di millisecondi specificati come parametro.

Compiliamo e carichiamo il programma sulla scheda arduino (c’è un apposito pulsante sul pannello principale dell’ide) e godiamoci il risultato del nostro primo esperimento. Se tutto funziona possiamo fermarci qui, altrimenti sarà necessaria una sessione di debug.

Come proseguire? Ci sono alcune domande che mi sono saltate in mente mentre scrivevo e che ho
volutamente lasciato inespresse. Ad esempio: cosa succede assegnando ad un pin analogico un
valore diverso da HIGH e LOW (che corrispondono ai valori 0xFF e 0x00); cosa sono, come si comportano e come si utilizzano le porte PWM ? La prossima volta costruiremo il nostro primo circuito vero e proprio, sicuri che il “firmware” che abbiamo preparato funziona lo utilizzaremo per pilotare un led esterno. Cominceremo e concluderemo con delle variazioni sul tema cercando di sperimentare anche

Lascia un commento