1. ELECTRONICS LAB [WITH ARDUINO]
Daniele Costarella
Teatro Carlo Gesualdo / Casina Del Principe – Avellino – 28 > 31 agosto 2013
Salvatore Carotenuto
>>> DAY #2
2. Rights to copy
Electronics LAB [with Arduino]28 > 31 agosto 2013 2
Attribution – ShareAlike 3.0 Unported
You are free:
● to Share - to copy, distribute and transmit the work
● to Remix – to adapt the work
Under the following conditions:
Attribution – You must attribute the work in the manner
specified by the authors.
Share Alike – If you alter, transform, or build upon this
work, you may distribute the resulting work only under the
same or similar license to this one.
Your fair use and other rights are in no way affected by the above.
To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/.
3. Il programma di oggi
La tecnica PWM:
●
controllo di LED;
●
controllo di piccoli carichi;
Effetti luminosi:
●
LED fading;
●
i LED RGB;
●
sequence generators;
3Electronics LAB [with Arduino]28 > 31 agosto 2013
4. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 4
Rimontiamo il seguente circuito:
5. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 5
Cosa succede se facciamo lampeggiare molto velocemente il LED?
// Modulazione di larghezza di impulso (PWM)
#define LED 13 // LED sul pin 13
void setup()
{
pinMode(LED, OUTPUT); // imposta il pin come output
}
void loop()
{
digitalWrite(LED, HIGH); // accende il LED
delay(10); // aspetta 10 millisecondi
digitalWrite(LED, LOW); // spegne il LED
delay(10); // aspetta 10 millisecondi
}
6. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 6
Il duty cycle
Periodo
TON
TOFF
Tempo
Ampiezza
7. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 7
Il duty cycle
Duty Cycle 50%
Duty Cycle 75%
Duty Cycle 25%
8. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 8
Facciamo alcuni esperimenti
1. 10ms acceso e 10ms spento
2. 5 ms acceso e 15ms spento
3. 75 ms acceso e 5ms spento
9. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 9
I pin PWM dedicati
il PWM è una tecnica per ottenere risultati analogici con mezzi digitali
Funzione Spiegazione
analogWrite(pin, valore)
Scrive un valore analogico (una forma
d'onda PWM) sul pin passato come
parametro.
Parametri:
pin: il pin da usare
valore: compreso tra 0 (sempre
spento) e 255 (sempre acceso)
11. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 11
Il nuovo circuito: utilizziamo i pin PWM dedicati
12. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 12
Cosa succede se facciamo lampeggiare molto velocemente il LED?
// Modulazione di larghezza di impulso (PWM)
#define LED 9 // LED sul pin 9 (PWM)
void setup()
{
pinMode(LED, OUTPUT); // imposta il pin come output
}
void loop()
{
analogWrite(LED, 128); // duty cycle al 50%
}
13. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 13
Facciamo alcuni esperimenti, ora però con i pin dedicati
1. LED acceso allo 0%;
2. LED acceso al 25%;
3. LED acceso al 50%;
4. LED acceso al 75%;
5. LED acceso al 100%;
14. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 14
Solo per i LED?
15. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 15
Esempio: controlliamo un motore
16. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 16
Transistor
● Il motore DC utilizza più potenza di
quella che Arduino è in grado di
erogare.
● Se connettiamo il motore
direttamente ai pin di Arduino,
rischiamo di danneggiare la scheda.
● Utilizziamo, allora, un piccolo
transistor (Es. PN2222) come switch
che, utilizzando una piccola corrente
da Arduino è in grado di pilotare
correnti più elevate (motore).
17. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 17
Transistor
● Il transistor ha tre terminali. La
maggior parte della corrente fluisce
dal Collettore all'Emettitore. Ciò
avviene se “accendiamo” il transistor,
ossia se facciamo fluire una corrente
nella Base.
● Il resistore connesso a D3 limita la
corrente di Base. Se connettiamo il
motore direttamente ai pin di Arduino,
rischiamo di danneggiare la scheda.
● Il diodo è inserito per la protezione del
circuito.
18. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 18
Esempio 1: rampa
// Modulazione di larghezza di impulso (PWM)
#define MOTOR 3 // controllo motore sul pin 3
void setup()
{
pinMode(MOTOR, OUTPUT); // imposta il pin come output
}
void loop()
{
analogWrite(MOTOR, 64); // motore al 25%
delay(1000); // aspetta 1 secondo
analogWrite(MOTOR, 128); // motore al 50%
delay(1000); // aspetta 1 secondo
analogWrite(MOTOR, 192); // motore al 75%
delay(1000); // aspetta 1 secondo
analogWrite(MOTOR, 255); // motore al 100%
delay(1000); // aspetta 1 secondo
}
19. La tecnica PWM
28 > 31 agosto 2013 Electronics LAB [with Arduino] 19
Esempio 2: variamo la velocità manualmente
// Esempio 2: DC Motor
int motorPin = 3;
void setup()
{
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
while (! Serial);
Serial.println("Velocità [da 0 a 255]: ");
}
void loop()
{
if (Serial.available())
{
int speed = Serial.parseInt();
if (speed >= 0 && speed <= 255)
{
analogWrite(motorPin, speed);
}
}
}
20. Elementi di programmazione
28 > 31 agosto 2013 Electronics LAB [with Arduino] 20
Il ciclo for
Simbolo Spiegazione
for (valore_iniziale, test,
incremento)
{
// …
< codice da ripetere >
// …
}
Esegue un blocco di codice per un
certo numero di volte, ossia finchè la
condizione test è vera.
for (i = 0; i<100; i++)
{
// …
< codice da ripetere >
// …
}
Esempio: esegue un blocco di codice
per 100 volte
21. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 21
LED fading
#define LED 9 // LED collegato al pin 9
int fadeValue = 0; // valore del fade
void setup()
{
pinMode(LED, OUTPUT); // imposta il pin come output
}
void loop()
{
// esegue un ciclo da 0 a 254 (fade in)
for (fadeValue = 0 ; fadeValue < 255; fadeValue++)
{
//impostiamo la luminosità del LED
analogWrite(LED, fadeValue);
delay(10);
}
//
// esegue un ciclo da 255 a 1 (fade out)
for(fadeValue = 255 ; fadeValue > 0; fadeValue--)
{
//impostiamo la luminosità del LED
analogWrite(LED, fadeValue);
delay(10);
}
}
22. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 22
LED fading
#define LED 9 // LED collegato al pin 9
int fadeValue = 0; // valore del fade
void setup()
{
pinMode(LED, OUTPUT); // imposta il pin come output
}
void loop()
{
// esegue un ciclo da 0 a 254 (fade in)
for (fadeValue = 0 ; fadeValue < 255; fadeValue++)
{
//impostiamo la luminosità del LED
analogWrite(LED, fadeValue);
delay(10);
}
//
// esegue un ciclo da 255 a 1 (fade out)
for(fadeValue = 255 ; fadeValue > 0; fadeValue--)
{
//impostiamo la luminosità del LED
analogWrite(LED, fadeValue);
delay(10);
}
}
23. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 23
LED RGB
24. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 24
LED RGB: montiamo il circuito
25. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 25
LED RGB: lo sketch
//Flussi 2013 DAY 2: RGB LED
int redPin = 11;
int greenPin = 10;
int bluePin = 9;
void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop()
{
setColor(255, 0, 0); // red
delay(1000);
setColor(0, 255, 0); // green
delay(1000);
setColor(0, 0, 255); // blue
delay(1000);
setColor(255, 255, 0); // yellow
delay(1000);
setColor(80, 0, 80); // purple
delay(1000);
setColor(0, 255, 255); // aqua
delay(1000);
}
26. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 26
LED RGB: lo sketch
// continua
void setColor(int red, int green, int blue)
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
27. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 27
LED RGB: cose da fare
● Variare il ritardo
● Altri effetti di luce (YouTube, Google)
28. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 28
LED chaser
29. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 29
LED chaser: lo sketch
int LED1 = 12;
int LED2 = 11;
int LED3 = 10;
int LED4 = 9;
int LED5 = 8;
void setup()
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
}
30. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 30
LED chaser: lo sketch
void loop()
{
digitalWrite(LED1,HIGH);
delay(100);
digitalWrite(LED1,LOW);
delay(25);
digitalWrite(LED2,HIGH);
delay(100);
digitalWrite(LED2,LOW);
delay(25);
digitalWrite(LED3,HIGH);
delay(100);
digitalWrite(LED3,LOW);
delay(25);
digitalWrite(LED4,HIGH);
delay(100);
digitalWrite(LED4,LOW);
delay(25);
digitalWrite(LED5, HIGH);
delay(100);
digitalWrite(LED5, LOW);
delay(25);
}
31. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 31
LED chaser: cose da fare
● Variare il ritardo
● Pilotare più LED
● Largo alla fantasia!
32. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 32
Pilotare più LED: meglio usare uno Shift Register
33. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 33
Pilotare più LED: lo Shift Register 74HC595
●
Si può pensare allo Shift Register
come un oggetto in grado di
conservare 8 bit in memoria
●
Per scrivere tali valori utilizziamo i
pin Data e Clock del chip
34. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 34
Pilotare più LED: meglio usare uno Shift Register
/*
Flussi 2013 DAY 2: 8 LED e uno Shift Register
*/
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
byte leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
35. Giochi di luce
28 > 31 agosto 2013 Electronics LAB [with Arduino] 35
Pilotare più LED: meglio usare uno Shift Register
void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}