Just another “Getting Started with Arduino”

In questo articolo mi propongo di descrivere il mio primo approccio con la scheda Arduino DUE, vinta in questa edizione del Review4U. Per chi ancora non lo sapesse, Review4U è la splendida iniziativa di Elettronica Open Source che permette ai membri della community di partecipare ad un contest ed avere la possibilità di vincere una scheda elettronica, esprimendo la propria idea sul suo utilizzo.

Come già saprete, il web pullula di pagine dedicate ad Arduino. Facendo una breve ricerca, infatti, si trovano un'infinità di tutorial step-by-step e getting started che preparano il novizio maker all'utilizzo della scheda. Esistono anche moltissimi articoli che  parlano della storia, ormai diventata leggenda, di Arduino e della filosofia che c'è dietro la scelta di realizzare un progetto open source. Anche su EOS, ovviamente, si è parlato a fondo di questi argomenti. In particolare Piero Boccadoro si sta occupando, in modo impeccabile ed esaustiva, della scheda Arduino DUE nella sua serie di articoli denominati "Arduino DUE Tutorial".

Fatte queste considerazioni, mi sono chiesto quale contributo avrei potuto dare alla community nello scrivere l'ennesimo articolo che riguardasse la mitica scheda made in Italy. Così ho deciso di descrivere semplicemente quali sono state le mie impressioni, le difficoltà che ho affrontato e come le ho superate nel mio primo approccio con la scheda, che in realtà coincide anche con la mia prima esperienza con l'elettronica pratica. E qui entra in gioco il nostro Sheldon, il tizio, raffigurato nell'immagine di apertura, che guarda con sospetto e un po' di timore la gente entusiasta che si appresta ad entrare nell'Arduino Park.
Per chi non lo sapesse, Sheldon Lee Cooper, star della sit-com Big Bang Theory, è un geniale scienziato e fisico teorico, completamente avverso all'ingegneria pratica, come a qualsiasi altra attività umana  che implichi uno sforzo fisico, a parte quella di premere ripetutamente i pulsanti di un joystick o giocare alla Wii.

Come ogni altro tutorial, anche il mio avrà come destinatari i principianti dell'ingegneria pratica, ma la cosa nella quale si distinguerà da altri è che è stato scritto da un principiante dell'ingegneria pratica e non da un professionista e/o smanettone navigato. Userò quindi un approccio "newbie2newbie", se mi passate il termine. Newbie, ahimè, non per scelta, come nel caso di Sheldon, ma per un motivo che credo sia abbastanza comune a tutti gli studenti di ingegneria in Italia, e cioè, la cronica e patologica mancanza di laboratori nelle università.

Prima di iniziare a descrivere la mia esperienza con la scheda, credo sia giusto dedicare due righe alla storia di Arduino, cercando di fare il punto della situazione e delinearne 'lo stato dell'arte' dopo più di 8 anni dalla sua nascita.
Per affrontare questo argomento si è ormai creato uno standard, il quale prevede l'articolazione del discorso sulla base di una pseudo-intervista con domande-risposte pensate ad hoc per spiegare, in un modo più user-friendly ed accattivante, i vari aspetti del progetto Arduino e dello scenario hardware open source. Anch'io farò lo stesso.
Le domande di rito sono: Cos’è Arduino? A cosa serve? Chi lo può utilizzare? Perché ha avuto un così grande successo? Si può guadagnare con l'Open Source?

Bene, andiamo con ordine:

  • Cos'è Arduino?

Cominciamo dal principio. Arduino da Dadone, o Arduino da Pombia, conosciuto come Arduino d'Ivrea, fu re d'Italia dal 1004 al 1014..... No, scherzo, non da così indietro ! 🙂

Il nome Arduino, del resto, con buona pace del vecchio monarca, è diventato  famoso in tutto il mondo solo mille anni dopo, grazie all'intuizione di un team di tecnici ed ingegneri capitanati da Massimo Banzi, professore  all'Interaction Design Institute, un istituto di formazione post-laurea con sede a Ivrea, luogo fondamentale per l’informatica italiana dove già la Olivetti aveva un tempo il suo nucleo.
Dal sito ufficiale:

