Indice
L’analogico del digitale
Affrontiamo in questo articolo il PWM (Pulse Width Modulation), che ci permette di modulare il segnale digitale e ci da la possibilità di utilizzarlo come se fosse un segnale analogico.
Impariamo il PWM
Il PWM è un tipo di modulazione di impulsi, che grazie all’azione del timer interno della scheda, ci permette di modificare il duty cycle del nostro segnale in uscita.
Il duty cycle è la percentuale del tempo che il segnale rimane ad un valore alto in un periodo.
Nonostante questo segnale generi un’onda quadra con un valore alto (5 volt) e uno basso (0 volt), esso può essere impiegato per simulare un segnale analogico in uscita.
Questo tipo di modulazione è previsto poiché sulla scheda Arduino i pin analogici funzionano solo in ingresso e non ci danno la possibilità di essere usati come output.
Il PWM ha proprio lo scopo di sopperire a questa mancanza. Inoltre, il PWM è utilizzabile solo per un segnale in uscita e non può essere usato per un segnale in ingresso.
Infatti se provassimo a leggere il segnale in ingresso non riceveremmo il valore del duty cycle, ma solo il valore che ha quel pin in quel determinato istante.
Mettiamoci alla prova !
I pin del PWM sono riconoscibili direttamente sulla scheda. Generalmente, di fianco al numero del pin sulla scheda c’è anche un simbolo (tilde ~).
Inoltre per controllare meglio le funzionalità supportate dai vari pin si consiglia di cercare su google i relativi
pinout della propria scheda.
Di seguito vi presento un esempio di pinout della scheda Arduino Uno.
Per pilotare il pin PWM è necessaria la funzione analogWrite, che come abbiamo già detto, il segnale in uscita non è propriamente analogico ma finge di esserlo.
Facciamo una consueta prova e prendiamo:
- Una scheda Arduino Uno;
- Una breadboard;
- Un led;
- Una resistenza 220 ohm;
- Cavetteria necessaria per il collegamento.
Una volta reperito il materiale, seguendo il seguente schema, costruiamo la base del nostro progetto.
Ora carichiamo il programma sulla scheda.
#define PWM_PIN 9 int value = 0; void setup() { Serial.begin(9600); pinMode(PWM_PIN, OUTPUT); } void loop() { /* analogWrite, come secondo parametro accetta valori da 0 a * 255. */ analogWrite(PWM_PIN, value); value++; /* alternativamente, nella versione più compatta possiamo * scrivere: * value = (value + 1) > 255 ? 0 : value + 1; */ if (value > 255){ value = 0; } delay(50); }
Una volta testato il seguente codice possiamo notare che con l’aumentare del valore inserito nella analogWrite, aumenta anche il livello di intensità del led. Viceversa diminuendo questo valore diminuisce anche l’intensità del led. Un’altra cosa che dobbiamo tenere in considerazione è che i valori per il PWM sono 256, da 0 per un duty cycle del 0% fino a 255 per un duty cycle del 100%.
Usi e Costumi del PWM
Il PWM non è usato solo per regolare l’intensità di led! Ha una più vasta gamma di applicazioni che possono tornare utili dalla domotica fino alla robotica e anche oltre. La modulazione del segnale di questo tipo può essere usato per regolare la velocità di un motore, ad esempio per far andare più o meno veloce un macchinina. È inoltre usato nei servomotori, che per esempio sono impiegati nella robotica. In generale questo tipo di modulazione è ampiamente utilizzato nel mondo delle automazioni per pilotare diversi tipi di attuatori.
Ciao,
nello schema il 3 del led è stato inserito nel PIN 11, mentre nel programma il valore PWM_PIN è messo a 9. E’ una svista o mi sta sfuggendo qualcosa?
Ciao Terenzio, la nostra era una introduzione al problema. C’è una libreria di Arduino infine da usare e poi funziona il tutto con soluzioni elettroniche standard e comprovate e senza rimbalzi
Ciao ho notato che a analogWrite(PWM_PIN, value) e value = 0 ,mancano i ;
Grazie mille per la segnalazione!! Provvederemo subito alla correzione