Calculo de tonos:

Donde:

Frecuencia-tono=1/length-Periodo

Si "duty cycle"=50%, es decir, el ancho de los pulsos activos (on) e inactivos (off) son iguales---> Periodo=2*PW

Obteniendo la siguiente fórmula matemática:

PW o ancho de pulso = 1/(2 * toneFrequency) = period / 2

De forma que a una frecuencia o periodo dados, podemos obtener la sigueinte tabla:

Nota musicalFrecuencia-tonoPeriodo (us)PW (us)
c261 Hz38301915
d294 Hz34001700
e329 Hz30381519
f349 Hz28641432
g392 Hz25501275
a440 Hz22721136
b493 Hz20281014
C523 Hz1912956

(cleft) 2005 D. Cuartielles for K3

Con Arduino, tenemos dos formas de generar tonos. Con el primer ejemplo construiremos y enviaremos una señal cuadrada de salida al piezo, mientras que con el segundo haremos uso de la señal de modulación por ancho de pulso o PWM de salida en Arduino.

Ejemplo 1:

/*Con el siguiente código y con sólo realizar modificaciones en los intervalos de tiempo que el pin seleccionado tenga valor HIGH o LOW, a través de la función digitalWrite (), generamos la señal PWM a una determinada frecuencia de salida=261Hz*/

int digPin = 10; // pin digital 10

int PW=1915; // valor que determina el tiempo que el pulso va a estar en on/off

void setup() {

    pinMode(digPin, OUTPUT);    // pin digital en modo salida

}

void loop() {

    delayMicroseconds(PW);                 // espera el valor de PW 
    digitalWrite(digPin, LOW);  // asigna el valor LOW al pin
    delayMicroseconds(PW);                 // espera el valor de PW 
    digitalWrite(digPin, HIGH); // asigna el valor HIGH al pin

}

Ejemplo 2:

En Arduino la señal de salida PWM (pines 9,10) es una señal de frecuencia constante (30769 Hz) y que sólo nos permite cambiar el "duty cycle" o el tiempo que el pulso está activo (on) o inactivo (off), utilizando la función analogWrite().

We use the Pulse Width feature with analogWrite to change volume ¿? Sólo se puede cambiar el volumen.

¿? No entiendo!!!

analogWrite(, value)

value: representa al parámetro "duty cycle" (ver PWM) y puede tomar valores entre 0 y 255. 0 corresponde a una señal de salida de valor constante de 0 v (LOW) o 0% de "duty cycle"; 255 es una señal de salida de valor constante de 5 v (HIGH) o 100% de "duty cycle"; . Para valores intermedios, el pin rápidamente alterna entre 0 y 5 voltios - el valor más alto, lo usual es que el pin esté en high (5 voltios).

La frecuencia de la señal PWM es constante y aproximádamente de 30769 Hz.

int speakerOut = 9; int volume = 300; // maximum volume is 1000 ¿? int PW=1915;

void loop() {

analogWrite(speakerOut, 0);

analogWrite(speakerOut,volume); delayMicroseconds(PW); analogWrite(speakerOut, 0); delayMicroseconds(PW); }