"Arduino è una piattaforma di prototipazione elettronica open-source che si basa su hardware e software flessibili e facili da usare. È stata creata per artisti, designer, hobbisti e chiunque sia interessato a create oggetti o ambienti interattivi."

Arduino, dunque, è un framework open source che permette la prototipazione rapida e l'apprendimento veloce dei principi fondamentali dell'elettronica e della programmazione. È composto da una piattaforma hardware alla quale viene affiancato un ambiente di sviluppo integrato (IDE) multipiattaforma (per Linux, Apple Macintosh e Windows), scritto in Java e derivato dall'IDE creato per il linguaggio di programmazione Processing e per il progetto Wiring.

  • A cosa serve? Chi lo può utilizzare?

Arduino è progettato per risultare volutamente semplice, essendo destinato ad introdurre alla programmazione ed all'elettronica artisti, designer e costruttori di gadget fai-da-te. Il progetto, infatti, prese avvio nel 2005 con lo scopo di rendere disponibile agli studenti dell'Interaction Design Institute un dispositivo per il controllo dei loro progetti che fosse più economico rispetto ai sistemi di prototipazione allora disponibili.

Andando più a fondo nello studio dell'elettronica di Arduino, si può notare che si tratta di una tecnologia abbastanza semplice, o meglio si tratta di un progetto che mette insieme una serie di tecnologie standard, già ampiamente usate e testate da community di ingegneri o semplici makers di tutto il mondo. Non si tratta dunque di hi-tech, o di elettronica di ultima generazione. In un' intervista, lo stesso Banzi afferma, addirittura, che l'elettronica di Arduino sia facilmente replicabile da un diplomato ITIS. Proprio per questa sua apparente semplicità, il progetto ha subìto nel tempo numerose critiche; sempre nella stessa intervista Banzi ne cita una per tutte: "Arduino è uno strumento per donne, pittori e artisti" (che poi dove starebbe la critica non l'ho capito, vabbè).

  • Ma allora, perché ha avuto un così grande successo?

Come già detto in precedenza, Arduino è un progetto completamente open source, quindi chiunque lo desidera può legalmente e gratuitamente scaricare lo schema elettrico e l'elenco dei componenti elettronici necessari e auto-costruirsi la scheda nella versione originale o derivarne una versione modificata e, addirittura, rivenderla. Per chi è abituato al sistema closed source, dove tutto è brevettato e "guai a chi copia (o anche semplicemente ci mette mani!)", questo sistema può sembrare una pazzia. E in effetti, come disse lo stesso Banzi, "c'è una sottile linea di confine tra l'open source e la stupidità".
In realtà si è visto che, sulla scia del software open source, anche l'hardware open source funziona.
Una cosa fondamentale da capire per tentare di motivare questo successo è che la forza di Arduino non è la scheda, ma è la sua Comunità. Banzi e il suo team, fondamentalmente, hanno capito che quando la gente ha accesso ai sorgenti dei progetti, suggerisce modifiche. E non solo.

Gli stessi utenti/clienti, a differenza che in passato, sanno già quello che vogliono e dunque risulta più efficiente farlo progettare a loro. Per avere successo in futuro, i produttori di hardware, infatti, dovranno cambiare radicalmente mentalità. Il loro lavoro non è più soltanto quello di avere idee, ma è altrettanto importante cercare e trovare innovazioni dagli utenti, i quali, in sostanza,  costituiscono anche il loro servizio tecnico, a disposizione 24 ore al giorno, 7 giorni alla settimana, senza alcuna spesa, sfruttando al massimo le potenzialità di internet e del Web 2.0. Questo sistema inoltre garantisce molta più pubblicità (gratuita) di quanta ne avrebbe potuto ottenere un pezzo di hardware chiuso e proprietario.
L'unico elemento di proprietà intellettuale che il gruppo si è riservato è stato il nome, che è diventato il suo marchio di fabbrica, in modo che il brand sia ampiamente riconoscibile e che non venga danneggiato da copie di scarsa qualità.

