Sei sulla pagina 1di 54

CORSO di ELECTRONIC DESIGN AND RAPID

PROTOTYPING

UNIVERSITA’ DEL SALENTO

Dip. Ingegneria dell’Innovazione

Prof. P. Visconti
http://forum.arduino.cc/index.php?action=profile;u=58300
Arduino è un progetto
formato…

• da una parte hardware il cui cuore è un microcontrollore della ATMEL;


• da una parte software per la programmazione del dispositivo.

Offre un ampio ventaglio di interfacce:


Seriale, Bluetooth, Ethernet, SD, SPI, I2C, Wireless

Prof. P. Visconti Il sito di riferimento è www.arduino.cc


Arduino principali
caratteristiche
Caratteristiche tecniche:
- Microcontrollore ATmega328
-Tensione di lavoro 5V
-Tensione di ingresso (consigliato) 7-12V
-Tensione limite 6-20V
-14 pin digitali I / O : -32 KB di memoria Flash di cui 0,5
6 utilizzabili come uscite di tipo PWM; KB utilizzati dal bootloader
4 utilizzabili per comunicazione SPI; -SRAM 2 KB
2 utilizzabili per comunicazione I2C; -EEPROM 1 KB
2 utilizzabili per i collegamenti seriali -Velocità di clock 16 MHz
TTL level;
2 utilizzabili per interrupt esterno;
6 pin di ingresso analogico
-Corrente per I / O 40 mA
Prof. P. Visconti
-Corrente per 3,3 V 50 mA
Arduino Uno: pinout

Prof. P. Visconti
Pin Digitali
Ognuno dei 14 pin Digital I/O dell’Arduino può essere utilizzato sia come input che
come output. Pertanto Arduino è in grado di acquisire informazioni da sensori e
gadget elettronici e al contempo pilotare motori, emettere suoni o accendere luci.
I pin Digital I/O operano ad una tensione di 5V e possono fornire fino a 40mA di
corrente.

Alcuni di questi pin hanno funzioni specifiche:


Serial: pin 0 (RX) e pin 1 (TX). Sono rispettivamente il pin di trasmissione e
ricezione per la comunicazione seriale. Lavorano a 5V e sono connessi con l’USB.
Possono essere utilizzati per connettere un modulo bluetooth. In questo caso il
modulo deve essere scollegato per permettere la scrittura del firmware attraverso
l’USB.
External Interrupts: pin 2 e 3. Questi pin possono essere configurati per la
generazione di interrupt. Possono cioè essere configurati in modo che se il valore
del pin cambia, l’esecuzione del codice viene interrotta momentaneamente per
Prof. P. Visconti
eseguire un’altra operazione, associata al cambiamento del pin
Arduino principali
caratteristiche
La modulazione a larghezza di impulso è largamente utilizzata per regolare la potenza
elettrica inviata ad un carico, per esempio negli inverter, per regolare la velocità dei motori
in corrente continua e per variare la luminosità delle lampadine.

Come si può intuire, con un duty cycle pari a zero la potenza trasferita è nulla, mentre al
100% la potenza corrisponde al valore massimo trasferito nel caso non sia presente il circuito
di modulazione. Ogni valore intermedio determina una corrispondente fornitura di potenza.

Prof. P. Visconti
SPI (Serial Peripheral Interface)
Il Serial Peripheral Interface è un sistema di comunicazione tra un
microcontrollore e altri circuiti integrati o tra più microcontrollori.
La trasmissione avviene tra un dispositivo detto master e uno o più slaves. Il
master controlla il bus, emette il segnale di clock, decide quando iniziare e
terminare la comunicazione.
Il bus SPI si definisce:
• di tipo seriale
• sincrono per la presenza di un clock che coordina la trasmissione e
ricezione dei singoli bit e determina la velocità di trasmissione
• full-duplex in quanto il "colloquio" può avvenire contemporaneamente in
trasmissione e ricezione.

Prof. P. Visconti
SPI (Serial Peripheral Interface)
• Ogni device ha uno shift register contenente i
dati. Il trasferimento prevede lo scambio del
contenuto.
• In ogni trasferimeno avvengono gli scambi M->S e
S<-M
• Il Master indirizza lo slave, e gestisce il
trasferimento con il segnale SCK
• I dati in uscita vengono scritti in corrispondenza
del fronte di salita
[discesa] di SCK
• I dati vengono campionati sul fronte opposto

Prof. P. Visconti
I2C

Acronimo di Inter Integrated Circuit , è un sistema di comunicazione seriale bifilare


utilizzato tra circuiti integrati.
Il classico bus I²C è composto da almeno un master ed uno slave.
La situazione più frequente vede un singolo master e più slave; possono tuttavia
essere usate architetture multimaster e multislave in sistemi più complessi.

Il protocollo hardware dell'I2C richiede due linee seriali comunicazione:


• SDA (Serial DAta line) per i dati
• SCL (Serial Clock Line) per il clock (per la presenza di questo segnale
l'I2C è un bus sincrono).

Prof. P. Visconti
Arduino principali caratteristiche

• Memoria SRAM 2KB;

• Memoria FLASH 32KB di cui 2 utilizzati per il bootloader;


• Memoria EEPROM 1KB
• Microcontrollore ATMEGA328 a 16 MHz

Prof. P. Visconti
SRAM

La SRAM, acronimo di Static Random Access


Memory, è un tipo di RAM volatile che non
necessita di refresh. I banchi di memorie SRAM
consentono di mantenere le informazioni per un
tempo teoricamente infinito, hanno bassi tempi di
lettura e bassi consumi.

Prof. P. Visconti
FLASH

La memoria flash, anche chiamata flash memory, è una tipologia di


EEPROM, quindi di memoria non volatile, che per le sue prestazioni può
anche essere usata come memoria a lettura-scrittura.
La memoria flash, trattandosi di memoria a stato solido, non presenta
alcuna parte mobile quindi è piuttosto resistente alle sollecitazioni e agli
urti, inoltre è estremamente leggera e di dimensioni ridotte.
La memoria flash è particolarmente indicata per la trasportabilità, proprio
in virtù del fatto che non richiede alimentazione elettrica per mantenere i
dati e che occupa poco spazio.
Molto usata nei lettori di musica portatili, nelle pendrive (chiavette), ecc….

Prof. P. Visconti
Bootloader

Il microcontrollore è fornito con un bootloader, che è un software che


permette il caricamento dei programmi in memoria senza l’ausilio di
programmatori esterni (occupa 2 KB di memoria flash).
Quando si resetta la scheda viene fatto girare il bootloader (se presente)
che fa lampeggiare il led collegato al pin 13.

Il bootloader si mette in ascolto di comandi o dati in arrivo dal computer


(che generalmente sono i programmi scritti dall’utente) e li carica nella
memoria flash del microcontrollore; dopodiché viene lanciato il programma
in memoria. Se non ci sono programmi in arrivo dal computer viene lanciato
l’ultimo sketch caricato. Se invece, il microcontrollore è vuoto viene lanciato
in continuazione il bootloader.

Prof. P. Visconti
sketch: programma scritto dall’utente
Bootloader

Il microcontrollore è fornito con un bootloader, che è un software che


permette il caricamento dei programmi in memoria senza l’ausilio di
programmatori esterni (occupa 2 KB di memoria flash).
Quando si resetta la scheda viene fatto girare il bootloader (se presente)
che fa lampeggiare il led collegato al pin 13.

Il bootloader si mette in ascolto di comandi o dati in arrivo dal computer


(che generalmente sono i programmi scritti dall’utente) e li carica nella
memoria flash del microcontrollore; dopodiché viene lanciato il programma
in memoria. Se non ci sono programmi in arrivo dal computer viene lanciato
l’ultimo sketch caricato. Se invece, il microcontrollore è vuoto viene lanciato
in continuazione il bootloader.

Prof. P. Visconti
sketch: programma scritto dall’utente
Comunicazione

Arduino comunica con il PC attraverso la porta USB.


Nella scheda trova posto l’integrato FTDI FT232RL che consente di avere un
collegamento seriale virtuale sopra un collegamento USB.
I driver del chip FTDI FT232RL devono essere caricati nel PC e comunque
sono forniti insieme al software per la programmazione di Arduino.

Il sito di riferimento del chip è www.ftdichip.com

sketch: programma scritto dall’utente

Prof. P. Visconti
Comunicazione
Il software per la programmazione di tutti i tipi di
schede Arduino, si chiama semplicemente Arduino
IDE.
Ne esistono diverse versioni sia per Windows (quella
testata in questo lavoro), sia per Linux sia per Mac.
L’ultima versione disponibile è la 1.85

Essa è un'applicazione multipiattaforma in Java, ed è


derivata dall'IDE creato per il linguaggio di
programmazione Processing e per il progetto Wiring.
Il linguaggio di programmazione deriva dal Java e
soprattutto dal C / C++ , ma in versione «alleggerita»,
mettendo a disposizione dell’utente funzioni più ad
elevato livello

Prof. P. Visconti
sketch: programma scritto dall’utente
Open Software

https://github.com/arduino/Arduino
Arduino IDE (integrated development
environment)

• L'ambiente di sviluppo integrato


Arduino rende semplice la
scrittura di codice e caricarlo sulla
scheda.

• Funziona su Windows, Mac OS X


e Linux.

• L'ambiente è scritto in Java e basato


su Processing, avr-gcc e altri
software open source.
Arduino IDE (integrated development
environment)

I principali comandi del software sono:


• Verify: per compilare il programma;
• Stop: per interrompere la verifica del programma;
• Save: per salvare lo sketch;
• Open: per aprire uno sketch salvato in precedenza;
• New: per creare un nuovo sketch;
• Upload: per caricare lo sketch nel microcontrollore.
Arduino IDE (integrated development
environment)

See: http://arduino.cc/en/Guide/Environment for more information


Arduino IDE (integrated development
environment)
Select Serial Port and Board selection

See: http://arduino.cc/en/Guide/Environment for more information


Arduino IDE (integrated development
environment)
Status Messages

See: http://arduino.cc/en/Guide/Environment for more information


Arduino IDE (integrated development
environment)
Status Messages

See: http://arduino.cc/en/Guide/Environment for more information


Arduino IDE (integrated development
environment)
Uno strumento utilissimo nella fase di programmazione e di debug è il Serial
Monitor che permette di inviare e di ricevere dati testuali dalle Arduino board.
Il Serial Monitor durante il suo funzionamento tiene occupati i due pin del
collegamento seriale: pin 0 (Rx) e pin 1 (Tx); per tale motivo questi due pin non
possono essere utilizzati come ingressi o uscite.
Il linguaggio di Arduino

Linguaggio C/C++
Sintassi semplificata da funzioni di supporto alla programmazione
Astrazione dei nomi dei pin, passaggio ai numeri
Facile da imparare e potente
Facilità di riutilizzo del codice C per altri progetti
Librerie scritte in C/C++
Moltissimo codice di esempio (Tutorial – Playground)
Moltissime librerie già pronte (GitHub – GoogleCode)
Parole chiave del C

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
Struttura di UNO sketch

Uno sketch si compone di due funzioni principali che non accettano


nessun parametro e non restituiscono alcun valore:
• void setup() , tutte le istruzioni contenute all’interno di questa
funzione vengono eseguite una sola volta al lancio dello sketch da
parte del microcontrollore;
• void loop() , tutte le istruzioni contenute in questa funzione sono
eseguite in continuazione.
E’ sempre possibile inserire parti di programma all’interno di altre
funzioni che vengono richiamate dal programma principale
all’occorrenza.
Struttura di UNO sketch

Un programma su Arduino == ‘sketch’ /* Blink


Deve obbligatoriamente avere: Turns on an LED on for one second, then off for one
second, repeatedly.
setup()
loop() This example code is in the public domain.
*/
int led = 13;
setup()
// the setup routine runs once when you press reset:
Configura il modo dei pin void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
loop() }

Corpo principale del programma // the loop routine runs over and over again forever:
impostato come ciclo infinito void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is
Come un while(1) {…} the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by
Dov’è la funzione main() ? making the voltage LOW
} delay(1000); // wait for a second
Struttura di UNO sketch

Di solito uno sketch utilizza delle librerie di comandi


che consentono di controllare dei particolari dispositivi.
Le librerie possono essere scritte anche dagli utenti a
proprio uso e consumo.
Le librerie vengono inserite con il comando
#include <SoftwareSerial.h>
Linguaggio di
programmazione

Il linguaggio di programmazione può essere diviso in tre parti:

• Strutture;
• Variabili e costanti;
• Funzioni.
Linguaggio di programmazione

Strutture
• setup() • while

• loop() • do... while

• if • break

• if...else • continue

• for • return

• switch case
Linguaggio di programmazione
Variabili e costanti
Le variabili permettono di assegnare un nome e memorizzare un valore numerico da
utilizzare per scopi successivi nel corso del programma.
• Variabile globale: Una variabile globale è una variabile che può essere vista e usata
da ogni istruzione e funzione del programma; nell'ambiente di sviluppo di Arduino,
ogni variabile dichiarata al di fuori di una funzione (come ad es. setup(), loop(),..) è
una variabile globale.
• Variabile locale: Le variabili locali sono visibili solo dalle funzioni entro cui sono
dichiarate o all'interno di funzioni o cicli dove vengono definite.
• Variabile static: La parola chiave Static viene utilizzata per creare una variabile che
è visibile solo da una funzione.
• Variabile volatile: essa indica al compilatore di caricare la variabile dalla memoria
RAM ( memoria temporanea dove le variabili del programma sono memorizzate e
manipolate ), e non dalla memoria register.
• Variabile const: É un qualificatore di variabile che modifica il comportamento della
variabile, rendendola una variabile di “solo lettura”.
Linguaggio di programmazione
Variabili e costanti
Le variabili permettono di assegnare un nome e memorizzare un valore numerico da
utilizzare per scopi successivi nel corso del programma.
Le variabili sono numeri che possono cambiare a differenza delle costanti che invece
non possono mai cambiare.

Ex dichiarazione di una variabile:


int inputVar=0; //inizializza la variabile di nome inputVar
inputVar=analogRead(2); // assegna alla variabile su inizializzata il valore
// letto dal pin analogico 2 variandone il contenuto
Linguaggio di programmazione
Variabili e costanti
Le stringhe di caratteri possono essere rappresentate in due modi:
• usando il tipo String, che fa parte del codice di Arduino a partire dalla versione
0019;
• costruendo una stringa con un array di caratteri e null (/n) per terminarla.
Ex. char Str3[8]={'a','r','d','u','i','n',o','/0'}; // esplicitamente viene aggiunto il
// carattere null (/0).
L'oggetto String permette più funzionalità a scapito però di maggiore occupazione di
memoria. Infatti, permette l'uso e la manipolazione di stringhe di testo in maniera
più complessa di quanto permette l'array di char. Si possono concatenare stringhe,
appendere altro testo ad esse, cercare e sostituire parti di stringhe, e molto altro.
Linguaggio di programmazione
Variabili e costanti
Le costanti sono variabili predefinite nel linguaggio per Arduino e vengono
utilizzate per rendere il programma più semplice da leggere.
Le costanti sono classificate in diversi gruppi.
• Costanti booleane: true, false;
• Costanti INPUT, OUTPUT;
• Costanti HIGH, LOW;
• Costanti a numero interi (integer)
Le funzioni di Arduino
Digital I/O Time Bits and Bytes
pinMode() millis() lowByte()
digitalWrite() micros() highByte()
digitalRead() delay() bitRead()
delayMicroseconds() bitWrite()
Analog I/O bitSet()
analogReference() Math bitClear()
analogRead() min() bit()
analogWrite() - PWM max()
abs() External Interrupts
Due only constrain() attachInterrupt()
analogReadResolution() map() detachInterrupt()
analogWriteResolution() pow()
sqrt() Interrupts
Advanced I/O interrupts()
tone() Trigonometry noInterrupts()
noTone() sin()
shiftOut() cos() Communication
shiftIn() tan() Serial
pulseIn() Stream
Random Numbers
randomSeed() USB (Leonardo and Due only)
random() Keyboard
Mouse
Le funzioni di Arduino: I/O digitali
pinMode(pin,mode);

pin numero del pin di cui si vuole impostare la modalità ingresso o uscita

mode sempre INPUT o OUTPUT

Esempio:

int ledPin=10; //led connesso al pin digitale 10

void setup( ){

pinMode(ledPin,OUTPUT); //imposta il pin digitale come uscita (output)

I pin analogici possono essere usati come pin digitali purché non riferisca con i
nomi A0, A1...A5.
Le funzioni di Arduino: I/O digitali
digitalWrite() : Scrive un valore HIGH o LOW su un pin impostato come digitale.
Se il pin è stato impostato come OUTPUT con il pinMode(), la sua tensione sarà
impostata al corrispondente valore di 5V per HIGH e 0V per LOW. Altresì, se il pin è
impostato come INPUT tramite il pinMode(), scrivendo un valore HIGH con
digitalWrite() si abiliterà un resistore interno di pullup da 20K. Scrivendo basso sarà
disabilitato il pullup. Il resistore di pullup è sufficiente per far illuminare un led
debolmente, per cui sembra che il diodo lavori anche se debolmente (questa è una
probabile causa).

digitalWrite(pin,valore);

pin è il pin di cui si vuole impostare il valore


valore HIGH o LOW
Le funzioni di Arduino: I/O digitali
digitalWrite() :

Esempio:

int ledPin=13; // led connesso al pin digitale 13


void setup( ){
pinMode(ledPin, OUTPUT); // imposta il pin digitale come output
}
void loop( )
{
digitalWrite(ledPin, HIGH); // accende il LED
delay(1000); // aspetta per 1 secondo
digitalWrite(ledPin, LOW); // spegni il LED
delay(1000); // attendi 1 secondo
}
Le funzioni di Arduino: I/O digitali
digitalRead(): Legge il valore da un pin digitale specifico

digitalRead(pin)
pin è il numero intero del pin di cui si vuole leggere il valore alto o basso.
Esempio;
int ledPin = 13; // LED connesso al pin digitale13
int inPin = 7; // pulsante connesso al pin digitale7
int val = 0; // variabile che memorizza il valore letto
void setup( ) {
pinMode(ledPin, OUTPUT); // imposta il pin digitale 13 come uscita
pinMode(inPin, INPUT); // imposta il pin digitale 7 come ingresso
}
void loop( ){
val = digitalRead(inPin); // legge il pin di ingresso e lo memorizza in val
digitalWrite(ledPin, val); // imposta il LED a seconda dell'azione svolta
// sul pulsante
}
MAIN.cpp

#include <Arduino.h> • Semplificazioni dell’IDE


int main(void) {
init(); nasconde:
• Main.cpp
#if defined(USBCON)
USBDevice.attach(); • Prototipi delle funzioni
#endif
• Gestione degli #include
setup();
for (;;) {
loop();
if (serialEventRun)
serialEventRun();
}
return 0;
}
Impostare la direzione di un pin

Con Arduino IDE


pinMode(pin_no., dir)

Es. impostare il pin 3 di Arduino (PD3) come uscita


pinMode(3, OUTPUT);

Nota: un pin alla volta

Supponiamo di voler impostare i pin 3, 5 e 7 (PD3, PD5 e PD7) come


uscite.
Come possiamo fare?
Esempio 1

 Impostare i pin 3, 5 e 7 (PD3, PD5 e PD7) come uscite

Arduino IDE Registri


DDRD = 0b10101000;

pinMode(3, OUTPUT); or
pinMode(5, OUTPUT);
pinMode(7, OUTPUT); DDRD = 0xA8;

or

DDRD | = 1<<PD7 | 1<<PD5 | 1<<PD3;


PINMODE()
void pinMode (uint8_t pin, uint8_t mode) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *reg, *out;
if (port == NOT_A_PIN) return;
/ / JWS: can I let the optimizer do this? reg
= portModeRegister(port);
out = portOutputRegister(port); if
(mode == INPUT){
uint8_t oldSREG= SREG;
cli();
*reg &= ~bit;
*out &= ~bit;
SREG= oldSREG;
} else if (mode== INPUT_PULLUP) {
uint8_t oldSREG= SREG;
cli();
*reg &= ~bit;
*out |= bit;
SREG= oldSREG;
} else {
uint8_t oldSREG= SREG;
cli();
*reg |= bit;
SREG= oldSREG;
}
}
Uso di un pin per accendere un LED

Accendiamo un LED connesso al pin 7 di


Arduino (PD7) (occhio alla resistenza!) ATmega328

Come si deve impostare la direzione del pin Arduino


7 (PD7)? pin 7
(PD7)
pinMode( , );

Accendiamo il LED
digitalWrite(7, HIGH);

Spegniamo il LED
digitalWrite(7, LOW);
Esempio 2

 Impostare i pin 0 e 1(PD0 e PD1) come uscite con un livello del segnale
ALTO

• Arduino • Registri
DDRD = b00000011;
pinMode(0, OUTPUT);
PORTD = b00000011;
pinMode(1, OUTPUT);
digitalWrite(0, HIGH);
o
digitalWrite(1, HIGH);
DDRD = 0x03;
PORTD = 0x03;

oppure

DDRD | = 1<<PD1 | 1<<PD0;


PORTD | = 1<<PD1 | 1<<PD0;
Digitalwrite()
void digitalWrite (uint8_t pin, uint8_t val){
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port =digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN)return;
/ / If the pin that support PWM output, we need to turn it off
/ / before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG= SREG;
cli();
if (val == LOW) {
*out &= ~bit;
} else {
*out |= bit;
}
SREG= oldSREG;
}
PIN, sensori e resistenze di pull-up - 1

