Come utilizzare un altoparlante piezo con il Raspberry Pi per riprodurre suoni

Ti sei mai chiesto come emettono suoni quei piccoli giocattoli di orsacchiotto? È probabile che stavi ascoltando un altoparlante piezoelettrico. Puoi crearne uno per riprodurre suoni e musica utilizzando un altoparlante piezo con Raspberry Pi!

Che cos’è un altoparlante piezo?

Gli altoparlanti piezoelettrici contengono un materiale speciale chiamato “elemento piezoelettrico” che è in grado di esibire l’effetto piezoelettrico, un processo genera una carica elettrica quando si colpisce qualcosa di solido.

Molte cose solide, come rocce o sale, sono solide perché i loro atomi sono impacchettati strettamente insieme. Questa disposizione è chiamata “struttura cristallina”.

In alcuni materiali, una struttura cristallina può piegarsi o schiacciarsi quando viene applicata una forza sufficiente. Questo fa sì che alcuni atomi rimangano accanto ad altri atomi a cui normalmente non si siedono accanto.

Nei materiali piezoelettrici o negli elementi piezoelettrici, questi atomi hanno cariche opposte: una positiva e l’altra negativa. Nel momento in cui questi atomi di cariche opposte si avvicinano, producono elettricità.

Altoparlanti piezo sopra e sotto
Ci sono elementi piezo all’interno di questi altoparlanti piezoelettrici.

Puoi anche fare il contrario: applicare un campo elettrico su elementi piezoelettrici per far piegare le strutture cristalline, cambiando la forma complessiva del materiale. Quando si utilizza un altoparlante piezo, l’elemento piezo all’interno si contrae e si espande così velocemente da far vibrare ed emettere un suono.

Cosa ti serve per il progetto

L’uso di altoparlanti piezo con Raspberry Pi per generare suoni è semplice come far lampeggiare i LED. Hai solo bisogno di alcune cose e un codice diverso. Non avrai bisogno di una resistenza.

  • Altoparlanti piezoelettrici
  • 2 cavi jumper maschio-femmina
  • Lampone Pi

Come utilizzare un altoparlante piezo con Raspberry Pi

  1. Apri il tuo editor di codice preferito e incolla il seguente codice:
# The frequencies in this code was based on the note frequencies found at:
# https://pages.mtu.edu/~suits/notefreqs.html
# Tuned at A4 = 440Hz.
 
import RPi.GPIO as GPIO
from time import sleep
 
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
pin7 = GPIO.PWM(7, 100)
pin7.start(50)
 
while True:
  GPIO.output(7, GPIO.HIGH)
  pin7.ChangeFrequency(16.35) # C0
  sleep(1)
  pin7.ChangeFrequency(261.63) # C4
  sleep(1)
  pin7.ChangeFrequency(293.66) # D4
  sleep(1)
  pin7.ChangeFrequency(329.63) # E4
  sleep(1)
  pin7.ChangeFrequency(349.23) # F4
  sleep(1)
  pin7.ChangeFrequency(392.00) # G4
  sleep(1)
  pin7.ChangeFrequency(440.00) # A4
  sleep(1)
  pin7.ChangeFrequency(493.88) # B4
  sleep(1)
  pin7.ChangeFrequency(523.25) # A5
  sleep(1.5)
  pin7.ChangeFrequency(16.35) # C0
  sleep(1)
  GPIO.output(7, GPIO.LOW)
  sleep(1)
  1. Salva come “rpi-piezo.py” o qualsiasi nome file desiderato, purché termini con l’estensione del file “.py”, quindi spegni il Raspberry Pi.
  1. Ora è il momento di costruire il circuito. Collegare il pin positivo o il filo al pin 7 e l’altro pin a GND. Alcuni elementi piezoelettrici hanno un segno “+” che mostra quale pin è positivo. Altri hanno fili che sporgono – come sempre, un filo rosso significa positivo.
Piezo Sulla Freccia Tagliere Sulla Croce Filo Rosso E Nero
Freccia: segno a croce che indica 5V sull’altoparlante piezo.

Se hai problemi a cercare il pin 7, tieni il tuo Raspberry Pi in modo che i pin GPIO si attacchino a destra, quindi guarda i pin GPIO. Il pin in alto a sinistra dovrebbe essere il pin 1 e alla sua destra c’è il pin 2. Sotto il pin 1 c’è il pin 3 e alla sua destra c’è il pin 4 e così via.

Piedinatura Raspberry Pi
  1. Accendi il tuo Raspberry Pi e apri il terminale.
  1. Vai alla cartella in cui hai salvato “rpi-piezo.py” tramite il terminale utilizzando cd. Ecco un esempio: cd MTE/experiments/rpi-piezo. La cartella “rpi-piezo” contiene il nostro script “rpi-piezo.py”.
  1. Ora è il momento di eseguire lo script Python. accedere python3 rpi-piezo.py e ascolta i suoni della scala C maggiore!
