Diferencia entre revisiones de «Tone»
(Página creada con «== Descripción == La librería [https://github.com/bhagman/Tone#ugly-details Tone] de bhagman para producir una onda cuadrada de la frecuencia especificada en el rango aud...») |
(→Ejemplo 3) |
||
(No se muestran 18 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
== Descripción == | == Descripción == | ||
− | La librería [https://github.com/bhagman/Tone | + | La librería [https://github.com/bhagman/Tone 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. | Opcionalmente, se puede especificar una duración; de lo contrario, la onda continúa hasta que la funcion stop() sea invocada. | ||
Línea 6: | Línea 6: | ||
El pin se puede conectar a un zumbador piezoeléctrico u otro altavoz para reproducir tonos. | El pin se puede conectar a un zumbador piezoeléctrico u otro altavoz para reproducir tonos. | ||
− | {{Nota|Desde Arduino 18 esta incorporada una version simplificada.}} | + | {{Nota|Desde Arduino IDE 18 esta incorporada una version simplificada.}} |
== Placas aplicables == | == 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. | 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. | ||
− | {| class="wikitable" | + | {| class="wikitable col2cen" |
|+Arduino segun uC | |+Arduino segun uC | ||
|- | |- | ||
Línea 28: | Línea 28: | ||
<pre> | <pre> | ||
#include <Tone.h> | #include <Tone.h> | ||
− | Tone | + | Tone pito; |
</pre> | </pre> | ||
== Métodos == | == Métodos == | ||
+ | {| class="wikitable" | ||
+ | |+Métodos disponibles para librería Tone.h | ||
+ | |- | ||
+ | ! 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 == | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+Frecuencias posibles | ||
+ | |- | ||
+ | ! 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 == | == Comentarios == | ||
* Puedes usar un potenciómetro de 10k en serie con una resistencia de 1k para controlar el volumen del altavos (parlante). | * 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 | ||
+ | |||
+ | {| class="wikitable col1cen col2cen col3cen col4cen" | ||
+ | |+Rango de frecuencias depende de frecuencia de uC | ||
+ | |- | ||
+ | ! 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 == | == 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 | + | * 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 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()]]. | + | * Si asigna el Temporizador 0 afectara el uso [[analogWrite()|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. | ||
− | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
+ | #include <Tone.h> | ||
+ | Tone pito; | ||
+ | |||
+ | void setup(){ | ||
+ | pito.begin(13); | ||
+ | pito.play(NOTE_A4); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | //Nada | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 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. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | void setup() { | ||
+ | //Nada | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | int frecuencia = analogRead(A0); | ||
+ | int valor = map(frecuencia, 200, 900, 100, 1000); | ||
+ | tone(8, valor, 10); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 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. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | #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); | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revisión actual del 21:31 7 oct 2019
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