Lavorandoci sopra si è notato che è possibile ottenere un suono più chiaro che permette una migliore distinzione delle note al cambiamento della distanza: /* http://www.dreamsincode.com/blog/2010/10/19/arduino-basicspiezo-sounder/ */ #define passo 70000 #define CICALINO 11 #define DURATA 5000 //durata della li in millesecondi #define PAUSA 100 #define TRIGGER 2 #define ECHO 3 #define Distanza1 55 #define Distanza2 45 #define Distanza3 40 #define Distanza4 35 #define Distanza5 30 #define Distanza6 25 #define Distanza7 20 #define Distanza8 15 #define Distanza9 10 #define Distanza10 5 //char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; // nomi inglesi delle note /* http://www.autistici.org/2000-maniax/texts/Le%20frequenze%20delle%20note%20musicali%20%E2%80%94%20Ulisse.htm le frequenze riportate sono moltiplicate per 10, per evitare l'uso di numeri in lizione floating point */ String note[] = { "do", "do#" , "re" , "RE" , "mi", "fa", "fa#" , "sol", "sol#" , "la", "la#" , "si", "DO" }; unsigned int freq[] = {2616,2772,2937,5873,3296,3492,3700,3920,4153,4400,4662,4939,5233}; int suona(int i, unsigned long durata ){ //funzione che permette al “piezo” (amplificatore per arduino) di produrre il suono richiesto //Serial.print("suono la nota: "); // Serial.println(note[i]); unsigned long int li=5000000/freq[i]; //unsigned int rip=freq[i]*durata/10000; digitalWrite(CICALINO,HIGH); delayMicroseconds(li); digitalWrite(CICALINO,LOW); delayMicroseconds(li); delayMicroseconds(50000); } void setup() { pinMode(CICALINO,OUTPUT); pinMode(TRIGGER,OUTPUT); pinMode(ECHO,INPUT); Serial.begin(115200); Serial.begin(115200); } void loop() { unsigned long ritardo, distanza; digitalWrite(TRIGGER, LOW); //Il processo qui illustrato permette di calcolare la distanza della nostra delay(1); //mano in ogni istante digitalWrite(TRIGGER, HIGH); delayMicroseconds(1); digitalWrite(TRIGGER, LOW); ritardo = pulseIn(ECHO, HIGH); //Serial.print("ritardo: "); //Serial.println(ritardo); //distanza = (ritardo/2)/29.1; sconsigliabile: usa un'operazione in floating point. //distanza = (ritardo/2)*10/291; distanza = (ritardo>>1)*10/340; //Serial.print("distanza: "); //Serial.println(distanza); delayMicroseconds(passo); //unsigned long time; unsigned long durata=DURATA; //unsigned long int li; // larghezza impulso //unsigned int rip; // numero di ripetizioni // unsigned long int i,j; //ogni 5 cm si produce una nota diversa if (distanza < Distanza1) { if (distanza > Distanza2) suona(0, durata); else { if (distanza > Distanza3) suona(2, durata); else { if(distanza > Distanza4) suona(4, durata); else { if (distanza > Distanza5) suona(5, durata); else { if (distanza > Distanza6) suona(7, durata); else { if(distanza > Distanza7) suona(9, durata); else { if(distanza > Distanza8) suona(11, durata); else { if (distanza > Distanza9) suona(12, durata); else { if (distanza > Distanza10) suona(2, durata); } } } } } } } } } } Le modifiche apportate sono state: ^ Commentato le stampe a video | Esse infatti avevano bisogno di un certo tempo per essere comprese e visualizzate dal programma: ciò rallentava la ripetizione del suono producendo un suono grave e troppo elettronico | ^ Migliorato il ciclo if-else | Nel vecchio codice, infatti, la condizione dei cicli "if" veniva analizzata continuamente, ritardando allo stesso modo di prima la produzione del suono: si è quindi cercato di creare cicli if-else incastonati uno all'interno dell'altro in modo tale da verificare la condizione una ed una sola volta, risparmiando così del tempo prezioso e ottenendo un suono migliore | ^ Aggiunto un delay al calcolo della distanza | La distanza dall'HSR veniva calcolata molto rapidamente, al microsecondo, se non meno: ciò produceva un suono troppo meccanico e continuo impedendo all'ascoltatore di notare la differenza tra i suoni al cambio della nota. Aggiungendo un delay, cioè un ritardo tra una misurazione e l'altra, è stato possibile ottenere un suono più forte e più chiaro |