«

»

Set 03

Stampa Articolo

Tutorial: Arduino Tone – musica per le tue orecchie

Mi sono accorto di non aver mai dedicato un articolo alla gestione del suono con Arduino

musica 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:

ToneMelody

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 !!!

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/tutorial-arduino-tone-musica-per-le-tue-orecchie.html

30 comments

Vai al modulo dei commenti

  1. Gianni

    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

    1. Mauro Alfieri

      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

  2. Mattia

    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 !

    1. Mauro Alfieri

      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

  3. Mattia

    gia risolto 🙂

    1. Mauro Alfieri

      Ottimo, come?

  4. Mattia D.

    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:)

    1. Mauro Alfieri

      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

      1. Mattia D.

        GRAZIE !!!!

  5. Gianfranco

    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

    1. Mauro Alfieri

      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

  6. davide

    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

    1. Mauro Alfieri

      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

      1. Martino

        Dovrebbe bastare un potenziometro in serie con il buzzer.

  7. Sarah

    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.

    1. Mauro Alfieri

      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

      1. Michele Segoloni

        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.

        1. Mauro Alfieri

          Grande Michele, sempre presente 🙂

  8. Sarah

    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!

  9. Elia

    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

    1. Mauro Alfieri

      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

      1. Elia

        Ah! Non avevo visto lì alla riga 35! Ok bene, grazie 🙂

  10. renato

    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

    1. Mauro Alfieri

      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.

      1. renato

        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

        1. Mauro Alfieri

          Ciao Renato,
          li trovi tutti nel blog.

  11. vincenzo marasco

    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

    1. Mauro Alfieri

      Ciao Vincenzo,
      quando aggiungi il buzzer o il codice di gestione del buzzer ?

  12. riccardo

    Ciao mauro
    Sai dove posso trovare altre canzoni da riprodurre con arduino?
    perché fino ad ora ho trovato solo canzoni natalizie

    1. Mauro Alfieri

      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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>