Arduino ABC: primi passi di programmazione con Arduino

Questo articolo riprende la serie di articoli riguardanti Arduino e le sue basi. La parte precedente ha trattato la sua nascita, piedinatura e le sue principali caratteristiche. L’articolo si può trovare qui

Questa miniguida è strutturata in 4 parti fondamentali:

  • Struttura di un programma Arduino: setup() e loop() e primo esempio
  • Analisi di un altro esempio con altri tipi di funzioni
  • Le librerie
  • Reference delle funzioni base di Arduino: un piccolo PDF con tutti i tipi di dati, strutture e funzioni supportati dall’Arduino.
Cominciamo!

Struttura di un programma Arduino
 
Arduino utilizza un linguaggio C leggermente modificato, nel senso che è specializzato per avere opportune funzioni per i microcontrollori Atmega.
Il programma è suddiviso in due parti fondamentali:
  • Inizializzazione.
  • Loop(ciclo) principale.
L’inizializzazione serve appunto a inizializzare il nostro sistema: dare un valore iniziale ad alcune variabili (non definirle, altrimenti esse non saranno disponibili all’esterno del metodo stesso), impostare i pin di ingresso/uscita, iniziare la comunicazione seriale e altro.Questa parte di codice viene eseguita per prima e una sola volta per l’intera vita dell’esecuzione del programma.
Il loop principale, invece, è un insieme di istruzioni che viene eseguito ciclicamente(arrivati alla fine si ricomincia da capo) ed è il “cuore” del nostro programma, dove vengono intraprese le azioni da fare durante tutta l’esecuzione del codice.
Adesso introduciamo un piccolo esempio che mostra tutto ciò (il programma in questione si trova tra gli esempi all’interno dell’Arduino IDE).
In questo primo caso si analizzerà lo sketch “blink” della categoria basics che accenderà e spegnerà un led in un periodo di un secondo:
 
 C |  copy code |? 
01
/*Ecco la funzione setup() nella quale settiamo il pin 13 come OUTPUT attraverso la funzione pinMode().
02
Per questo esempio possiamo collegare direttamente un LED al pin13 e la massa direttamente accanto perchè questo pin è pensato apposta per i LED.</div>
03
<div>In aggiunta, anche se non avessimo un LED, ce n'è uno all'interno della scheda stessa, contraddistinto dalla label "L"*/
04
void setup(){
05
pinMode(13, OUTPUT);
06
}/*Nel loop viene richiamata la funzione digitalWrite che è capace di scrivere uno 0 o un 1 fisici(attraverso una tensione alta o meno) al pin che chiediamo
07
*/
08
void loop() {
09
digitalWrite(13, HIGH); //qui viene acceso il led
10
delay(1000); //qui si aspetta per un secondo attraverso il metodo delay(val)
11
digitalWrite(13, LOW); //qui viene spento il led
12
delay(1000); //si aspetta un altro secondo, poi si ricomincerà il loop.
13
}
 
Un’altro esempio
 
In questo caso useremo un canale analogico di ingresso(un potenziometro) e uno in uscita(un LED) che piloteremo attraverso un PWM. Inoltre ci faremo mandare attraverso la seriale il valore letto dall’ingresso analogico.

 C |  copy code |? 
01
const int analogInPin = A0; // pin analogico al quale è attaccato il potenziometro
02
const int analogOutPin = 9; // pin analogico al quale è collegato il LED
03
 
04
int sensorValue = 0; // valore letto dalla porta
05
int outputValue = 0; // valore da mandare con la PWM al LED
06
 
07
void setup() {
08
// con questo metodo si inizializza la porta seriale ad una certa velocità bps
09
Serial.begin(9600);
10
}
11
 
12
void loop() {
13
// leggiamo il valore dall'ingresso analogico
14
sensorValue = analogRead(analogInPin);
15
// lo mappiamo nel range di uscita(fa praticamente una proporzione)
16
outputValue = map(sensorValue, 0, 1023, 0, 255);
17
// cambia il valore dell'uscita analogica(PWM)
18
analogWrite(analogOutPin, outputValue);
19
 
20
// scrive il risultato sulla porta seriale
21
Serial.print("sensor = " );
22
Serial.print(sensorValue);
23
Serial.print("\t output = ");
24
Serial.println(outputValue);
25
 
26
//aspetta 10 millisecondi per fare in modo che l'ingresso analogico sia di nuovo pronto
27
delay(10);
28
}
29

 
Librerie
 
