Chi siamo:
Emilio Destratis
Altri contatti:
...o fate un salto in sede!
Calendario
- 6 Giugno: Menù e degustazione tipica...
- 13 Giugno: A tavola!
Links
Queste slides le trovate su slides.poul.org
...prima di iniziare
Se non avete già installato il programma che useremo oggi, scaricatelo ora da qui: https://www.arduino.cc/en/Main/Software# così non avremo da attendere quando ci sarà da giocare: questa sarà la versione di riferimento comune, che voi preferiate gli gnu/pinguini, le mele o le finestre...
Lo installeremo dopo, l'importante ora è scaricarlo!
A proposito di Arduino
Cos'è?
Arduino è una scheda elettronica con microcontrollore ATmega sviluppata in Italia, a Ivrea.
...qual è il suo scopo nella vita?
Cambiare il mondo. Sul serio.
...cioè? ...come?!
Iniziando oggi con qualcosa come questo:
...per arrivare a qualcosa del genere...
...e ovviamente un'infinità di possibili altre potenziali applicazioni!
Con chi avremo a che fare oggi:
Caratteristiche: | Uno | Leonardo |
---|---|---|
Microcontrollore | ATmega328P | Atmega32u4 |
Mem. Flash (KB) | 32 | 32 |
Mem. EEPROM (KB) | 1 | 1 |
Mem. SRAM (KB) | 2 | 2,5 |
Pin I/O digitali | 14 | 20 |
...di cui con PWM | 6 | 7 |
Pin input analog. | 6 | 12 |
Ingredienti:
- Arduino
- Cavo di collegamento USB da scheda a pc
- Breadboard
- Led
- Bottone
- Fili di rame
- Resistenze
- IDE (Software)
- Un pizzico d'attenzione
Regole del gioco
Pillole di elettrotecnica
-
Immaginiamo di avere un circuito chiuso d’acqua: l’acqua rappresenta gli elettroni.
-
La velocità del flusso d’acqua rappresenta la corrente (simbolo I)
-
La differenza di pressione tra due punti rappresenta la tensione (o differenza di potenziale) tra due punti (simbolo V)
-
Una larghezza del tubo inferiore al normale rappresenta una resistenza
(simbolo R)
V = IR I = V/R
- A parità di differenza di potenziale (caso in cui ci si trova di solito):
- Se aumento la resistenza, diminuirà la corrente
- Se diminuisco la resistenza, aumenterà la corrente
- Casi limite:
- Se la resistenza è infinita (circuito aperto) non passa corrente
- Se la resistenza è 0 (corto circuito) passa “infinita” corrente
Legge di Ohm
Breadboard
-
Consente di connettere vari componenti tra di loro ed alla scheda
-
Non richiede saldature
-
La corrente scorre:
-
per numeri, al centro, interrompendosi a metà (scanalatura)
-
lungo le linee indicate, ai bordi
-
LED
-
Il LED si accende quando l’anodo si trova almeno a ~2.0 V in più
rispetto al catodo -
In soldoni, il - sarà collegato a GND e il + sarà collegato in serie ad una resistenza, che poi andrà al pin scelto come controllO
-
Quasi tutte le schede Arduino hanno un LED integrato sulla scheda
MAI COLLEGARE COMPONENTI IN SENSO OPPOSTO
Dove specificato, il - va a massa, il + all'alimentazione...
...questo non è possibile...
Calcolo della resistenza
per il LED
-
Controllare sul datasheet la forward current del vostro LED
-
Rilevare la tensione ai capi del LED (o serie), sottraendo la tensione di accensione del LED
-
Legge di Ohm: R = V/I
-
...Oppure usate questa pratica tabellina per i voltaggi più comuni, che assume un voltaggio di accensione di 2 V e una forward current di 20mA (valori dei LED rossi standard da 5 o 3 mm)
Vcc (V) | 3.3 | 5 | 9 | 12 |
---|---|---|---|---|
R (Ω) | 68 | 150 | 390 | 560 |
Per calcolare il valore di una resistenza partendo dai suoi colori
- Far riferimento alla tabella qui sotto
- Inserire i colori qui
"Melius abundare quam deficere"
Fili di rame
-
Servono per connettere componenti tra di loro, sulla breadboard, con i pin di Arduino
-
Si comprano pronti all'uso come in foto
-
DIY con cavo rigido e paio di pinze
-
NON si rubano dalle ferrovie!
-
A e C sono sempre connessi, B e D sono sempre connessi.
-
Quando si schiaccia il bottone sono tutti connessi
Bottone
Resistenze pull-up e pull-down
-
Serve a dare sempre un valore definito all’uscita collegata al bottone
-
Se lo switch è aperto:
-
Nella resistenza non passa corrente (il circuito è aperto)
-
La differenza di potenziale ai due capi della resistenza è 0
- L’uscita è a 5 Volts
-
-
Se lo switch è chiuso:
-
è in corto con GND
-
L'uscita sarà a 0 Volts
-
Esempio di collegamento del bottone
Giochiamo!
Demo:
- Montiamo il nostro semplice circuito
- Passiamo alla parte software
...quindi è arrivato il momento di conoscere l'IDE di Arduino!
Per vedere come funziona...accendiamo una luce!
#define LED 13
void setup(){
pinMode(LED, OUTPUT);
}
void loop(){
digitalWrite(LED, HIGH);
}
Hello World Arduino!
//Hello World Arduino!
#define LED 13
/*La funzione setup viene eseguita una sola volta,
all'avvio della scheda, o quando viene premuto il tasto reset*/
void setup() { // inizializza il pin associato a LED in modalità OUTPUT
pinMode(LED, OUTPUT);
}
//La funzione loop viene eseguita ripetutamente in continuazione
void loop() {
digitalWrite(LED, HIGH); // accende il led, assegnando valore HIGH al pin relativo
delay(1000); // sospende l'esecuzione di loop per 1 secondo
digitalWrite(LED, LOW); // spegne il led, assegnando valore LOW al pin relativo
delay(1000);
}
Fade: LED in dissolvenza
Non a caso avevamo accennato la presenza di pin con PWM
La modulazione di larghezza di impulso (o PWM, pulse-width modulation), è un tipo di modulazione digitale che permette di ottenere una tensione media variabile dipendente dal rapporto tra la durata dell'impulso positivo e di quello negativo (duty-cycle).
Sulla scheda i pin PWM sono indicati con una ~
Per realizzare una dissolvenza, non potendo avere pin analogici in OUTPUT, andremo a "simulare" l'analogico con il digitale.
Il comando analogWrite(pin, valore) suddivide il segnale in 256 scalini digitali, in modo tale da poter controllare un PWM con interi compresi fra 0 e 255.
...non sempre è necessario reinventare la ruota!
A volte potremmo trovarci a dover leggere codice scritto da altri: molti sketch sono già pronti e disponibili nell'IDE (File → Esempi) o su internet ...facciamone buon uso!
Ad esempio, per questo esempio andremo ad analizzare (e in caso modificare) lo sketch "Fade" già presente nell'IDE.
Ora aggiungiamo il bottone al nostro circuito...
...come spiegato precedentemente...
Facciamo un passo avanti
LED comandato con bottone
#define LED 13
#define BUTTON 2
int ledStatus=LOW;
void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop() {
if (digitalRead(BUTTON))
{
if (ledStatus==LOW)
{
ledStatus=HIGH;
digitalWrite(LED, ledStatus);
} else {
ledStatus=LOW;
digitalWrite(LED, ledStatus);
}
}
}
...qualcosa non va?
Quando il bottone viene premuto, in realtà gli switch meccanici fanno un po’ di falsi contatti prima di stabilizzarsi.
Tutta colpa del bouncing!
Come risolvere?
3 soluzioni possibili:
- Software
- Con un piccolo ritardo
- Con un contatore
- Hardware
Software: ritardo
-
Quando rileviamo lo stato che vogliamo, inseriamo un delay successivo per evitare i contatti dopo (5ms dovrebbero bastare)
-
Lo svantaggio è che si “perdono” 5ms ogni volta che si schiaccia il bottone
Spiegazione
-
Abbiamo 3 variabili:
- currState, che conterrà ad ogni loop il valore di lettura del bottone;
- prevState, che conterrà il valore di lettura del loop precedente del bottone
-
ledState, che conterrà lo stato del LED
...
currState = digitalRead(buttonPin);
if (currState != prevState){
delay(5);
if (currState == LOW){
ledState = !ledState;
digitalWrite(ledPin, ledState);
}
prevState = currState;
...
Se lo stato del bottone è cambiato rispetto al loop precedente (!=significa “not”), vuol dire che è stato o premuto o rilasciato.
Aspettiamo 5 millisecondi per evitare il rumore del bouncing.
Se lo stato attuale è LOW vuol dire che il bottone è stato schiacciato,
quindi invertiamo lo stato del LED.
Software: contatore
Ad ogni giro:
- Se il bottone è nello stato "attivo"
- incrementiamo il contatore
- Se è nello stato "a riposo"
- azzeriamo il contatore
Impostiamo una soglia ad un contatore
oltre cui il bottone è considerato premuto.
Spiegazione
Quando il contatore arriva ad una soglia (in questo caso 50),
sappiamo che il bottone è stato almeno quel numero di loop premuto
senza rumore, quindi dichiariamo che il suo stato è effettivamente
“premuto” (LOW, per coerenza con gli esempi precedenti).
A questo punto, entreremo nell’if (solo il primo giro che il bottone è
stato dichiarato premuto) e invertiremo lo stato del LED.
...
if (digitalRead(buttonPin) == LOW){
counter++;
} else {
counter = 0;
}
if (counter > 50){
currState = LOW;
} else {
currState = HIGH;
}
if (currState == LOW && prevState == HIGH){
ledState = !ledState;
digitalWrite(ledPin, ledState);
}
prevState = currState;
...
Dobbiamo avere 3 variabili
come prima, più una variabile
counter di tipo unsigned int.
Se il bottone è premuto,
incrementiamo il contatore,
se rileviamo che è rilasciato
(perché effettivamente rilasciato
o per rumore di bouncing),
riportiamo il contatore a 0.
Hardware: filtro passa-basso
Il filtro passa-basso permette il solo passaggio di frequenze al di sotto di una data soglia detta frequenza di taglio.
Domande?
Queste slides sono distribuite con licenza
Creative Commons Attribution-ShareAlike 3.0 Unported
Alla prossima!
Fonti: slides del corso dello scorso anno di Riccardo Binetti (rbino), Wikipedia, Forum Ufficiale Arduino, l'Internet
https://www.poul.org
Corso Arduino 2016 - 1° lezione 06.06.2016
By destone28
Corso Arduino 2016 - 1° lezione 06.06.2016
- 707