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 musical | Frecuencia-tono | Periodo (us) | PW (us) |
| c | 261 Hz | 3830 | 1915 |
| d | 294 Hz | 3400 | 1700 |
| e | 329 Hz | 3038 | 1519 |
| f | 349 Hz | 2864 | 1432 |
| g | 392 Hz | 2550 | 1275 |
| a | 440 Hz | 2272 | 1136 |
| b | 493 Hz | 2028 | 1014 |
| C | 523 Hz | 1912 | 956 |
(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);
}