Lectura analógica y generación de tono variable - jorgerivera/ULCR-BINGE61 GitHub Wiki

Universidad Latina de Costa Rica

Bachillerato en Ingeniería Electrónica

Microcontroladores


Jennifer Vargas Badilla

Leonardo Herrera Montoya


Lectura analógica y generación de tono variable.

I. DESCRIPCIÓN DEL CIRCUITO

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.

II. LISTADO DE MATERIALES

  1. 1 Arduino
  2. 1 Protoboard
  3. 1 Buzzer
  4. 1 Potenciómetro
  5. 1 LED
  6. 1 Resistencia 330 ohms

III. ESQUEMÁTICO DEL CIRCUITO

IV. DESCRIPCIÓN DEL PROGRAMA

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;

}

}

⚠️ **GitHub.com Fallback** ⚠️