Siamo pronti a fare rumore. Utilizzando una board Arduino, una fotoresistenza e un piezo potrai realizzare il tuo theremin comandato dalla luce.
Il theremin è uno strumento musicale che produce suoni in base ai movimenti delle mani del musicista. Il theremin rileva la posizione delle mani del musicista in relazione a due antenne leggendo le variazioni di capacità sulle antenne, che sono collegate a un circuito analogico che crea il suono. Un’antenna controlla la frequenza del suono e l’altra controlla il volume.
Con Arduino è possibile emulare questi suoni utilizzando la funzione tone().
Quali sono le differenze tra analogWrite() e tone() che permette a un trasduttore come uno speaker o un piezo di vibrare a velocità diverse?
La funzione tone() opera in modo molto simile al PWM in analogWrite(), ma con una differenza significativa.
In analogWrite() la frequenza è fissa; cambia il ciclo di lavoro degli impulsi in un dato periodo di tempo. Con tone() invii ancora impulsi, ma cambiando la loro frequenza. tone() manda sempre impulsi a un ciclo di lavoro del 50%.
Vediamo questa immagine per capire la differenza:
Nel primo caso si può notare come sia basso il segnale nella maggior parte del tempo, ma la frequenza è la stessa di PWM 200.
Nel secondo caso possiamo notare come sia alta la tensione nella maggior parte del tempo ma la frequenza è la stessa di PWM 50.
Nel terzo caso il ciclo di lavoro è al 50% ma cambia la frequenza rispetto al quarto caso.
Nel quarto caso abbiamo lo stesso ciclo di lavoro del terzo caso ma abbiamo una frequenza doppia.
In questo progetto effettueremo una calibrazione. Perchè?
La funzione tone() ti offre la possibilità di generare frequenze diverse tramite uno speaker. Usando i sensori in un partitore di tensione, probabilmente non sarà possibile ottenere l’intera gamma di valori tra 0 e 1023. Calibrando i sensori, è possibile mappare gli ingressi a un intervallo adatto.
Componenti da utilizzare:
- 1x board Arduino Uno
- 1x buzzer passivo
- 1x fotoresistenza
- 1x resistenza da 10 kilo ohm
- vari jumper
Muovendo le mani sul sensore, cambia la quantità di luce che cade sulla fotoresistenza. Il cambiamento di tensione sul piedino analogico determina la frequenza delle note.
Diagramma di collegamento:
Il codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/* Crea una variabile per memorizzare il valore letto dalla fotoresistenza con analogRead(). Poi, crea variabili per i valori alto e basso. Imposta il valore iniziale nella variabile sensoreLow a 1023 e il valore di sensorHigh a 0. Quando esegui il programma per la prima volta, confronta questi numeri alla lettura del sensore per trovare i reali valori massimi e minimi */ int sensorValue; int sensorLow = 1023; int sensorHigh = 0; /* Crea una costante chiamata ledPin. Userai questo LED come indicatore del fatto che il sensore ha finito la calibrazione. */ const int ledPin = 13; void setup() { /* imposto ledPin come output e accendo il led */ pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); /* Nei passi successivi occorre calibrare i valori minimi e massimi del sensore. Usa un'istruzione while() per eseguire un ciclo per 5 secondi. Il ciclo while si esegue fino a che si verifica una certa condizione. In questo caso usa la funzione millis() per misurare il tempo. millis() riporta da quanti millesimi di secondo Arduino è accesso. */ while (millis() < 5000) { /* Nel ciclo leggi il valore del sensore. Se il valore è minore di sensorLow, aggiorna questa variabile. Se è più grande di SensorHigh aggiornalo. */ sensorValue = analogRead(A0); if (sensorValue > sensorHigh) { sensorHigh = sensorValue; } if (sensorValue < sensorLow) { sensorLow = sensorValue; } } /* Quando sono passati 5 secondi il ciclo while non eseguirà nessuna istruzione. Spegni il led collegato al pin 13. Usa i valori maggiore e minore del sensore appena registrato per calcolare la frequenza nella parte principale del codice. */ digitalWrite(ledPin, LOW); } /* Nel loop(), leggi il valore su A0 e assegnalo in sensorValue */ void loop() { sensorValue = analogRead(A0); /* Crea una variabile di nome pitch. Il valore di pitch viene calcolato a partire sensorValue. Utilizza sensorLow e sensorHigh come i limiti per i valori in entrata. Come valori iniziali d'usicta prova 50 e 4000. Questi numeri impostano l'intervallo di frequenze che genererà arduino */ int pitch = map(sensorValue, sensorLow, sensorHigh, 50, 4000); /* Chiama la funzione tone() per riprodurre un suono. Ci vogliono tre argomenti: quale piedino far suonare quale frequenza generare per quanto tempo suonare la nota */ tone(8, pitch, 20); delay(20); } |
Nella programmazione funzionale una map è una funzione che applica una data funzione ad una lista di elementi e restituisce una lista di risultati.
Ora sei pronto a copiare e caricare il codice sulla board Arduino.
Conclusione
Quando accendi Arduino, c’è una finestra di 5 secondi per calibrare il sensore. Per farlo, muovi la mano su e giù sopra la fotoresistenza modificando la quantità di luce che la raggiunge.
Dopo 5 secondi la calibrazione è completa. Dovresti quindi sentire dei rumori provenienti dallo speaker.
Al variare della quantità di luce che cade sui sensori dovrebbe variare la frequenza prodotto dal piezo.
Iscriviti ai nostri gruppi Telegram
Link utili