Diferencia entre revisiones de «Tone»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo 1)
(Ejemplo 2)
Línea 162: Línea 162:
  
 
== Ejemplo 2 ==
 
== Ejemplo 2 ==
Escriba un boceto para leer la 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.
+
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++">
 
<syntaxhighlight lang="c++">
 
void setup() {
 
void setup() {
    //Nada
+
  //Nada
}
+
}
 
   
 
   
void loop() {
+
void loop() {
   int valor = analogRead(A0);
+
   int frecuencia = analogRead(A0);
   valor = map(valor, 200, 900, 100, 1000);
+
   int valor = map(frecuencia, 200, 900, 100, 1000);
 
   tone(8, valor, 10);
 
   tone(8, valor, 10);
}
+
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Revisión del 21:29 7 oct 2019

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.

Arduino segun uC
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é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

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

  • 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
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

  • 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 number, long duracion){
   freq1.play(DTMF_freq1[number], duracion);
   freq2.play(DTMF_freq2[number], duracion);
}

Vea también


Referencias externas