È tutto questo che permette ad un progetto nato in Italia, da un azienda con relativamente poche risorse, di poter essere competitivo a livello globale, e, addirittura, capace di indirizzare il mercato dell'elettronica a basso costo verso la creazione di prodotti open source Arduino compatibili, sia dal lato hardware che da quello software.

  • Ma, in sostanza, è possibile guadagnare in un mondo di hardware open source?

Riflettendo sulle considerazioni fatte prima sul perchè Arduino ha avuto questo grande successo, si può facilmente rispondere anche a questa domanda.
Proprio grazie alla comunità che che si crea intorno ad un progetto open source, in pratica, l'azienda produttrice può usufruire di un notevole taglio ai costi di ricerca e sviluppo. Si crea, così, un circolo virtuoso in cui i clienti fanno risparmiare l'azienda produttrice che a sua volta può investire nella qualità del proprio prodotto e della documentazione offerta all'utente, che, in fin dei conti, vede abbondantemente ripagato il suo sforzo iniziale.

Insomma sembra proprio sia un sistema più equo, più democratico e, soprattutto, più sostenibile rispetto al vecchio sistema closed.
Nel caso di Arduino, poi, si è avuto questo grande successo, e parliamo di un successo veramente enorme (basta vedere il numero di risultati se si fa una ricerca su google), perchè, come disse Emanuele in questo articolo, è un progetto molto cool, ormai un must-have per ogni nerd o smanettone che si rispetti. Per inciso, Arduino deriva dal nome germanico Hardwin che, composto dalle radici hard ("forte", "valoroso") e win ("amico"), significa "amico valoroso" ... insomma, GENIALE !

Ad ogni modo, riprendendo ancora le parole di Banzi, Arduino è un grande esempio di come "combinando gli elementi del design, di cui l'Italia è maestra, con la tecnologia e creando il branding giusto, si riesce a vincere nel mondo" e che "non ci vuole il permesso di nessuno per rendere le cose eccezionali."

Ok, basta chiacchiere, passiamo a qualcosa di più pratico, appunto.

Come scrissi nel commento che poi mi ha fatto vincere la scheda, Arduino DUE mi servirebbe per controllare un motor driver che a sua volta pilota i motori di un robot-rover 2WD in grado di muoversi in modalità CW, CCW, short-brake, e stop. Tale robot-rover, poi, dovrebbe essere usato come applicazione per una Brain Computer Interface, e, nello specifico, funzionare come una sorta di pre-prototipo di una carrozzina elettrica per disabili controllata grazie all'elaborazione e traduzione del segnale EEG (il tutto usando hardware e software open source). Un progetto ambizioso, certo, ma l'entusiasmo non manca.

Non tutti quelli che, come me, sono alle prime armi, però, hanno la fortuna di avere già ben in mente cosa realizzare con la propria scheda e, paradossalmente, la scelta del progetto iniziale potrebbe essere già un ostacolo difficile da superare. In effetti, come detto prima, esistono un'infinità di getting started e per il novizio maker questa abbondanza può essere a volte più frustrante che utile.

Di solito, chi è alle prime armi non possiede né attrezzatura né componentistica elettronica e deve cominciare ad allestire il proprio laboratorio da zero. Si va quindi alla ricerca di un progetto che sia economico, ben documentato, facile da realizzare ma che allo stesso tempo dia delle soddisfazioni nella realizzazione ed eventualmente nel suo utilizzo. Cercare un progetto che soddisfi queste caratteristiche richiede tanto tempo e una buona dose di pazienza, cosa che non tutti possiedono, soprattutto se si è all'inizio e si commette l'errore di voler anticipare i tempi. C'è poi da considerare che una soluzione perfetta non esiste e ogni volta che arriva a casa il materiale che si è ordinato si ha sempre qualche dubbio sulla bontà della scelta di un componente invece di un altro.

