Tone
Contenido
Descripción
La librería Tone de Brett Hagman para producir una onda cuadrada de la frecuencia especificada en el rango audible, con un ciclo de trabajo del 50%, en cualquier pin de Arduino.
Opcionalmente, se puede especificar una duración; de lo contrario, la onda continúa hasta que la funcion stop() sea invocada.
El pin se puede conectar a un zumbador piezoeléctrico u otro altavoz para reproducir tonos.
Nota: Desde Arduino IDE 18 esta incorporada una version simplificada.
Placas aplicables
La cantidad de tonos que se pueden reproducir simultáneamente depende de la cantidad de temporizadores de hardware (con capacidad CTC) disponibles en el microcontrolador.
Ardujno | Cantidad | Temporizadores |
---|---|---|
ATmega 8 | 2 | 2 y 1 |
ATmega 168/328 | 3 | 2, 1 y 0 |
ATmega 1280 | 6 | 5, 4, 3, 2, 1 y 0 |
Nota: El orden de asignacion de temporizadores es el referido
Sintaxis
#include <Tone.h> Tone pito;
Métodos
Método | Descripción |
---|---|
begin(pin) | Prepara un pin para tocar un tono. |
isPlaying() | Devuelve true si el tono se esta reproducionedo. |
play(frecuencia [, duracion]) | Toca un tono de la frecuencia (Hz), por duracion de milisegundos. Si no pone duracion el tono se tocada indefinidamenre hasta stop(). |
stop() | Deja de tocar el tono. |
Nota: play() no bloque al Arduino independientemente de duracion.
Lista de frecuencias
Contante | Frecuencia (Hz) | Constante | Frecuencia (Hz) | Constante | Frecuencia (Hz) |
---|---|---|---|---|---|
NOTA_B0 | 31 | NOTA_A3 | 220 | NOTA_G6 | 1568 |
NOTA_C1 | 33 | NOTA_AS3 | 233 | NOTA_GS6 | 1661 |
NOTA_CS1 | 35 | NOTA_B3 | 247 | NOTA_A6 | 1760 |
NOTA_D1 | 37 | NOTA_C4 | 262 | NOTA_AS6 | 1865 |
NOTA_DS1 | 39 | NOTA_CS4 | 277 | NOTA_B6 | 1976 |
NOTA_E1 | 41 | NOTA_D4 | 294 | NOTA_C7 | 2093 |
NOTA_F1 | 44 | NOTA_DS4 | 311 | NOTA_CS7 | 2217 |
NOTA_FS1 | 46 | NOTA_E4 | 330 | NOTA_D7 | 2349 |
NOTA_G1 | 49 | NOTA_F4 | 349 | NOTA_DS7 | 2489 |
NOTA_GS1 | 52 | NOTA_FS4 | 370 | NOTA_E7 | 2637 |
NOTA_A1 | 55 | NOTA_G4 | 392 | NOTA_F7 | 2794 |
NOTA_AS1 | 58 | NOTA_GS4 | 415 | NOTA_FS7 | 2960 |
NOTA_B1 | 62 | NOTA_A4 | 440 | NOTA_G7 | 3136 |
NOTA_C2 | 65 | NOTA_AS4 | 466 | NOTA_GS7 | 3322 |
NOTA_CS2 | 69 | NOTA_B4 | 494 | NOTA_A7 | 3520 |
NOTA_D2 | 73 | NOTA_C5 | 523 | NOTA_AS7 | 3729 |
NOTA_DS2 | 78 | NOTA_CS5 | 554 | NOTA_B7 | 3951 |
NOTA_E2 | 82 | NOTA_D5 | 587 | NOTA_C8 | 4186 |
NOTA_F2 | 87 | NOTA_CS5 | 622 | NOTA_DS8 | 4435 |
NOTA_FS2 | 93 | NOTA_E5 | 659 | NOTA_D8 | 4699 |
NOTA_G2 | 98 | NOTA_F5 | 698 | NOTA_DS8 | 4978 |
NOTA_GS2 | 104 | NOTA_FS5 | 740 | ||
NOTA_A2 | 110 | NOTA_G5 | 784 | ||
NOTA_AS2 | 117 | NOTA_GS5 | 831 | ||
NOTA_B2 | 123 | NOTA_A5 | 880 | ||
NOTA_C3 | 131 | NOTA_AS5 | 932 | ||
NOTA_CS3 | 139 | NOTA_B5 | 988 | ||
NOTA_D3 | 147 | NOTA_C6 | 1047 | ||
NOTA_DS3 | 156 | NOTA_CS6 | 1109 | ||
NOTA_E3 | 165 | NOTA_D6 | 1175 | ||
NOTA_F3 | 175 | NOTA_DS6 | 1245 | ||
NOTA_FS3 | 185 | NOTA_E6 | 1319 | ||
NOTA_G3 | 196 | NOTA_F6 | 1397 | ||
NOTA_GS3 | 208 | NOTA_FS6 | 1480 |
Comentarios
- Puedes usar un potenciómetro de 10k en serie con una resistencia de 1k para controlar el volumen del altavos (parlante).
- El rango auditivo humano es de aprox 20 kHz
Reloj uC | Fmin con Temporizador 8 bits | Fmin Temporizador de 16 bits | Fmax |
---|---|---|---|
8 MHz | 16 Hz | 1 Hz | 4 MHz |
16 MHz | 31 Hz | 1 Hz | 8 MHz |
Advertencias
- Nunca conecte el pin Arduino directamente a una entrada de audio. El voltaje es considerablemente más alto que un voltaje de nivel de línea estándar y puede dañar las entradas de audio. Puede usar un divisor de tensión para adecuar la salida de Arduino a la entrada de audio.
- Si usa un altavoz (parlante) DEBE poner una resistencia de 1K en serie o dañada la salida del Arduino.
- Si asigna el Temporizador 0 afectara el uso PWM y millis().
- La librería solo acepta números enteros positivos unsigned int como frecuencias. Osea la frecuencia máxima sera 65 535 Hz.
Ejemplo 1
Toque una nota de 4° octava A (440 Hz) en el pin 13.
#include <Tone.h>
Tone pito;
void setup(){
pito.begin(13);
pito.play(NOTE_A4);
}
void loop(){
//Nada
}
Ejemplo 2
Escriba un boceto para leer una entrada analógica y asigne el resultado a un rango de 100 a 1000. Almacene el resultado en una variable local llamada frecuencia. Esta será la frecuencia que toque en el altavoz. Luego use el comando de tone() para configurar la frecuencia del altavoz en el pin digital 8 durante 10 ms.
void setup() {
//Nada
}
void loop() {
int frecuencia = analogRead(A0);
int valor = map(frecuencia, 200, 900, 100, 1000);
tone(8, valor, 10);
}
Ejemplo 3
En telefonía, el sistema de marcación por tonos o DTMF (Dual-Tone Multi-Frequency) es usado para la señalización de telecomunicaciones sobre líneas telefónicas analógicas en la banda de frecuencia vocal entre teléfonos u otros equipos de comunicaciones y la central telefónica.
#include <Tone.h>
Tone freq1;
Tone freq2;
const int DTMF_freq1[] = { 1336, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477 };
const int DTMF_freq2[] = { 941, 697, 697, 697, 770, 770, 770, 852, 852, 852 };
void setup(){
Serial.begin(9600);
freq1.begin(11);
freq2.begin(12);
}
void loop(){
uint8_t numero[] = {8, 6, 7, 5, 3, 0 , 9};
for (byte i=0; i<sizeof(numero); i++){
Serial.print(numero[i], 10);
playDTMF(numero[i], 500);
delay(600);
}
Serial.println();
delay(4000);
}
void playDTMF(uint8_t num, long duracion){
freq1.play(DTMF_freq1[num], duracion);
freq2.play(DTMF_freq2[num], duracion);
}
Vea también