Tabla de contenido:

Generador de tonos Arduino sin biblioteca o funciones en serie (con interrupciones): 10 pasos
Generador de tonos Arduino sin biblioteca o funciones en serie (con interrupciones): 10 pasos

Video: Generador de tonos Arduino sin biblioteca o funciones en serie (con interrupciones): 10 pasos

Video: Generador de tonos Arduino sin biblioteca o funciones en serie (con interrupciones): 10 pasos
Video: UART 🔥SIN ARDUINO🔥 ATMEGA328P - Transmisión, recepción e interrupciones 2024, Noviembre
Anonim
Generador de tonos Arduino sin biblioteca o funciones en serie (con interrupciones)
Generador de tonos Arduino sin biblioteca o funciones en serie (con interrupciones)

Esto no es algo en lo que normalmente haría un instructivo, prefiero mi trabajo en metal, pero como soy un estudiante de ingeniería eléctrica y tengo que tomar una clase sobre microcontroladores (Diseño de sistemas integrados), pensé en hacer un instructivo en uno de mis proyectos. Cuando originalmente hice el proyecto y otros para esta clase, descubrí que hay muy pocos o ningún tutorial que no use las funciones de la biblioteca arduino o las funciones seriales, que es otra razón por la que pensé que este sería un buen instructable.

Este código está diseñado para el microcontrolador Atmega 2560, por lo que si desea implementarlo en otra placa, deberá cambiar los registros de dirección en el código según el manual de usuario de su controlador. La idea básica detrás del código es que cada vez que ingresa una tecla en el teclado en el monitor en serie, el arduino mega generará una cierta frecuencia en función de la tecla que presione, con "q" restableciéndola. Lo hice de modo que "a" emitirá la frecuencia A plana y "A" emitirá la frecuencia A aguda, "b" emitirá B bemol, "c" para Do bemol, "C" para Do sostenido, y así sucesivamente. El código completo se carga al final, pero cada paso dividirá el código en partes para que sea más fácil de explicar.

Paso 1: Definición de direcciones de registro

Definición de direcciones de registro
Definición de direcciones de registro

Este paso es fácil, si está usando el atmega 2560, solo necesita usar las direcciones que usé, aunque si usa una placa con un chip diferente, necesitará encontrar las direcciones para cada uno de estos registros en su manual de usuario de chips. Las definiciones en la parte superior son solo constantes que se usarán para nuestras funciones más adelante. Especificamos las direcciones como volátiles sin firmar porque no queremos que el compilador se meta con ellas.

Paso 2: matrices y variables globales

Matrices y variables globales
Matrices y variables globales
Matrices y variables globales
Matrices y variables globales
Matrices y variables globales
Matrices y variables globales

Aquí queremos definir la matriz de frecuencia que contendrá todas las frecuencias que debe generar cada tecla. Estos valores se calculan a partir de las frecuencias reales de las notas y, honestamente, olvidé cómo los obtuve, pero son los valores correctos cuando los probé en un osciloscopio para asegurarme. También estamos definiendo la matriz de notas que contiene todas las teclas para presionar para cada tono, así como las variables que necesitaremos para nuestras funciones posteriores.

Paso 3: la función "serial.begin"

los
los

Llamaremos a nuestra función personalizada que replica la función "serial.begin" U0init (). Toma la velocidad en baudios deseada como entrada e inicia el puerto serie a esa velocidad en baudios.

Paso 4: La función "serial.available"

los
los

Llamaremos a la función que imita "serial.available" U0kbhit (). No toma entrada, sino que detecta si hay un cambio realizado en el teclado usando el bit de estado RDA y devuelve verdadero cuando se detecta un cambio.

Paso 5: la función "serial.read"

los
los

Llamaremos a la función que imita la función "serial.read" U0getchar (), que no toma ninguna entrada y genera cualquier cambio que se haga en el teclado, que se almacena en el registro UDR0.

Paso 6: la función "serial.write"

los
los

Llamaremos a la función que imita "serial.write" U0putchar (), que toma los datos del registro UDR0 mientras se detecta y almacena un cambio, y devuelve ese cambio al monitor en serie.

Paso 7: la función de configuración

La función de configuración
La función de configuración

Esta es la función de configuración básica que usará nuestra imitación "serial.begin" para inicializar el puerto serial, e inicializará nuestra configuración de bits para los registros del temporizador y configurará PB6 para emitir nuestros tonos.

Paso 8: Funciones de lazo e ISR

Las funciones Loop e ISR
Las funciones Loop e ISR

El bucle funciona así: si se detecta un cambio con nuestra función "serial.available", nuestra función "serial.read" almacena ese cambio, y nuestra función "serial.write" coloca ese cambio en el monitor serial. Siempre que una variable i sea menor que el tamaño de la matriz de frecuencias, establecerá la salida para que sea la posición de i en esa matriz, dando salida a la frecuencia en esa posición. El ISR funciona como reinicio, donde si la posición de la matriz de frecuencia no es igual a 0 (en otras palabras, si no se presiona "q"), emitirá la frecuencia, pero cuando se presione "q" se reiniciará. este código usa interrupciones, pero se puede hacer con las interrupciones deshabilitadas. Publicaré el código sin interrupciones si recibo alguna solicitud, solo creo que la versión de interrupción es más divertida.

Paso 9: cableado

Alambrado
Alambrado

El cableado para este código es extremadamente fácil, simplemente coloque un cable de salida de PB6 a una placa de prueba, conecte un zumbador o altavoz en serie con eso y conéctelo de nuevo a tierra. Nota: si usa un altavoz, coloque una pequeña resistencia antes del altavoz. Si solo desea ver la salida pero no escucharla, simplemente conecte PB6 al cable rojo de un osciloscopio y el cable negro a tierra.

Paso 10: ¡Poniéndolo todo junto

Agregué el código completo a este paso, ya que expliqué todas sus partes en pasos anteriores. Solo necesita una entrada de teclado para diferentes frecuencias y envía esa frecuencia a PB6. ¡Espero que hayas disfrutado leyendo una forma diferente de codificar con el IDE!

Además, vote por esto en el concurso de microcontroladores: D

Recomendado: