Lectura analógica y generación de tono variable - jorgerivera/ULCR-BINGE61 GitHub Wiki
Esta práctica cumple con las siguientes
especificaciones:
Se lee el valor de un potenciómetro utilizando el
convertidor Analógico a Digital y se reproduce un
tono con una frecuencia que sea proporcional al
valor leído.
- 1 Arduino
- 1 Protoboard
- 1 Buzzer
- 1 Potenciómetro
- 1 LED
- 1 Resistencia 330 ohms
1. Sin máquina de estados:
Se declaran las variables y pines a usar.
Se asignan como entradas o salidas.
int led = 13; // Pin del Led
int buzzer=8; // Pin del buzzer
int pot=A1; // Pin de potenciómetro
int duracion=250; // Tiempo del tono en ms
void setup() {
pinMode(led, OUTPUT); // Pin 13 salida digital
pinMode(buzzer,OUTPUT); // Pin 8 salida digital
pinMode(pot,INPUT); // Pin A1 entrada analógica
}
Se tiene como adicional el parpadeo de un LED.
void loop() {
digitalWrite(led, HIGH); // Enciende el Led
delay(500); // Pausa de 500 ms
digitalWrite(led, LOW); // Apaga el Led
delay(500);
En la variable tono almacenamos el valor leído
del potenciómetro, hacemos un escalado de
la frecuencia por medio de la función MAP ( ),
seguidamente con la función TONE ( ) se reproduce
el sonido y se le agrega un DELAY para que el
tono no vaya tan rápido y se escuche más limpio.
int tono=analogRead(pot);
// Variable donde se almacena el valor del pot
int frecuencia= map(tono,0,1023,100,5000);
//escalado de la frecuencia de 100 a 5000Hz
//Función tone() que recibe:
// 1ra posición: Pin del elemento sonoro
// 2da posición: Frecuencia en Hz
// 3ra posición: Duración del tono
tone(buzzer, frecuencia, duración);
delay(200); // se agrega para que no vaya
tan rápido y quede mas limpio
}
2. Con máquina de estados:
Se declaran las variables y pines a usar.
Se asignan como entradas o salidas.
int buzzer=8; // Pin del buzzer
int pot=A1; // Pin de potenciómetro
int LED = 13; // Pin del Led
int estado; // Variable estado
int tono; // Variable tono
int duracion=250; // Tiempo del tono en ms
unsigned long ultimoCambio; // Variable sin signo
void setup() {
pinMode(buzzer,OUTPUT);
pinMode(pot,INPUT);
pinMode(LED, OUTPUT);
estado=1;
}
Dentro del void loop ( ), hay dos acciones que se
van a llevar a cabo, una será el parpadeo del Led y
otra el ADC + Tone. Nombrados respectivamente
maqLed y maqProceso.
void loop () {
maqLed(); // Máquina de estado del Led
maqProceso(); // Máquina de estados del ADC + Tone
}
En el maqLed se divide en 4 estados, en el primer
caso si el Led está en alto pasa al estado 2 y la
función millis ( ) almacenado en el último cambio,
va a llevar la cuenta de los milisegundos que han
transcurrido desde que el programa comenzó. En el
segundo caso se hace una comparación del tiempo
actual es mayor o igual al último cambio más 500
milisegundos y se pasa al estado 3. Para el tercer
caso hace el mismo proceso del primer caso con la
diferencia que en este va a estar en bajo y pasa al
estado 4. Para el último caso repite el caso 2 con
la diferencia que pasa al estado 1.
void maqLed(){
switch (estado) {
case 1:
digitalWrite (LED, HIGH);
estado = 2;
ultimoCambio = millis ();
break;
case 2:
if (millis() >= ultimoCambio + 500) {
estado = 3;
}
break;
case 3:
digitalWrite (LED, LOW);
estado = 4;
ultimoCambio = millis();
break;
case 4:
if (millis() >= ultimoCambio + 500) {
estado = 1;
}
break;
}
}
En el maqProceso se divide en 4 estados y en
cada caso se aplica un intervalo de frecuencias
con respecto a la lectura del potenciómetro, si se
cumplen estos intervalos pasará al próximo estado
sino se quedará en el mismo, y por ende cada
estado tiene un diferente tono a reproducir.
void maqProceso(){
switch (estado) {
case 1:
tono = analogRead (pot);
if (tono >= 100) {
estado=2;
}
else if (tono < 100){
estado=1;
}
break;
case 2:
tono = analogRead (pot);
if (tono >= 1225) {
estado=3;
}
else if ( 100 < tono > 1225 ){
estado=2;
}
tone(8,tono, duracion);
break;
case 3:
tono = analogRead (pot);
if (tono >= 2450) {
estado=4;
}
else if ( 1225 < tono > 2450 ){
estado=3;
}
tone(8,tono, duracion);
break;
case 4:
tono = analogRead (pot);
if (tono >= 3675) {
estado=1;
}
else if ( 2450 < tono > 3675 ){
estado=4;
}
tone(8, tono, duracion);
break;
}
}
