...o fate un salto in sede!
Queste slides le trovate su slides.poul.org
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...
Arduino è una scheda elettronica con microcontrollore ATmega sviluppata in Italia, a Ivrea.
Cambiare il mondo. Sul serio.
Iniziando oggi con qualcosa come questo:
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 |
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)
(simbolo R)
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
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
Dove specificato, il - va a massa, il + all'alimentazione...
...questo non è possibile...
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
...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 |
"Melius abundare quam deficere"
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
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
Se lo switch è chiuso:
è in corto con GND
L'uscita sarà a 0 Volts
...quindi è arrivato il momento di conoscere l'IDE di Arduino!
#define LED 13
void setup(){
pinMode(LED, OUTPUT);
}
void loop(){
digitalWrite(LED, HIGH);
}
//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);
}
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.
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.
...come spiegato precedentemente...
#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);
}
}
}
Quando il bottone viene premuto, in realtà gli switch meccanici fanno un po’ di falsi contatti prima di stabilizzarsi.
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
Abbiamo 3 variabili:
...
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.
Ad ogni giro:
Impostiamo una soglia ad un contatore
oltre cui il bottone è considerato premuto.
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.
Il filtro passa-basso permette il solo passaggio di frequenze al di sotto di una data soglia detta frequenza di taglio.
Queste slides sono distribuite con licenza
Creative Commons Attribution-ShareAlike 3.0 Unported
Fonti: slides del corso dello scorso anno di Riccardo Binetti (rbino), Wikipedia, Forum Ufficiale Arduino, l'Internet
https://www.poul.org