Beep

Juguem una mica amb sons. Com provablement ja saps, els sons són vibracions. El so d’una guitarra, per exemple, es produeix per les vibracions de les cordes. Per tant, per produir so amb Arduino necessitem alguna cosa que generi vibracions. A l’experiment següent farem això mitjançant un brunzidor piezoelèctric que piti.

El Brunzidor Piezoelèctric

El micròfon de contacte, també conegut com piezo brunzidor, és un component electrònic format a partir de la combinació de dos discos de diferents materials. Un d’ells és metàl·lic mentre que l’altre generalment és de ceràmica; tots dos tenen propietats piezoelèctriques. Quan s’aplica un voltatge al component, els materials es repel·leixen produint un “clic” audible (espetec). Si posem a zero la diferència de tensió, els materials tornaran a la seva posició inicial, produint de nou el so de “clic”.

Connecta el brunzidor al Pin digital 8 i a terra. Tant és quin pin connectis amb quin pin. Per fer vibrar el piezoelèctric ara, necessitem fer que el pin digital canviï entre HIGH i LOW repetidament, és a dir, alternar entre 5V i 0V. S’assembla bastant a fer parpellejar un LED, oi? De fet, el programa per a què el brunzidor soni és molt semblant a l’exemple “Blink”.

int speakerPin = 8;

void setup() {
   pinMode(speakerPin, OUTPUT);
}

void loop() {
   digitalWrite(speakerPin, HIGH);
   delay(1000);
   digitalWrite(speakerPin, LOW);
   delay(1000);
}

Aquest programa fa que el material dins el piezoelèctric es repel·leixi i torni a la seva posició normal en un interval de 2 segons. El que escoltes és un “clic” cada segon. Per poder generar un to necessitem fer que el piezoelèctric oscil·li més ràpidament. Podem aconseguir-ho simplement reduint el temps de retard. Prova-ho canviant el delay a un milisegon:

int speakerPin = 8;

void setup() {
   pinMode(speakerPin, OUTPUT);
}

void loop() {
   digitalWrite(speakerPin, HIGH);
   delay(1);
   digitalWrite(speakerPin, LOW);
   delay(1);
}

Tons

Ara ja saps com generar un so amb Arduino i un brunzidor piezoelèctric canviant el pin entre ’0′ i ’1′ un determinat número de vegades per segon. Aquesta quantitat és la freqüència, i obtindràs diferents tons segons el seu valor. A alta freqüència, és a dir, amb més oscil·lacions per segon, obtindràs sons molt aguts mentre que a baixa freqüència els obtindràs més greus.

Els tons tenen noms: Do (C), Re (D), Mi (E), Fa (F), Sol (G), La (A), Si (B). D’entre aquests tons, Do (C) té la freqüència més baixa a 262 hertz mentre que Si (B) té la més alta a 494 Hz. Això significa que necessitem fer oscil·lar el pin 262 vegades per segon perquè soni un Do (C) i 494 vegades per segon perquè soni un Si (B).

Si vols fer sonar tons diferents, has de canviar la quantitat de temps en què el pin està en ON i OFF. N’hi ha prou canviant el valor de la funció delay(1). Només hi ha un problema: per tocar els tons s’han de controlar amb més precisió. Enlloc d’utilitzar la funció delay, hauries d’utilitzar la funció delayMicroseconds. Com recordaràs, el delay fa una pausa de l’ordre dels mil·lisegons, mentre que el delayMicroseconds la fa dels microsegons, és a dir, 1000 vegades menor que un mil·lisegon.

La següent equació descriu la relació entre les dues funcions:

delay(1) = 1000 * delayMicroseconds(1) = delayMicroseconds(1000)

Això vol dir que el programa que has utilitzat per tocar Beep, també es pot escriure així:

int speakerPin = 8;

void setup() {
   pinMode(speakerPin, OUTPUT);
}

void loop() {
   digitalWrite(speakerPin, HIGH);
   delayMicroseconds(1000);
   digitalWrite(speakerPin, LOW);
   delayMicroseconds(1000);
}

Melodies

Una melodia és una combinació de notes. Però si volguéssim tocar una melodia en un brunzidor com hem fet en els exemples anteriors no acabaríem mai. Enlloc d’haver de calcular el temps del delay segons la freqüència i decidir quantes vegades fer oscil·lar el pin segons la durada de la nota, hem fet una funció anomenada play(). Llegeix sobre com utilitzar-la per tocar melodies aquí.