In relazione :  Come utilizzare le creatività di affiliazione: la guida definitiva per i professionisti del marketing

Spiegazione del codice

Il codice può sembrare a prima vista un gran pasticcio, quindi separiamolo in tre parti:

  1. Importa comandi
  2. Comandi di configurazione
  3. Comandi in loop

Questo non è un raggruppamento standardizzato: è stato creato perché è sempre una buona pratica dividere il codice in parti facilmente identificabili. Semplifica le cose quando stai cercando di modificare qualsiasi parte del codice.

Comandi di importazione

Qui è dove definisci quali moduli stai “importando” nel tuo codice. I comandi di importazione sono costituiti da due righe di codice.

import RPi.GPIO as GPIO
from time import sleep

import RPi.GPIO as GPIO dice a Python che stai usando il modulo RPi.GPIO per controllare i pin GPIO di Raspberry Pi. as GPIO gli dice che ogni volta che chiami la variabile GPIOstai chiamando il modulo RPi.GPIO.

from time import sleep è un altro modo di chiamare i moduli. Ma invece di prendere l’intero modulo, stai solo importando il file sleep() funzione dal time modulo. Questo può aiutare molto quando si tratta di prestazioni, poiché Python non dovrà caricare l’intero modulo; usa solo quella funzione.

Comandi di configurazione

Il codice nei comandi di installazione è il punto in cui si “impostano” o si definiscono tutte le parti importanti del programma, come variabili, impostazioni e designazioni dei pin. Questi devono essere definiti solo una volta.

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
pin7 = GPIO.PWM(7, 100)
pin7.start(50)

GPIO.setwarnings(False) impedisce la visualizzazione di avvisi quando si esegue il codice. Gli avvisi vengono ancora visualizzati quando il codice viene eseguito correttamente, ma l’aggiunta di questo pezzo di codice impedisce ai messaggi di avviso di inondare il terminale ogni volta che entri python3 rpi-piezo.py. Ma questa è più una preferenza personale: puoi semplicemente rimuovere questo bit se vuoi vedere gli avvisi. Funziona ancora lo stesso.

GPIO.setmode(GPIO.BOARD) dice a Python come vuoi che i pin di input/output (GPIO) per uso generale del tuo Raspberry Pi siano nominati. Ci sono due modi: BOARD e BCM.

  • BOARD è un formato di denominazione in cui dai un nome ai pin in base ai loro numeri pin. Qui, il pin 1 è in alto a sinistra, il pin 2 accanto, il pin 3 sotto il pin 1 e così via.
  • BCM sta per “Broadcom”. Invece dei numeri pin fisici, BCM sceglie il canale SOC Broadcom. Questo formato di denominazione differisce da scheda a scheda, quindi può essere un po’ più difficile da seguire se stai utilizzando BCM su una guida.

GPIO.setup(7, GPIO.OUT) dice a Python che stai usando il pin 7 come output.

pin7 = GPIO.PWM(7, 100) fa una variabile, pin7che contiene la stringa GPIO.PWM(7, 100). Questo accorcia il tuo codice in modo che tu possa semplicemente usarlo pin7 invece di chiamare GPIO.PWM(7, 100) tutto il tempo.

Infine, pin7.start(50) imposta il pin 7 sulla modalità PWM (Pulse Width Modulation). Ciò significa che ogni volta che il pin 7 è impostato su HIGH, emette 3,3 V la metà del tempo. Il resto del tempo non emette nulla (o è a 0V).

Comandi in loop

I comandi ripetuti vengono eseguiti in un ciclo: si ripetono finché si mantiene lo script in esecuzione. Per fare ciò, devi mantenerli rientrati dopo while True:.

while True:
  GPIO.output(7, GPIO.HIGH)
  pin7.ChangeFrequency(16.35) # C0
  sleep(1)
  pin7.ChangeFrequency(261.63) # C4
  sleep(1)
  pin7.ChangeFrequency(293.66) # D4
  sleep(1)
  pin7.ChangeFrequency(329.63) # E4
  sleep(1)
  pin7.ChangeFrequency(349.23) # F4
  sleep(1)
  pin7.ChangeFrequency(392.00) # G4
  sleep(1)
  pin7.ChangeFrequency(440.00) # A4
  sleep(1)
  pin7.ChangeFrequency(493.88) # B4
  sleep(1)
  pin7.ChangeFrequency(523.25) # A5
  sleep(1.5)
  pin7.ChangeFrequency(16.35) # C0
  sleep(1)
  GPIO.output(7, GPIO.LOW)
  sleep(1)

