Archivi tag: arduino

Cosa fa un gruppo di amici il primo dell’anno?

Cosa fa un gruppo di amici, compagni di università, smanettoni hardware e software dalla nascita la mattina del primo dell’anno?
Colazione a mezzogiorno, passeggiata per i monti… mangiata alle 15… caffé e “smanettamento” puro con l’elettronica per sistemare il termostato GSM dell’amico Sax…
si lo so si potrebbe fare altro ma siamo fatti così 🙂

Oggi ho avuto occasione di vedere la versione 2 del progetto termostato GSM realizzato da Alex, un gran bel lavoro, rispetto alla prima versione, diverse migliorie sia sull’elettronica che sul software.
Originalissima la funzione di watchdog realizzata con un NE555 in configurazione astabile.

Ci sono moltissi occasioni in cui é indispensabile effettuare un reset della vostra scheda: crash, loop infiniti, ecc…
Il circuito che effettua questo tipo di reset prende il nome di “watchdog” (cane da guardia) ed é un circuito elettronico, indipendente dalla vostra scheda Arduino, che controlla costantemente lo stato della vostra applicazione e rileva se qualcosa va storto, in tal caso effettua un reset della scheda per farla ripartire.

Per la spiegazione dettagliata leggete l’ultimo post su play with ArduinoArduino Hardware Watchdog

Buon divertimento 🙂

Installare Arduino 0023 su Ubuntu 11.10 (Oneric Ocelot)

Una simpatica soorpresa, dopo l’aggiornamento ad Ubuntu 11.10 nei laboratori della scuola scopro che Arduino 0023 non funziona, errore di compilazione!

Qualche tempo fa avevo realizzato il tutorial per l’installazione di Arduino su Ubuntu 9.10 (karmic), la procedura per l’installazione è simile anche per Ubuntu 11.10, ma per accelerare i passi userò i comandi da terminale ed inoltre vi mostrerò con alcune schermate come procedere per eliminare l’errore di compilazione.

La soluzione al problema di compilazione è stata trovata da Matt Greensmith che ha scoperto il bug presente su questa versione di Arduino.

Grazie Matt!

Al suo tutorial ho aggiunto una serie di schermate per:

  • mantenere memoria storica e ricordarmi come procedere in futuro
  • per rendere più semplice il lavoro a chi non è molto esperto nell’uso di Ubuntu.

Ma perchè si ha un errore di compilazione?

La nuova versione della libreria avr-gcc causa un errore di compilazione su qualsiasi sketch segnalando un problema sulla libreria math.h (vedi immagini più avanti). Il problema dipende dal fatto che nella libreria math.h è definita la funzione round che guarda caso è anche definita anche nel core di Arduino, questo ovviamente causa un conflitto.

Vediamo come procedere.

Installazione Arduino

01. Per prima cosa scaricate dal sito Arduino la versione 0023:

02. Con una nuova installazione di Ubuntu è necessario installare Java. Usiamo il terminale e digitiamo:

sudo apt-get install openjdk-7-jre

Inserite la password amministratore e premete invio:

Rispondete “s” quando vi viene chiesto di “Continuare” con l’installazione:

Non dovrete confermare più nulla, capirete che l’installazione di Java è conclusa quando comparirà nuovamente il prompt:

03. A questo punto, come detto nel tutorial precedente, bisogna installare la libreria AVR C, procediamo sempre da linea di comando:

sudo apt-get install avr-libc gcc-avr

Anche in questo caso vi verrà richiesto di confermare con “s” l’installazione:

e continuate fino a quando non compare nuovamente il prompt:

04. a questo punto eseguiamo Arduino facendo click sul “Arduino”

e facciamo click su esegui:

05. selezionate la board corretta (nel mio caso Arduino UNO):

06. selezionate la porta seriale corretta:

07. verifichiamo il funzionamento di Arduino aprendo dagli esempi lo sketch “blink” e compiliamo:

notate che, come detto all’inizio del tutorial, viene restituito l’errore che fa riferimento alla libreria math.h

08. per correggere l’errore bisogna aprire il file wiring.h la cui posizione è: /arduino-0023/hardware/arduino/cores/arduino/wiring.h, potete accedervi direttamente usando il terminale oppure aprirlo con il vostro editor di testo preferito. Di seguito le schermate che vi mostrano la posizione di wiring.h nella gerarchia delle cartelle partendo dalla cartella: Arduino 0023:

[wpspoiler name=”Dove si trova wiring.h ?”]

[/wpspoiler]

09. editiamo il file wiring.h

Come detto sopra, aprite il file con il vostro editor di testi preferito, io ho usato “pico” da terminale e posizionatevi sulla riga 79 e rendetela commento aggiungendo “//” all’inizio della riga:

// #define round(x)     ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

Bene!
L’installazione e la correzione del bug è terminata, ora potete incominciare ad utilizzare Arduino.

Appunti di programmazione su Arduino: variabili

Una variabile è un modo per nominare e memorizzare un valore numerico per un successivo utilizzo da parte del programma.
Come suggerisce il loro nome, le variabili sono numeri che possono essere cambiati continuamente rispetto alle costanti il cui valore non cambia mai. Una variabile deve essere dichiarata ed eventualmente si assegna il valore che si vuole conservare.
Il codice che segue dichiara una variabile denominata inputVariable a cui poi viene assegnato il valore presente sul pin analogico di ingresso n. 2

int inputVariable = 0;         // si dichiara una variabile a cui
                               // è assegnato il valore 0
inputVariable = analogRead(2); // imposta la variabile al valore
                               // presente sul pin analogico 2

inputVariable è la variabile.
Nella prima riga viene dichiarato che inputVariable conterrà un int, dove int è l’abbreviazione di numero intero. La seconda riga imposta la variabile al valore presente sul pin analogico 2, ciò permetterà di rendere disponibile il valore del pin 2 in altre parti del codice.

Una volta che una variabile è stata assegnata, o ri-assegnata, è possibile leggerne il valore per vedere se soddisfa a determinate condizioni, oppure è possibile utilizzare direttamente il suo valore.

Nell’esempio che segue sono illustrati tre operazioni utili con le variabili: se la condizione “inputVariable inferiore a 100” risulta vera, viene assegnato a inputVariable il valore 100 e poi viene impostato un ritardo (delay) di valore pari alla quantità memorizzata in inputVariable che ora vale 100.

if (inputVariable < 100) // verifica se la viariabile è
                         // minore di 100
{
  inputVariable = 100;   // se vero viene assegnato 100
}
  delay(inputVariable);  // usa la variabile per
                         // impostare il ritardo

Nota: alle variabili bisognerebbe dare un nome descrittivo (che ne spiega il significato) in modo che il codice sia più leggibile. I nomi di variabili come tiltSensor o pushButton aiutano il programmatore e chiunque legga il codice, a capire cosa rappresentano le variabili. I nomi delle variabili, come var o value, non rendono leggibile il codice e le usiamo solo come esempio.
Ad una variabile possiamo assegnare una qualsiasi parola che non sia già una delle parole chiave nel linguaggio Arduino.

Dichiarazione delle variabili

Tutte le variabili devono essere dichiarate prima di poter essere utilizzate. Dichiarare una variabile significa:

  • definire il tipo del valore che può assumere: int, long, float, ecc…
  • assegnare un nome
  • e opzionalmente assegnargli un valore iniziale

queste operazioni vengono fatte una volta sola nel programma, ma il valore della variabile può essere modificato in qualsiasi momento usando l’aritmetica o utilizzando delle assegnazioni.

Nell’esempio che segue viene dichiarato che inputVariable è un int, (tipo intero) e che il suo valore iniziale è uguale a zero. Questo è chiamata assegnazione semplice.