Usiamo un pulsante come sensore


Vogliamo leggere lo stato del pulsante ATmega328
Qual è la direzione da attribuire al pin 3
di Arduino (PD3)? Arduino
pinMode( , ); pin 3
(PD3)

Qual è la tensione sul pin PD3 quanto il


contatto è chiuso?

Qual è la tensione sul pin PD3 quanto il


contatto è aperto?
Indeterminata!
PIN, sensori e resistenze di pull-up - 2

Forniamo una tensione sul pin PD3 per


determinare lo stato attivando la resistenza di ATmega328
pull-up
VTG= +5V
Impostiamo PD3 come input-pullup:
pinMode(3, INPUT);
1
digitalWrite(3 ,HIGH); PD3
oppure 0

pinMode(3, INPUT_PULLUP);

Che tensione leggero sul pin PD3


quanto il pulsante è aperto?
VTG
Che tensione leggero sul pin PD3
quanto il pulsante è chiuso?
GND
PIN, sensori e resistenze di pull-up - 3

Spegniamo la resistenza di pull-up


Dopo aver impostato PD3 come input: ATmega328
pinMode(3, INPUT); VTG= +5V
…….
digitalWrite(3, LOW); 1
PD3
0
PIN, sensori e resistenze di pull-up - 4

‘Weak Drive’
Settando il pin come input e attivando la ATmega328
resistenza di pull-up interna la corrente in
VTG= +5V
uscita dal pin è debole.
iweak
1
Il valore tipico delle resistenze di pull-up per PD3
l’ATmega328 è tra i 20 e 50 kΩ 0
Esempio 3

 Impostare i pin 0 e 1(PD0 e PD1) come ingresso attivando la resistenza


di pull-up

Arduino Registri
pinMode(0, INPUT); DDRD = 0; // all PORTD pins inputs
pinMode(1, INPUT); PORTD = b00000011;
digitalWrite(0, HIGH); o
digitalWrite(1, HIGH); PORTD = 0x03;

oppure
oppure
pinMode(0, INPUT_PULLUP); DDRD & = ~(1<<PD1 | 1<<PD0);
pinMode(1, INPUT_PULLUP); PORTD | = (1<<PD1 | 1<<PD0);
Risorse

www.arduino.cc
www.atmel.com/avr
en.wikipedia.org/wiki/Arduino
camillomiller.com/arduino/leggi-online.html

forum.arduino.cc
forum.arduino.cc

Potrebbero piacerti anche