Mi sono accorto di non aver mai dedicato un articolo alla gestione del suono con Arduino
devo ammetterlo non sono un cultore della musica, sopratutto mi dicono che mi manca completamente il senso del ritmo e forse chi me lo dice ha ragione 🙂 deve essere questo il motivo per cui non ho dedicato al suono alcun articolo.
Ma come si dice? C’è sempre una prima volta.
Per questo tutorial puoi utilizzare lo sketch di esempio fornito con l’IDE Arduino: ToneMelody
Componenti
l’elenco del materiale questa volta è davvero piccola:
- n.1 scheda Arduino (2009, diecimila, uno, mega, mini, ….)
- n.1 altoparlante o speaker da 8ohm, in alternativa un cicalino
- n.1 resistenza da 100ohm, non necessario se usi un cicalino
Lo schema
Lo schema è riportato nell’articolo originale, ma puoi realizzarlo con colo un cicalino tipo quello presente nello Starter Kit Arduino 2 e senza la resistenza:
lo sketch
Per caricarlo dall’IDE segui il percorso: File -> Examples -> Digital -> ToneMelody ti si presenterà il seguente sketch:
/* Melody Plays a melody circuit: * 8-ohm speaker on digital pin 8 created 21 Jan 2010 modified 30 Aug 2011 by Tom Igoe This example code is in the public domain. http://arduino.cc/en/Tutorial/Tone */ #include "pitches.h" // notes in the melody: int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4}; // note durations: 4 = quarter note, 8 = eighth note, etc.: int noteDurations[] = { 4, 8, 8, 4,4,4,4,4 }; void setup() { // iterate over the notes of the melody: for (int thisNote = 0; thisNote < 8; thisNote++) { // to calculate the note duration, take one second // divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. int noteDuration = 1000/noteDurations[thisNote]; tone(8, melody[thisNote],noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(8); } } void loop() { // no need to repeat the melody. }
parti subito dalle prime linee successive al commento introduttivo:
linea 18: includi la classe pitches.h che contiene tra le altre cose l’elenco della codifica delle note che utilizza lo sketch;
linee 21-22: definisci la melodia, quella di esempio è realizzata con le note:
Costante | Frequanza |
NOTE_C4 | 262 |
NOTE_G3 | 196 |
NOTE_A3 | 220 |
NOTE_B3 | 247 |
puoi trovare in questo link l’associazione Costanti – Frequanze in Hz;
linea 25: definisci i tempi di durata di ciascuna nota, come puoi leggere nel commento alla linea precedente 8 vuol dire ottavo di nota e 4 quarto di nota.
linea 29: esegui un ciclo da 0 a 8, le note della melodia, utilizzando come cursore per spostarti lungo l’array della melodia e della durata la variabile thisNote;
linea 34: la durata della nota è espressa in quarti e ottavi di secondo, in arduino sai che un secondo è espresso in 1000 millisecondi, per cui la durata è data dalla formula: (1000/durata);
linea 35: usa il comando tone( pin, frequanza, durata ) per inviare il segnale al pin 8 di arduino con la frequenza desiderata e per il tempo specificato;
linea 39: calcola la variabile pauseBetweenNotes come (durata della nota * 1.30) ossia il 30% in più della durata della nota stessa;
linea 40: attendi il tempo appena calcolato tra una nota e la successiva;
linea 42: usa il comando noTone( pin ) per interrompere l’esecuzione della nota, senza questa linea la nota non sarebbe mai interrotta.
Lo sketch esegue una simpatica melodia, provalo e sarai piacevolmente colpito.
Nella ricerca di un esempio di melodia realizzata con Arduino da farti ascoltare per comprendere le potenzialità dei comandi tone, noTone, ecc… mi sono imbattuto in questo video:
Buon ascolto !!!
37 commenti
Vai al modulo dei commenti
Ciao Mauro
Interessante post !
Secondo te è possibile far “suonare” note con frequenze che possono simulare un violino ?
Sarebbe interessante includere in un programma il suono comandando la riproduzione con la pressione di un interruttore….ad esempio mentre muovo un motore con il pulsante in una direzione potrebbe sentirsi un rumore fin quando tengo premuto,,,,senza scomodare schede ad hoc…per arduino audio.
Se ti viene in mente una soluzione alternativa…….
Ho provato a cercare in rete ma ho trovato solo schede piuttosto costosette.
Il tuo post mi ha solleticato non poco…
Ciao e grazie
Autore
Ciao Gianni,
se ti definisci le note in una classe tua probabilmente puoi avvicinartici, tuttavia il piacere di un violino che suona non penso possa essere riprodotto con Arduino.
Per il suono riprodotto mentre un motore si muove non mi sembra difficile da realizzare, l’esempio per l’emissione del suono puoi ricavarlo da questo sketch e come pilotare i motori dipende solo dal tipo di motore che vuoi comandare, il blog è pieno di esempi.
Prova, sperimenta e se incontri particolari difficoltà scrivimi che proviamo a risolvere insieme.
Mauro
Salve, ho provato a includere la libreria Tone nel mio progetto ma quando faccio Verifica o Carica mi da questi errori:
Tone.cpp: In member function ‘void Tone::begin(uint8_t)’:
Tone.cpp:121: error: ‘bitWrite’ was not declared in this scope
Tone.cpp:123: error: ‘digitalPinToPort’ was not declared in this scope
Tone.cpp:123: error: ‘portOutputRegister’ was not declared in this scope
Tone.cpp:124: error: ‘digitalPinToBitMask’ was not declared in this scope
Tone.cpp: In member function ‘void Tone::play(uint16_t, uint32_t)’:
Tone.cpp:198: error: ‘OUTPUT’ was not declared in this scope
Tone.cpp:198: error: ‘pinMode’ was not declared in this scope
Tone.cpp:294: error: ‘bitWrite’ was not declared in this scope
Tone.cpp: In member function ‘void Tone::stop()’:
Tone.cpp:361: error: ‘digitalWrite’ was not declared in this scope
Potrebbe aiutarmi a risolverli? Grazie !
Autore
Ciao Mattia,
la libreria tone.cpp che hai utilizzato é differente dalla mia e probabilmente usa altri metodi per emettere musica.
Ti consiglio di leggere la documentazione dell’autore da cui hai preso la libreria e verificare come va modificato lo sketch.
Mauro
gia risolto 🙂
Autore
Ottimo, come?
ciao, avrei un problema
cosa vuol dire this note++?????
e in quale modo riesco a far cambiare nota tutte le volte perchè non capisco cosa vogliono dire le parentesi quadre alla riga 35 di conseguenza tutta la riga35!? Grazie:)
Autore
Ciao Mattia,
la variabile note è un contatore e la sintassi ++ la incrementa di 1 è identico a scrivere
note = (note + 1) oppure
note += 1
Sono tutte sintassi alternative.
Se non ti sono chiari gli usi delle parentesi ti consiglio di iniziare con degli script base di programmazione e di consultare il reference sul sito arduino per capire come si usano.
Mauro
GRAZIE !!!!
Ciao Mauro, bellissimo tutorial come sempre.
Mi chiedevo se lo schema funzionasse con questo altoparlantino:
http://www.ebay.it/itm/261323342989?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649
(anche se penso proprio di si)
e se si potesse ascoltare come audio un mp3 (fisso), penso da caricare qualche parte…..o comunque un midi che io scelgo.
Grazie!!
Gianfranco
Autore
Ciao Gianfranco,
per l’altoparlante dovresti provare, dalle caratteristiche sembrerebbe compatibile ma solo il test sul campo te ne può dare la certezza.
Sull’ascolto dell’mp3 dubito che arduino riesca a riprodurne uno direttamente.
Mauro
ciao Mauro
mi chiedevo se era possibile o come si può fare ,ad aumentare o diminuire il livello del volume ,di un cicalino,con un pulsante.
non riesco trovare nulla .
grazie mille come senpre a presto Davide
Autore
Ciao Davide,
non mi sono mai posto questa domanda, tuttavia penso che data la natura del cicalino piezoelettrico questa cosa non sia possibile, a meno di non giocare con il PWM sul pin negativo mentre il pin positivo gli impartisce le note.
Se provi fammi sapere cosa ottieni.
Mauro
Dovrebbe bastare un potenziometro in serie con il buzzer.
Ciao Mauro,
io sto cercando di realizzare un progetto più o meno simile per la mia tesi di laurea, quindi vorrei riprodurre dei suoni con Arduino.. ma il mio problema sta nel fatto che questi suoni io li ho già in formato Mp3 o comunque come traccia audio! ora mi chiedo come posso fare a trasfomare questa traccia audio in quel “codice” che serve ad Arduino?… esiste un programma che mi faccia questo calcolo?
grazie mille! comunque tutorial davvero interessante!!
Sarah.
Autore
Ciao Sarah,
purtroppo ho poca esperienza di musica e file musicali.
Io uso suonerie già composte nel formato che vedi, ti invito a leggere anche gli ultimi articoli che ho scritto per natale, con le suonerie natalizie arduino.
So che esiste una Mp3 shield o qualcosa di simile che potresti usare, io non l’ho mai provata
Mauro ti dispiace se provo ad intervenire? Mi dilettavo a riprodurre suoni già col commodore 64 ed un minimo di informazioni le ho.
Sarah, quelle che leggi nello sketch (B3, C4, G3) sono note nella notazione inglese:
A = la · B = si · C = do · D = re · E = mi · F = fa · G = sol mentre il numero indica l’ottava.
Nell’array noteduration hai le durate per ogni singola nota occhio però che più alto è il valore meno durerà il suono. Infatti la durata è (espressa in millisecondi) pari a 1000 diviso questo numero.
Quello che ti serve, quindi, è uno spartito della musica che vuoi riprodurre con al sequenza di note e la loro durata.
Se vuoi riprodurre un motivo che hai in mp3 hai 3 strade:
1) trovarti lo spartito con lo strumento principale (arduino riproduce un solo tipo di suono, non puoi impostare parametri che ti permettano di imitare strumenti diversi da quello che ho capito. non si possono impostare timbro e forma d’onda, per esempio)
2) convertire l’mp3 in midi (esistono dei convertitori online) per poi editare il file (esistono anche gli editor di file midi) ed avere così lo spartito
3) avventurarti sulla strada dell’mp3 shield.
Autore
Grande Michele, sempre presente 🙂
Grazie della risposta! In realtà i suoni che devo riprodurre sono dei suoni specifici che ho campionato e modificato io stessa, sono più che altro dei “tick tack” e fruscii vari… non so se il programma che ho usato per editarli mi permette di avere uno spartito.. ma cercherò di capire come ottenere uno spartito!
Preferirei non avventurarmi sul mp3 shield ma solo perchè il mio oggetto è veramente piccolo.. e preferirei usare meno componenti possibili, anche l’utilizzo di una micro SD, vorrebbe dire aggiungere tutta una serie di collegamenti che preferirei evitare! (sono pignolina lo so 🙂 )
Ad ogni modo grazie delle risposte! cercherò di approfondire questo linguaggio MIDI e capire se atraverso quello riesco a riprodurre i miei suoni!
Salve Mauro
Sto dilettandomi nell’uso del C e della scheda Intel Galileo, compatibile con gli shields e con i codici e l’ambiente di sviluppo di arduino. In pratica una sua versione avanzata. Ma vengo al punto.
Sarebbe mia intenzione utilizzare lo sketch tone (o uno analogo) per riprodurre le note, ma volevo sapere:
è possibile collegare ad arduino (e quindi alla galileo) più speaker? Ed eventualmente come?
E, avendo più sequenze di note, come potrei indicare alla scheda a quale speaker inviare quale sequenza di note? Nel codice non mi pare di vedere riferimento al pin al quale è collegato lo speaker.
Tone può essere lo sketch giusto da usare?
Mille grazie
Autore
Ciao Elia,
ti invito a leggere bene sia lo sketch sia la descrizione sotto, è li per chiarire i dubbi tipo il tuo.
Scoprirai che la riga 35 contiene quello che ti occorre.
Non ho mai provato con 2 o più speaker deduco che possa funzionare, anche se essendo arduino in grado di inviare una linea alla volta dubito che tu riesca a parallelizzare l’invio di note differenti su più speaker, ammesso che questo abbia senso.
Mauro
Ah! Non avevo visto lì alla riga 35! Ok bene, grazie 🙂
Ciao Mauro, sei così gentile da potermi aiutare?
Ti premetto che conosco molto poco Arduinouno, ma nonostante ciò lo scorso Natale sono riuscito a meccanizzare con grande successo il mio presepe. Grazie ad Arduinouno e all’ausilio di 12 relè muovo a comando di tempo tutti i meccanismi e le loro luci, ma non riesco a trovare un tutorial che mi permette di inserire in questo mio progetto le voci ed i rumori inerenti al tema del meccanismo.
Cerco di spiegarmi meglio. Ho bisogno di inserire negli sketch ad esempio: 1) il rumore di un contadino che zappa, 2) il rumore dell’acqua che scorre in un ruscello, 3) il rumore della pioggia, 4) il belato delle pecore, ecc.
L’unica cosa che ho capito è che ho bisogno di scaricare le librerie che includono tali suoni, ma credimi non riesco a trovare un solo tutorial che fa al mio caso.
Per favore se puoi aiutarmi te ne sarei grato.
In attesa ti ringrazio. Renato
Autore
Ciao Renato,
proprio in occasione del Natale 2014 ho pubblicato una serie di articoli sulle suonerie ed uno sulla realizzazione di una centralina alba tramonto per presepi.
Purtroppo in merito alla realizzazione di suoni,rumori,versi,ecc.. non saprei come realizzarli, forse puoi provare con una shield tipo mp3 o simile in grado di eseguire brani in formato mp3 da una sd card. Io non ne possiedo una da provare per aiutarti.
Ciao Mauro, grazie comunque per avermi risposto.
La serie di articoli sulle suonerie e quello sulla realizzazione di una centralina alba tramonto per presepi, come faccio a trovarla? E’ possibile visionarla? Potrei prendere qualche spunto anche da questi.
Grazie mille. Renato
Autore
Ciao Renato,
li trovi tutti nel blog.
Ciao mauro.
Sto cercando di creare una macchinina radiocomandata con il bluetooth con arduino.
volevo aggiungere il buzzer per effettuare il classico rumore dei camion in retromarcia.
il problema sta che quando aggiungo il buzzer non mi funziona più un motorino
Autore
Ciao Vincenzo,
quando aggiungi il buzzer o il codice di gestione del buzzer ?
Ciao mauro
Sai dove posso trovare altre canzoni da riprodurre con arduino?
perché fino ad ora ho trovato solo canzoni natalizie
Autore
Ciao Riccardo,
purtroppo no, ho trovato anche io solo canzoni natalizie.
Appello: se ci fosse un musicista, con passione per arduino, che volesse spiegarci come ottenere altre canzoni sono a disposizione con il blog per dedicargli un articolo.
Salve mauro,volevo chiederti come posso fare a far illuminare dei led in base al tono (bassi medi e alti) collegando in ingresso delle casse(in base alla frequenza) ?
Autore
Ciao Angelo,
questo articolo tratta esattamente l’inverso, i toni vengono prodotti con Arduino e non acquisiti.
Penso possa esistere una shield per fare quello che desideri ma non ne conosco una in particolare, dovrai cercare sul Web
Ciao Mauro, grazie per i tuoi insegnamenti,
Vorrei chiederti come fare per emettere un solo beep in un void loop per Arduino Mega2560.
Grazie.
Autore
Ciao Domenico,
ti basta eseguire solo una nota di quelle che utilizzo per la composizione della melodia.
Ciao,
vorrei poter suonare una canzone con Arduino; ho provato a mettere le note interpretando uno spartito (con il file pitches.h) e mettere io i tempi delle note ma il risultato è stato molto modesto.
Tu per caso avresti già delle canzoni già pronte (con note e tempi) ??
Grazie arrivederci
Autore
Ciao Andrea,
non essendo in grado io di leggere uno spartito in modo esaustivo, di solito, cerco online dei file midi già pronti per essere convertiti in codice arduino.
Tra gli articoli del blog potresti leggere quelli dedicati alle canzoni natalizie in cui ci sono dei brani già codificati.
OK grazie mille !!