int inputVariable = 0;

Una variabile può essere dichiarata in posizioni diverse all’interno di un programma e in funzione della posizione in cui viene definita determina quali parti del programma possono utilizzarla.

Visibilità (o portata o scope) di una variabile

Una variabile può essere dichiarata

  • all’inizio del programma prima di void setup();
  • a livello locale all’interno di funzioni;
  • e talvolta, all’interno di un blocco di istruzioni ad esempio all’interno di un ciclo

La posizione in cui viene dichiarata la variabile determina la sua visibilità all’interno del programma e la capacità, da parte di alcune parti del programma, di utilizzarla. Una variabile globale è una variabile che può essere vista e utilizzata da ogni funzione del programma e in ogni istruzione del programma.

Una variabile per essere globale deve essere dichiarata all’inizio del programma, prima della funzione setup().

Una variabile è detta locale quando è definita all’interno di una funzione o come parte di un ciclo, essa è visibile e può essere utilizzato solo all’interno della funzione in cui è stata dichiarata. E’ quindi possibile avere due o più variabili con lo stesso nome in diverse parti dello stesso programma che contengono valori diversi.
Garantire che solo una funzione ha accesso alle sue variabili semplifica il programma e riduce il rischio di errori di programmazione.

L’esempio che segue mostra come dichiarare diversi tipi di variabili e dimostra la visibilità di ogni variabile.

int value;   // 'value' è visibile da ogni funzione

void setup()
{
   // non è necessario nessun setup
}

void loop()
{
   for (int i=0; i=0; i<20;) // 'i' è visibile solamente all'interno del ciclo for
   {
     i++;
   }
   float f;                  // 'f' è visibile solo all'interno di loop
}

Per le lezioni precedenti consultare la sezione Appunti di programmazione che trovate nella pagina Arduino di questo sito.

Play With Arduino

Credo che voi come me abbiate incontrato durante la vostra vita insegnanti o amici che vi hanno donato un’idea o un modo di operare che vi ha arricchito intellettualmente e migliorato la vostra vita lavorativa. Io ne ho molti e tra questi sicuramente l’amico Alessandro Rodella (Alex per gli amici) è l’esempio per me di creatività tecnica/elettronica. Alessandro è un software engineer in una grande azienda che produce software di Borsa per l’Italia e per mercati borsistici esteri, a lui si deve la direzione di importantissimi progetti. Con lui condivido la stessa passione per l’elettronica e fin da bambini ci portiamo dentro la voglia di smontare dispositivi elettronici per scoprirne il funzionamento. Una delle ultime passioni di Alex è Arduino con cui sta realizzando apparati interessantissimi, in questo ultimo periodo si sta occupando di domotica e finalmente ha deciso di incomiciare a pubblicare i suoi esperimenti.

Per l’occasione ha realizzato un sito: Play With Arduino

e vi assicuro, è un bel giocare!

Le soluzioni che Alex sta pensando hanno, secondo me, valenza industriale ed il primo dei tutorial, suddiviso in tre parti ne è un esempio: un termostato GSM.

Il termostato è stato ultimato e messo in funzione oggi, inutile dirvi che funziona perfettamente!

Certamente una bella esperienza che potrò realizzare con i miei allievi.

Su Play With Arduino troverete nelle prossime settimane altri interessantissimi progetti non mancate di visitare il sito… stay tuned.

Appunti di programmazione su Arduino: strutture

Incomincio questa nuova serie di lezioni per i miei studenti di 4′ che in questo anno scolastico incominceranno il corso di Arduino. Questi appunti non sono disgiunti dalle lezioni di base sull’utilizzo di Arduino (che trovate nella sezione Arduino di questo sito), ma sono da considerare come integrazione ampliando la parte dedicata alla pura programmazione.

Inolte ho deciso di incominciare questa nuova serie di lezioni perché sollecitato anche dalle mail di diversi utenti che mi hanno chiesto più volte dettagli sulla programmazione… e poi visto che devo insegnare programmazione in C, tanto vale usare il C usato in Arduino che mi permette di far percepire “fisicamente” il risultato della programmazione e quindi maggior gratificazione da parte dello studente. Ho constatato che la voglia di studiare aumenta se la programmazione ha effetto su una struttura fisica (led, motori, relè ecc….) si contestualizza sul pratico e lo studente comprende che ciò che fa a scuola serve (a molti ancora non è chiaro questo aspetto…)

Molto più difficile sarebbe se restassi sul virtuale e insegnassi il C facendo progetti che non hanno un riscontro sul mondo fisico… provare per credere dopo più di 20 anni di insegnamento ne sono convinto.

Fatta la premessa… lo scopo utilizzare, come indice degli argomenti da trattare, il libro di Brian W. Evans: Arduino programming notebook, che ricordo essere sotto licenza Creative Commons Attribution-Noncommercial-Share Alike 3.0 License (che è la stessa di questo sito), per strutturare un nuovo libro on-line in cui aggiungere gli appunti del mio corso.  Cercherò di dare al tutto una struttura “scolastica” in modo da renderla più semplice per lo studente.

Il libro subirà variazioni e correzioni, quindi anche ad opera conclusa, nei mesi che seguiranno effettuerò variazioni ed integrazioni che evidenzierò con data e versione.

Se desiderate scaricare gratuitamente il libro di Brian W. Evans trovate il link al pdf nella sezione Arduino al paragrafo libri free.

Spero che queste lezioni possano servire e se durante l’esposizione trovate errori o incongruenze o avete suggerimenti non esitate a darmene comunicazione, pubblicherò volentieri i vostri contributi.

Grazie.

Strutture

La struttura base di un programma Arduino è abbastanza semplice e si sviluppa in almeno due parti.
Queste due parti, o funzioni, necessarie racchiudono parti di istruzioni.

void setup()
{
statements;
}

void loop()
{
statements;
}

Dove setup() indica il blocco di settaggio e loop() è il blocco che viene eseguito. Entrambe le sezioni sono necessarie per far si che un programma funzioni.

setup() è la prima funzione ad essere invocata verrà eseguita una volta sola e in essa vengono dichiarate le variabili usate nel programma, è usata per impostare il pinMode o inizializzare la comunicazione seriale.

La funzione loop() contiene il codice che deve essere eseguito ripetutamente, in essa vengono letti gli input, i segnali di output ecc…
Questa funzione è la parte principale di un programma Arduino (sketch), esegue la maggior parte del lavoro.

setup()
La funzione setup() è chiamata una volta sola quando il programma viene fatto funzionare. E’ usata per inizializzare il pinMode e la seriale e deve essere incluso in un programma, anche se non ci sono istruzioni da eseguire.

void setup()
{
	pinMode(pin, OUTPUT);	//inposta il 'pin' come output
}

loop()
Dopo che è stata eseguita la chiamata alla funzione setup(), la funzione loop() fa esattamente quello che suggerisce il suo nome, esegue ripetutamente un loop, permettendo al programma di modificare, rispondere e controllare la scheda Arduino.

void loop()
{
	digitalWrite(pin, HIGH); // imposta 'pin' ad on
	delay(1000);             // effettua una pausa di 1 secondo
	digitalWrite(pin, LOW);  // imposta 'pin' ad off
	delay(1000);             // effettua una pausa di 1 secondo
}

funzioni

Una funzione è un blocco di codice a cui è attribuito un nome, è da intendersi come un blocco di istruzioni che vengono eseguite quando viene invocata la funzione.

Delle funzioni void setup ()void loop () abbiamo già discusso, parleremo di altre funzioni più avanti.