In questo articolo cercherò di indirizzarvi su cosa comprare e in che modo procedere per realizzare un progetto economico che dia già una discreta soddisfazione, partendo dalle basi dell'elettronica e dell'informatica, in pratica dagli esempi già presenti nelle librerie di Arduino.

Nello specifico, il progetto che propongo di realizzare è un dispositivo interattivo che permette di accendere e spegnere un LED in base al rilevamento della presenza di un ostacolo entro una certa distanza limite. La scelta di proporvi questo tipo di progetto deriva dalle considerazioni fatte precedentemente e dal fatto che un sistema del genere sarà implementato nel mio progetto riguardo il robot-rover prototipo della carrozzina per disabili. Come facilmente comprensibile, infatti, è indispensabile che un dispositivo mobile che trasporta una persona disabile abbia autonomamente la capacità di individuare la presenza di ostacoli e fermarsi o effettuare prontamente una manovra in modo da evitare lo scontro.

Cosa serve per realizzare il progetto?

Solo pochi componenti:

  • il vostro Arduino, nel mio caso un Arduino DUE, gentilmente offerto da Elettronica Open Source;

                                                               Arduino Due. Thank to EOS !

  • un cavo USB con connettore micro-USB di tipo B, per il collegamento del proprio computer con Arduino attraverso la Programming port, la porta di default per il caricamento degli sketch; nel mio caso ho usato un connettore mini-USB con adattatore da mini a micro;

                                                                   

  • un sensore di prossimità; nel mio caso lo Sharp GP2YOA21YK Infra Red Proximity Sensor (economico, facilmente reperibile e di cui esiste una ampia documentazione). Il sensore ha un connettore Japanese Solderless Terminal (JST). Si consiglia, quindi, l'acquisto del relativo pigtail, il quale viene fornito completamente assemblato e si collega direttamente a molti sensori Sharp.

                                                        

Come dispositivo di output useremo direttamente il LED connesso al pin digitale 13 della scheda. Il suo funzionamento è molto semplice: quando il pin è HIGH il LED è accesso, quando è LOW il LED è spento. È anche possibile effettuare il “dimming” del LED, dato che il pin 13 è anche un output PWM. Un semplice sketch sull'utilizzo del LED 13 è Blink, incluso tra gli esempi dell'Arduino IDE.

Se per voi è proprio la primissima volta con Arduino, sappiate che, per poter caricare gli sketch all'interno del microcontrollore, bisogna eseguire prima queste semplici istruzioni:

  • Collegate Arduino al computer attraverso il cavo USB.

                                                    

  • Se si usa Linux, come nel mio caso, non è necessario installare nessun driver. In caso si usassero altri sistemi operativi, seguite le istruzioni presenti sul sito ufficiale di Arduino. Connettendo il cavo USB al computer si accenderà il led ON della scheda ed il led L lampeggerà.
  • Effettuate il download dell’IDE per Arduino per il vostro sistema operativo. Ricordo che, in caso si possieda Arduino DUE, si deve necessariamente installare la versione 1.5 (ancora in fase Beta). Se si usa Linux, una volta scaricato il pacchetto lo si deve estrarre in una directory qualsiasi e fare doppio click sul file arduino per aprire l'IDE.
  • Una volta avviato il programma selezionate: Strumenti -> Porta seriale e scegliete la porta seriale.
  • Successivamente selezionate: Strumenti -> Board -> Arduino Due (Programming Port)
  • Ora siete pronti per caricare gli sketch su Arduino DUE.

Proviamo subito lo sketch d'esempio Blink, per il quale, come già detto, non è necessario nessun altro dispositivo o circuiteria esterna oltre che al nostro Arduino:

  • Da File -> Esempi -> 0.1Basics selezioniamo Blink. Si aprirà una schermata contenente il seguente codice
    /*

      Blink
      Turns on an LED on for one second, then off for one second, repeatedly.
     
      This example code is in the public domain.
     */

     
    // Pin 13 has an LED connected on most Arduino boards.
    // give it a name:
    int led = 13;

    // the setup routine runs once when you press reset:
    void setup() {                
      // initialize the digital pin as an output.
      pinMode(led, OUTPUT);    
    }

    // the loop routine runs over and over again forever:
    void loop() {
      digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);               // wait for a second
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);               // wait for a second

    }

  • Verifichiamo il codice cliccando sul tasto in alto a sinistra "Verifica" (ovviamente questa operazione è superflua in questo caso!).
  • In caso non ci siano errori andiamo a caricare il codice premendo sul tasto "Carica".
  • Attendiamo qualche secondo e dovrebbe presentarsi una schermata come quella riportata di seguito. Guardando la scheda, invece, potremo vedere il LED 13 lampeggiare.
  • Congratulazioni, Avete caricato correttamente il vostro primo sketch!!

Come abbiamo detto prima, però, non ci limiteremo a far lampeggiare un LED ma cercheremo di fargli cambiare stato in risposta all'elaborazione di informazioni che provengono da un dispositivo di input esterno, nel nostro caso da un sensore di prossimità.

Guardando il datasheet del sensore Sharp GP2Y0A21YK possiamo notare che ha un'uscita analogica e va, quindi, interfacciato ad uno dei 12 analog inputs presenti sulla scheda. Da notare che nonostante Arduino DUE abbia un ADC a 12 bit (quindi con la capacità di avere 4096 differenti valori), per default la risoluzione è impostata a 10 bit in modo da garantire la compatibilità con le altre schede Arduino che lavorano, appunto, a 10 bit. E' comunque possibile cambiare la risoluzione dell'ADC con il comando analogReadResolution()

Prima di collegare fisicamente il dispositivo cerchiamo di ragionare sul codice da utilizzare per la lettura di un input analogico. Anche in questo caso ci vengono incontro gli esempi presenti di default nell'IDE. In particolare, useremo lo sketch ReadAnalogVoltage, anch'esso selezionabile da File -> Esempi -> 0.1Basics.

Il codice in questo caso è:

/*
  ReadAnalogVoltage
  Reads an analog input on pin 0, converts it to voltage, and prints the result to the serial monitor.
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
 
 This example code is in the public domain.
 */
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
}

Ora che sappiamo come far "brillare" un LED e come leggere un segnale analogico, possiamo unire i due sketch per ottenere quello che ci serve per il nostro progetto. Ed ecco qua:

/*

Semplice Sketch sull'utilizzo interattivo di un dispositvo di input (GP2YOA21YK Infra Red Proximity Sensor)   con uno di output (LED sul Pin 13 di Arduino), adattando il codice degli Sketch di esempio ReadAnalogVoltage e Blink e aggiungendo la struttura di controllo "if else"

*/

int sensorPin = 5; //analog pin 5

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);

// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 5:
int sensorValue = analogRead(sensorPin);

// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 3.3V):
// Si noti che su Arduino Due la tensione massima che i pin I /O sono in grado di tollerare //è di 3.3V e non 5V. Il valore considerato per la conversione è quindi 3.3V e non 5V, //come da default nello sketch d'esempio ReadAnalogVoltage

float voltage = sensorValue * (3.3 / 1023.0);
Serial.println(voltage);
//just to slow down the output - remove if trying to catch an object passing by
delay(100);        // delay in between reads for stability

if ( voltage < 1 )     // se l'ostacolo si trova ad una distanza tale per cui  il segnale in uscita //dal sensore è minore di 1 V ( distanza superiore a circa 30 cm) il LED si //spegne,altrimenti si accende
{digitalWrite(led, LOW);   // turn the LED off by making the voltage LOW
}else
{
digitalWrite(led, HIGH);    // turn the LED on (HIGH is the voltage level)
}
}

Anche in questo caso lo sketch è molto semplice.

Nella sezione globale definiamo le variabili che intendiamo usare e assegniamo dei nomi ai piedini che useremo per l'ingresso e per l'uscita. Il codice di inizializzazione ( setup ) configura i piedini per le loro rispettive funzioni ed inizializza la comunicazione seriale, in modo da essere in grado di inviare i dati al PC. Il codice eseguito nel ciclo principale ( loop ) legge dall'ingresso analogico e copia il dato letto nella variabile che abbiamo allocato. Poi fa un semplice test per verificare se il valore letto è al di sotto di un valore soglia, nel qual caso spegne il LED.

