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
il_codice_aggiornata.txt · Ultima modifica: 2016/04/20 23:00 da lcampa
 
Ad eccezione da dove è diversamente indicato, il contenuto di questo wiki è soggetto alla seguente licenza: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki sintassi italiana dokuwiki