Le funzioni personalizzate possono essere scritti per eseguire compiti ripetitivi e ridurre confusione in un programma. Quando si dichiara una funzione in primo luogo bisogna dichiarare il tipo della funzione, cioè il tipo di valore restituito dalla funzione, quindi se la funzione è di tipo ‘int’ (intero), vorrà dire che restituirà un valore intero.

type functionName(parameters)
{
statements;
}

La funzione di tipo intero: delayVal() è utilizzata per fissare un valore di ritardo in un programma che legge un valore da un potenziometro. Per prima cosa dichiariamo una variabile locale v di tipo intero, impostiamo v al valore restituito dalla funzione analogRead(pot), che può restituire un valore compreso tra 0 e 1023, dividiamo il valore ottenuto per 4 per ottenere un valore compreso tra 0 e 255 e infine restituiamo questo valore al programma principale (quello che ha invocato delayVal() ).

int delayVal()
{
  int v;               // varibile temporanea intera 'v'
  v = analogRead(pot); // lettura del valore del potenziometro
  v /= 4;              // conversione da 0-1023 a 0-255
  return v;            // restituisce il valore finale
}

{} Parentesi graffe

Le parentesi graffe (dette anche solamente “parentesi” o “parentesi graffe”) definiscono l’inizio e la fine di un blocco funzione e blocchi istruzione così come la funzione void loop() e le istruzioni for e if

type function()
{
  statements;
}

Una parentesi graffa aperta deve essere sempre seguita da una parentesi graffa chiusa. Questo è spesso indicato come bilanciamento delle parentesi. Parentesi non bilanciate possono creare diversi problemi al compilatore e talvolta possono essere difficili da rintracciare in un programma molto esteso.

L’ambiente Arduino include una funzione utile per controllare il bilanciamento delle parentesi graffe. E’ sufficiente selezionare una parentesi o fare click immediatamente dopo la parentesi affinchè venga evidenziata la parentesi logicamente corrispondente.

; punto e virgola

Il punto e virgola deve essere usato al termine di un’istruzione e separa gli elementi di un programma. Il punto e virgola è usato per separare elementi in un ciclo for.

int x = 13; // dichiara che la variabile ‘x’ è un intero

dimenticare un punto e virgola al termine di una riga produrrà un errore di compilazione. La rilevazione di un punto e virgola mancante non è sempre semplice da rilevare, alcune volte il compilatore potrebbe darvi dei messaggi di errore che possono sembrare illogici, in questo caso la prima cosa da fare è controllare la mancanza di un punto e virgola nei pressi della linea di codice dove il compilatore ha evidenziato l’anomalia.

/*…*/ blocco commenti

I blocchi commenti, o commenti multi-linea, sono aree di testo che sono ignorate dal programma e sono usate per una descrizione lunga del codice oppure commenti che aiutano la comprensione di parti del programma. Il bloccco commento incomincia con /* e termina con */ e può occupare più righe.

/* questo è un blocco commento chiuso
non dimenticare di chiudere il commento
anche i segni di blocco commento sono bilanciati
*/

poiché i commenti vengono ignorati dal programma, essi non occupano spazio di memoria, quindi è opportuno usarli frequentemente, abbondando il più possibile nello specificare le azioni dei vari blocchi del programma, agendo in questo modo sarà anche più semplice effettuare il debug del programma.

Nota: non è possibile annidare blocchi di commenti, cioè inserire un blocco commento all’interno di un altro blocco commento.

// commenti in singola linea
I commenti in singola linea incominciano con // e terminano con la successiva linea di codice. Come per il blocco commento, anche i commenti in singola linea sono ignorati dal programma e non occupano spazio di memoria.

// questo è un commento su una sola linea

I commenti su un’unica linea sono spesso usati dopo un’istruzione per fornire maggiori informazioni sull’azione che compie e per futura memoria.

Tutti gli appunti realizzati potete trovarli nalla sezione: Appunti di programmazione nella sezione Arduino di questo sito.