Chi siamo:

Emilio Destratis

Altri contatti:

...o fate un salto in sede!

Campus Leonardo, Edificio 9A

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
    1. Con un piccolo ritardo
    2. 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:
    1. currState, che conterrà ad ogni loop il valore di lettura del bottone;
    2. prevState, che conterrà il valore di lettura del loop precedente del bottone
    3. 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