Come si può notare la soglia è impostata in base al valore di potenziale letto e non in base alla effettiva distanza dell'oggetto. Sarebbe opportuno quindi fare una conversione da V in cm in base alla curva caratteristica del sensore. Guardando il datasheet si nota che, purtroppo, tale curva non è lineare. Per una conversione soddisfacente sarebbe, quindi, opportuno effettuare delle operazioni matematiche per linearizzare la curva ed ottenere una funzione di conversione da aggiungere nello sketch, oppure affidarsi a  librerie scritte ad hoc per il sensore che si sta utilizzando. Purtroppo questa libreria funziona solo per la vecchia versione di Arduino e non per Arduino DUE. Nel caso disponiate di un Arduino precedente al DUE, potrete utilizzare la libreria seguendo le istruzioni presenti nella pagina già indicata, dove c'è anche una breve spiegazione di come funziona il sensore.

OSSERVAZIONE: una nota assolutamente importante è che, a differenza di altre schede Arduino, la scheda Arduino DUE funziona a 3.3V! La tensione massima che i pin I /O sono in grado di tollerare è di 3.3V. Fornire tensioni più elevate, come 5V a un pin I /O potrebbe danneggiare la scheda.

Per poter essere sicuri che la tensione di uscita del sensore sia inferiore a 3.3V diamo uno sguardo al datasheet.

MALE, MOLTO MALE!

Dalla tabella Absolute Maximum Ratings si legge che l'Output terminal Voltage va da -0,3V a Vcc+0,3V, e considerando che Vcc, cioè l' Operating Supply Voltage, è 5V, in linea teorica l'output del sensore può arrivare ben al di sopra di quel valore massimo, con il rischio concreto dei "friggere" la scheda.

Guardando meglio il datasheet, tuttavia, possiamo notare dalla figura 4 che il massimo della curva "Analog Output Voltage vs. Distance to Reflective Object" è intorno ai 3 V. Quindi, usando un po' di accortezza si potrebbe comunque collegare il sensore stando ben attenti a lasciare il campo libero da oggetti per una distanza di almeno 20 cm. In questo modo l'output arriverà al massimo a circa 1,5 V, ben al di sotto dei fatidici 3,3 V. Nonostante questo accorgimento sia ragionevolmente sufficiente per lavorare in tutta sicurezza, senza la preoccupazione di bruciare qualcosa, vi esorto a NON collegare il sensore ad Arduino DUE, a meno che non abbiate abbastanza esperienza e/o vi piaccia rischiare.

Per ovviare a questo inconveniente della compatibilità dei pin a 3,3V, sono aperti numerosi topic sul forum ufficiale di Arduino come anche su vari forum di elettronica in giro su internet. Le soluzioni proposte sono tante ma sembra che non si sia ancora arrivati ad una soluzione definitiva o ottimale e che abbia riscosso più successo delle altre.

Di comune accordo con Emanuele, si è deciso di non proporre una soluzione e di lasciare il quesito aperto alla Community proprio a partire da questo articolo, in modo che se ne possa discutere nei commenti.

Dunque, a voi la parola!!

Scarica subito una copia gratis

11 Commenti

  1. Avatar photo Piero Boccadoro 26 Aprile 2013
  2. Avatar photo alex272 26 Aprile 2013
  3. Avatar photo Luigi Francesco Cerfeda 28 Aprile 2013
  4. Avatar photo Boris L. 28 Aprile 2013
  5. Avatar photo Luigi Francesco Cerfeda 28 Aprile 2013
  6. Avatar photo Piero Boccadoro 28 Aprile 2013
  7. Avatar photo rleo79 29 Aprile 2013
  8. Avatar photo Piero Boccadoro 30 Aprile 2013
  9. Avatar photo Luigi Francesco Cerfeda 30 Aprile 2013
  10. Avatar photo Piero Boccadoro 1 Maggio 2013

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend