Perchè possiamo collegare il buzzer a un pin non PWM?

Nell’articolo di oggi risponderemo alla domanda della nostra cara lettrice Alessia. La domanda è la seguente: se il buzzer si basa sulla modulazione PWM allora perché nell’atto pratico lo possiamo collegare a qualsiasi pin della scheda Arduino?

Il principio di funzionamento del cicalino passivo si fonda sull’utilizzo della modulazione PWM le cui onde permettono la vibrazione dell’aria sulla membrana interna del cicalino generando così un suono. Impostando la frequenza delle onde correttamente, si possono generare suoni differenti.

Nell’atto pratico però possiamo collegare il buzzer a qualsiasi pin della scheda Arduino, come è possibile collegarlo a qualsiasi pin nonostante il principio di funzionamento del buzzer si fonda sulla modulazione PWM?

La risposta risiede nel modo in cui è realizzata la funzione Tone().

In sintesi tone() può funzionare su qualsiasi pin I/O.

Genera un’onda quadra alla frequenza specificata ( e duty cycle al 50% ) su un pin. Una durata può essere specificata, altrimenti l’onda continua fino alla chiamata di noTone(). Il pin può essere connesso ad un buzzer piezoelettrico o altro speaker per riprodurre toni.

Solo un tono alla volta può essere generato. Se un tono è già in riproduzione su un pin differente, la chiamata a tone() non avrà alcun effetto. Se il tono è in riproduzione sullo stesso pin, la chiamata ne imposterà la frequenza.

L’uso della funzione tone() interferirà con l’output PWM sui pin 3 e 11 ( sulle schede diverse dalla Mega ).

Non è possibile generare toni inferiori a 31Hz. Per i dettagli tecnici, vedi le note di Brett Hagman.

La gamma di frequenze che è possibile produrre dipende dalla frequenza di clock del microcontrollore e dal timer utilizzato:
MCU clock 8 bit timer Flow 16 bit timer Flow Fhigh
8 MHz 16 Hz 1 Hz (1/16 Hz) 4 MHz
16 MHz 31 Hz 1 Hz (1/8 Hz) 8 MHz

PWM

L’utilizzo della funzione tone è legato ad un timer specifico del microcontrollore, il timer2 (per generare l’onda quadra) e se questo è richiesto da altre funzioni, come ad esempio un analogRead su pin PWM la funzione tone non potrà essere utilizzata.

La scelta del timer da utilizzare ricade anche sulle funzioni che avrete intenzione di utilizzare nel vostro codice.

Arduino Uno ad esempio utilizza il Timer0 per le funzioni delay(), millis() e il pwm ovvero analogWrite(), sui pin 5 e 6. Il Timer1 viene utilizzato dalla libreria Servo e il pwm sui pin 9 e 10. Infine il Timer2 è utilizzato dalla libreria tone e per generare il pwm sui pin 3 e 11.

Questo per quanto riguarda le funzioni predefinite, se utilizzate qualche altra libreria che utilizza un timer, per sapere quale, vi conviene andare a leggere il file.h.

La libreria Tone non utilizza le funzioni del timer in modalità PWM sull’atmega, ma utilizza una routine d’interruzione per attivare o disattivare i pin.

Approfondimento 1
Approfondimento 2

 

 

Simone Candido è un ragazzo appassionato del mondo tech nella sua totalità. Simone ama immedesimarsi in nuove esperienze, la sua filosofia si basa sulla irrefrenabile voglia di ampliare a 360° le sue conoscenze abbracciando tutti i campi del sapere, in quanto ritiene che il sapere umano sia il connubio perfetto tra cultura umanistica e scientifica.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.