ELECTRONICS LAB [WITH ARDUINO] >>> DAY #2 Daniele Costarella Salvatore Carotenuto Teatro Carlo Gesualdo / Casina Del Principe Avellino
Rights to copy 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/. 2
Il programma di oggi La tecnica PWM: controllo di LED; controllo di piccoli carichi; Effetti luminosi: LED fading; i LED RGB; sequence generators; 3
La tecnica PWM Rimontiamo il seguente circuito: 4
5 La tecnica PWM Cosa succede se facciamo lampeggiare molto velocemente il LED? // Modulazione di larghezza di impulso (PWM) #define LED 13 void setup() pinmode(led, OUTPUT); // LED sul pin 13 // 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
La tecnica PWM Il duty cycle Ampiezza Periodo TON TOFF Tempo 6
La tecnica PWM Il duty cycle Duty Cycle 50% Duty Cycle 75% Duty Cycle 25% 7
La tecnica PWM Facciamo alcuni esperimenti 1. 10ms acceso e 10ms spento 2. 5 ms acceso e 15ms spento 3. 75 ms acceso e 5ms spento 8
9 La tecnica PWM I pin PWM dedicati il PWM è una tecnica per ottenere risultati analogici con mezzi digitali Funzione analogwrite(pin, valore) Spiegazione 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)
La tecnica PWM Il duty cycle Duty Cycle 50% - analogwrite(pin, 128) Duty Cycle 75% - analogwrite(pin, 192) Duty Cycle 25% - analogwrite(pin, 64) 10
La tecnica PWM Il nuovo circuito: utilizziamo i pin PWM dedicati 11
12 La tecnica PWM Cosa succede se facciamo lampeggiare molto velocemente il LED? // Modulazione di larghezza di impulso (PWM) #define LED 9 void setup() pinmode(led, OUTPUT); void loop() analogwrite(led, 128); // LED sul pin 9 (PWM) // imposta il pin come output // duty cycle al 50%
La tecnica PWM 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%; 13
La tecnica PWM Solo per i LED? 14
La tecnica PWM Esempio: controlliamo un motore 15
La tecnica PWM 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). 16
La tecnica PWM 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. 17
18 La tecnica PWM Esempio 1: rampa // Modulazione di larghezza di impulso (PWM) #define MOTOR 3 // controllo motore sul pin 3 void setup() pinmode(motor, OUTPUT); void loop() analogwrite(motor, delay(1000); analogwrite(motor, delay(1000); analogwrite(motor, delay(1000); analogwrite(motor, delay(1000); 64); // imposta il pin come output // // 128); // // 192); // // 255); // // motore al aspetta 1 motore al aspetta 1 motore al aspetta 1 motore al aspetta 1 25% secondo 50% secondo 75% secondo 100% secondo
La tecnica PWM 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); 19
20 Elementi di programmazione Il ciclo for Simbolo for (valore_iniziale, test, incremento) // < codice da ripetere > // for (i = 0; i<100; i++) // < codice da ripetere > // Spiegazione Esegue un blocco di codice per un certo numero di volte, ossia finchè la condizione test è vera. Esempio: esegue un blocco di codice per 100 volte
21 Giochi di luce LED fading #define LED 9 int fadevalue = 0; void setup() pinmode(led, OUTPUT); // LED collegato al pin 9 // valore del fade // 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 LED fading #define LED 9 int fadevalue = 0; void setup() pinmode(led, OUTPUT); // LED collegato al pin 9 // valore del fade // 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);
Giochi di luce LED RGB 23
Giochi di luce LED RGB: montiamo il circuito 24
Giochi di luce 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); 25
Giochi di luce LED RGB: lo sketch // continua void setcolor(int red, int green, int blue) analogwrite(redpin, red); analogwrite(greenpin, green); analogwrite(bluepin, blue); 26
Giochi di luce LED RGB: cose da fare Variare il ritardo Altri effetti di luce (YouTube, Google) 27
Giochi di luce LED chaser 28
Giochi di luce LED chaser: lo sketch int int int int int LED1 LED2 LED3 LED4 LED5 = = = = = 12; 11; 10; 9; 8; void setup() pinmode(led1, pinmode(led2, pinmode(led3, pinmode(led4, pinmode(led5, OUTPUT); OUTPUT); OUTPUT); OUTPUT); OUTPUT); 29
Giochi di luce 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); 30
Giochi di luce LED chaser: cose da fare Variare il ritardo Pilotare più LED Largo alla fantasia! 31
Giochi di luce Pilotare più LED: meglio usare uno Shift Register 32
Giochi di luce 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 33
Giochi di luce 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); 34
Giochi di luce 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); 35
FINE... PER OGGI