Omet navegació

11.- Altaveus i melodies

1-Esquema elèctric.

 Per reproduir notes músicals amb arduino ens cal tindre un altaveu en sèrie amb una resistència de 100 Ohms.

Altaveu en Arduino per reproduir notes músicals

2.- Emisió de sons.

Si volem generar sons ho farem amb l'ordre tone(pin, freqüència, duració)  , on la freqüència és nombre de vegades que es repeteix la ona quadrada i que varia entre 20Hz i 20000 Hz si volem que la puguen escoltar el humans, la duració és el nombre de miilisegons que s'emetrà el só.

Podem fer un programa molt senzill que emeta sons com aquest on cal saber la freqüència de cada nota.

 

 
			//Copyleft(2012)= C. Ferrando
			//
			const int altaveu = 8; // connecta l'altaveu al pin 8
			void setup()
			{
			}
			void loop()
			{
			tone(altaveu,261, 333); // interpreta la nota Do usant la seua freqüència
			delay(333); //fem un silenci de 333 ms
			tone(altaveu,294, 333); // interpreta la nota Re usant la seua freqüència
			delay(333); //fem un silenci de 333 ms
			tone(altaveu,329, 333); // interpreta la nota Mi usant la seua freqüència
			delay(333); //fem un silenci de 333 ms
			tone(altaveu,349, 333); // interpreta la nota Fa usant la seua freqüència
			delay(333); //fem un silenci de 333 ms
			tone(altaveu,392, 333); // interpreta la nota Sol usant la seua freqüència
			delay(333); //fem un silenci de 333 ms
			tone(altaveu,440, 333); // interpreta la nota La usant la seua freqüència
			delay(333); //fem un silenci de 333 ms
			tone(altaveu,493, 333); // interpreta la nota Si usant la seua freqüència
			delay(4000); //fem un silenci de 4000 ms
			}
			
			

 

O podem  definir col·leccions de dades i amb cicles for cerquem les notes dins les col·lecions definides, així no cal saber les freqüències de memòria.

 

 
			//Copyleft(2011)= Michael Margolis
			//Modificat: C.Ferrando
			//
			const int altaveu = 8; // connecta l'altaveu al pin 8
			char nomNotes[] ={'Do','Re','Mi','Fa','Sol','La','Si'};
			unsigned int frequencies[] = {261,294,329,349,392,440,493};
			const byte comptaNotes = sizeof(nomNotes); // el nom de les notes (7 en aquest exemple)// un espai entre notes representa un silenci
			char partitura[] = "Do,Re,Mi,Fa,Sol,La,Si, ,Do,Re,Mi,Fa,Sol,La,Si, ,Do,Re,Mi,Fa,Sol,La,Si";
			const byte longitudPartitura = sizeof(partitura); // el nombre de notes en la partitura
			void setup()
			{
			}
			void loop()
			{
			for (int i = 0; i < longitudPartitura; i++)
			{
			int duracio = 333; // cada nota dura la tercera part d'un segon
			interpretaNota(partitura[i], duracio); // interpreta la nota
			}
			delay(8000); // espera  huit segons abans de repetir la melodia
			}
			void interpretaNota(char nota, int duracio)
			{
			// interpreta el to que correspon a la nota
			for (int i = 0; i < comptaNotes; i++)
			{
			// cerca la nota al catàleg de notes
			if (nomNotes[i] == nota) // troba la nota a la colecció de nomNotes
			tone(altaveu, frequencies[i], duracio); // interpreta la nota usant la seua freqüència
			}
			// Temps d'espera entre dues notes (no pot ser cero)
			delay(100);
			}
			

Qüestió: Estalvi d'espai de memòria

Les variables "comptaNotes" i  "longitudPartitura" que emmagatzemen la quantitat de notes a les coleccions de dades char nomNotes[ ] i char partitura[ ] s'han definit utilitzant el tipus byte en lloc del tipus int

Quanta memòria ens em estalviat ?