Ci sono numerose librerie(suddivise tra standard e di terzi) che aumentano le funzionalità dell’Arduino.
Le librerie standard si possono aggiungere nell’IDE premendo su sketch->import library.
EEPROM: Permette di leggere e scrivere in un’area di memoria permanente(1024 bytes nell’ATmega368).
Ethernet: Permette all’Arduino di connettersi alla rete attraverso l’Ethernet.Permette di far funzionare l’Arduino come server.
Firmdata: Implementa il protocollo Firmdata per la comunicazione tra l’Arduino e il PC.
LiquidCrystal: Permette di gestire gli schermi LCD compatibili con l’Hitaci HD44780. Funziona sia in modalità 4 o 8 bit.
SD: Permette la gestione di una scheda SD(creazione, apertura, cancellazione di file, ricerca ecc..).
Servo: Implementa delle funzioni che facilitano il controllo di servomotori. La libreria gestisce fino a 12 servi(nell’Arduino).
SPI: Permette di comunicare con device SPI, utilizzando l’Arduino come Master.
SoftwareSerial: Permette di utilizzare altri pin poter comunicare con altre device attraverso una comunicazione seriale. Non tutti i pin sono utilizzabili.
Stepper: Permette di utilizzare motori passo-passo uni o bipolari. Serve, oltre al motore, anche l’hardware apposito.
Wire: Permette di comunicare con dispositivi I2C/TWI
 
Alcune delle librerie di terze parti più utilizzate e importanti sono:
NewSoftSerial: Una libreria che consente altri pin per la seriale, ma apporta alcuni miglioramenti.
Webduino: Migliora la gestione delle capacità Web dell’Arduino, soprattutto dal lato server.
XBee: Libreria che permette di comunicare con dei dispositivi XBee in modalità API.
CapacitiveSensing: Trasforma più pin in un sensore capacitivo, solo con qualche modifica per i sensori.
LedControl: Per controllare in modo efficiente matrici di Led, 7 segmenti con un MAX7221 e MAX7219.
Matrix: Per controllare matrici di Led.
DateTime: Una libreria per tener traccia della data e ora corrente nel software.
 
 
Reference
 
Per l’articolo ho scritto una reference di tutte le strutture, tipi di dati e funzioni base consentite dall’Arduino e di alcune classi fondamentali( le funzioni di alcune librerie verranno trattate in altri articoli).
La reference si può scaricare qui : Quick Arduino reference in italiano (3798)

Iscrivendoti alla nostra newsletter dedicata ad Arduino verrai aggiornato periodicamente(più o meno una volta al mese) su:
  • Gli ultimi articoli per tenersi aggiornati sul mondo Arduino.
  • Progetti sviluppati da noi con risorse da scaricare esclusive per chi è iscritto.

Che aspetti? Compila il form nella Home!

Spero che questo lavoro sia stato utile…per qualunque mancanza, spiegazione non corretta o altro commentate pure :)
Luca Panebianco

Luca Panebianco

Ciao! Mi chiamo Luca e frequento la magistrale in Ingegneria Informatica e dell'Automazione all'Università Politecnica delle Marche. Qui ho apprezzato pian piano la programmazione su microcontrollori oltre che la canonica sul PC. Sono interessato ai vari campi della programmazione su diversi dispositivi.

More Posts

By Luca Panebianco | marzo 13th, 2012 | SHOW COMMENTS (3)
  • http://about.me/michelebrami Michele Brami

    …non so molto di Arduino, anzi non ne so praticamente nulla… Ma è un controller con un unico thread? Non si possono creare più task da far eseguire in contemporanea?

    • Luca Panebianco

      Ciao michele,
      di suo l’Arduino non consente il multithreading che è anche una cosa che, per il target con cui è stata creata la scheda, non sembra una delle sue necessità.
      Fortunatamente ci sono delle librerie che lo consentono e quella che ti potrebbe maggiormente interessare è protothread, che implementa un sistema di thread pensato proprio per quelle piattaforme con capacità limitate(un thread occupa 2 kb circa), sviluppata totalmente in C.
      Un tutorial lo puoi trovare qui: http://harteware.blogspot.com/2010/11/protothread-powerfull-library.html
      Questo è un’argomento affascinante che necessiterà sicuramente approfondimento anche qui su AOS.

  • Pingback: Il +1 - Pagina 5039