Tabla de contenido:
- Paso 1: Definición de direcciones de registro
- Paso 2: matrices y variables globales
- Paso 3: la función "serial.begin"
- Paso 4: La función "serial.available"
- Paso 5: la función "serial.read"
- Paso 6: la función "serial.write"
- Paso 7: la función de configuración
- Paso 8: Funciones de lazo e ISR
- Paso 9: cableado
- Paso 10: ¡Poniéndolo todo junto
Video: Generador de tonos Arduino sin biblioteca o funciones en serie (con interrupciones): 10 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:43
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
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
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"
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"
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"
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"
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
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
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
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:
Generador de funciones de bricolaje con STC MCU fácilmente: 7 pasos (con imágenes)
Generador de funciones de bricolaje con STC MCU fácilmente: este es un generador de funciones hecho con STC MCU. Solo necesita varios componentes y el circuito es simple. Salida de especificación: Frecuencia de forma de onda cuadrada de un solo canal: 1Hz ~ 2MHz Frecuencia de forma de onda sinusoidal: 1Hz ~ 10kHz Amplitud: VCC, aproximadamente 5V Capacidad de carga
Un generador de tonos simple: 7 pasos (con imágenes)
Un generador de tonos simple: Arduino Tone Generator es un conjunto de interruptores que comparten un terminal común a GND, mientras que los pines restantes están conectados a 2, 3, 4, 5, 6, 7, 8 y 9 pines digitales Arduino y con un altavoz también instalado entre GND y el pin digital 11 de Arduino Uno
Generador de tonos "Jimikky Kammal" con Arduino Pro Mini: 5 pasos
Generador de tonos "Jimikky Kammal" con Arduino Pro Mini: este es un proyecto de generador de tonos simple que usa Arduino Pro Mini. Una parte de la canción de gran éxito " Jimikky Kammal " de la película " Velipadinte Pusthakam " se desarrolla en monotónico. Las notas musicales ocurren en la naturaleza como sinuso suave y ondulante
Realización de imágenes sin interrupciones solo horizontal o verticalmente (para "The GIMP").: 11 pasos (con imágenes)
Hacer que las imágenes sean transparentes solo horizontal o verticalmente (para "The GIMP"): Si prueba el complemento "Make seamless" en GIMP, hará que la imagen sea perfecta tanto horizontal como verticalmente al mismo tiempo. No le permitirá hacerlo perfecto en una sola dimensión. Este instructivo te ayudará a hacer ima
Enfriador / soporte para computadora portátil de costo cero (sin pegamento, sin perforaciones, sin tuercas y pernos, sin tornillos): 3 pasos
Enfriador / soporte para computadora portátil de costo cero (sin pegamento, sin perforaciones, sin tuercas y pernos, sin tornillos): ACTUALIZACIÓN: POR FAVOR AMABLE VOTE POR MI INSTRUCTABLE, GRACIAS ^ _ ^ TAMBIÉN PUEDE VOTAR POR MI OTRO CONCURSO ENTRADA EN www.instructables.com/id/Zero-Cost-Aluminum-Furnace-No-Propane-No-Glue-/ O QUIZÁS VOTE POR MI MEJOR AMIGO