GPIO.output(7, GPIO.HIGH) accende il pin 7 HIGH. Quel pin funziona ed emette un segnale PWM. La funzione GPIO.output() accetta due parametri: il numero di pin e se si desidera impostarlo HIGH o LOW. Se salti alla parte inferiore, trovi GPIO.output(7, GPIO.LOW)che fa il contrario: attiva il pin 7 LOW.

Le righe di codice in mezzo sono solo una serie di pin7.ChangeFrequency() e sleep(1). La regolazione dei loro parametri consente di suonare diversi tipi di note.

In relazione :  Come utilizzare più account in Telegram Messenger

pin7.ChangeFrequency() è in realtà una forma di scorciatoia di GPIO.PWM(7, 100).ChangeFrequency(). L’uso del modulo di scelta rapida semplifica la modifica del pin che stai utilizzando. Se non hai definito pin7 = GPIO.PWM(7, 100) in precedenza, dovresti cambiare il numero pin su ogni modifica di frequenza che fai.

Cosa c’è dentro .ChangeFrequency() è la frequenza del segnale PWM e, quindi, dell’elemento piezoelettrico. Ricorda che un elemento piezoelettrico è solo un cristallo solido che si contrae leggermente quando lo attraversi attraverso l’elettricità e si rilassa quando ti fermi. La rapida contrazione e il rilassamento producono suoni di diverse altezze e puoi controllare l’intonazione cambiando il numero all’interno .ChangeFrequency(). Per semplificarti le cose, c’è un commento dopo ciascuno pin7.ChangeFrequency() indicando che nota sono.

Infine, sleep(1) sospende il codice per un secondo. Se metti in pausa il codice dopo aver cambiato la frequenza, avresti praticamente una sola nota: suonerà quella nota finché manterrai il codice dormendo.

Come viene generato il suono

Come fa tutto a passare da un elemento piezoelettrico vibrante a un suono, per poi trasformarsi in qualcosa che potrebbe assomigliare alla musica? Riguarda la frequenza e il tono.

Ciò che percepiamo come suoni con le nostre orecchie sono in realtà vibrazioni nell’aria. Più l’aria vibra, più alta è l’altezza del suono. Tracciamo questo su carta come onde di pattern variabili e gli diamo un’unità SI, cioè un’unità di misura: Hz (che sta per Hertz). Le onde sonore con più Hz vibrano più velocemente di quelle con meno. Noi umani possiamo sentire le onde sonore vibrando da qualche parte tra 20Hz e 20.000Hz.

Quando hai usato ChangeDutyCycle(), hai modificato il numero di volte in cui l’elemento piezoelettrico avrebbe vibrato nel tempo, ovvero la frequenza. Hz è una misura della frequenza delle vibrazioni nell’aria.

Per cambiare il suono in un modo che assomigli almeno alla musica, devi cambiare la frequenza in un modo particolare. In altre parole, devi modificare il tono. A differenza della frequenza, l’altezza è una misura di quanto alto o basso un suono suoni alle nostre orecchie. Cambiando il tono, stai creando qualcosa di già vicino alla musica.

Chitarra Unsplash
Le corde di una chitarra suonano sempre a una frequenza definita.
Fonte immagine: Spruzza

Naturalmente, c’è di più nel fare musica oltre a cambiare il tono. Hai anche bisogno della durata dell’intonazione per prendere nota. Ecco dove sleep() va: fai in modo che il Raspberry Pi rimanga su un determinato tono per un certo periodo di tempo per darti una nota corretta!

Domande frequenti

Qual è la differenza tra un altoparlante piezoelettrico e un altoparlante magnetico?

Gli altoparlanti piezoelettrici utilizzano un elemento piezoelettrico vibrante per produrre il suono. Di solito sono realizzati in ceramica e sono generalmente utilizzati nei cicalini. Nel frattempo, gli altoparlanti magnetici utilizzano elettromagneti che fanno vibrare membrane di plastica. Sono utilizzati negli smartphone e negli auricolari.

Gli elementi piezoelettrici hanno polarità?

Tecnicamente sì. L’elemento piezo all’interno degli altoparlanti piezo si piega in un modo se si applica la tensione da un lato e nell’altro se lo si inverte.

Oltre agli altoparlanti, per cos’altro vengono utilizzati gli elementi piezoelettrici?

Quasi tutto ciò che ha qualcosa a che fare con la pressione e la vibrazione ha elementi piezoelettrici. Ciò include accelerometri, microfoni, pickup per chitarra e altoparlanti. Ma c’è anche una cosa insolita che li ha: gli accendini li usano per creare la scintilla che accende una fiamma.