- Materiales necesarios:
- Diagrama de circuito:
- Esquemas y explicación:
- Entendiendo el
- Tocando tonos de piano en Arduino:
- Programando el Arduino:
- ¡Juega, graba, reproduce y repite! :
Arduino ha sido una bendición para las personas que no tienen experiencia en electrónica para construir cosas fácilmente. Ha sido una gran herramienta de creación de prototipos o para probar algo genial, en este proyecto vamos a construir un piano pequeño pero divertido usando el Arduino. Este piano es bastante sencillo con solo 8 botones y timbre. Utiliza la función tone () de Arduino para crear varios tipos de notas de piano en el altavoz. Para darle un poco de sabor, hemos agregado la función de grabación en el proyecto, esto nos permite reproducir una melodía, grabarla y volver a reproducirla repetidamente cuando sea necesario. Suena interesante, ¿verdad? Así que vamos a construir…
Materiales necesarios:
- Arduino Uno
- Pantalla LCD 16 * 2
- Zumbador
- Recortadora 10k
- Interruptor SPDT
- Pulsador (8 Nos)
- Resistencias (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Tablero de circuitos
- Cables de conexión
Diagrama de circuito:
El Proyecto de Piano Arduino completo se puede construir sobre una placa con algunos cables de conexión. A continuación se muestra el diagrama de circuito realizado con fritzing que muestra la vista de tablero del proyecto.
Simplemente siga el diagrama del circuito y conecte los cables en consecuencia, los botones pulsadores y el zumbador como se usa con un módulo de PCB, pero en el hardware real hemos usado solo el interruptor y el zumbador, no debería confundirlo mucho porque tienen el mismo tipo de pin out. También puede consultar la siguiente imagen del hardware para realizar sus conexiones.
El valor de las resistencias de la izquierda está en el siguiente orden, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k y 10k. Si no tiene el mismo interruptor DPST, puede usar un interruptor de palanca normal como el que se muestra en el diagrama de circuito anterior. Ahora echemos un vistazo a los esquemas del proyecto para comprender por qué hemos realizado las siguientes conexiones.
Esquemas y explicación:
Los esquemas del diagrama de circuito que se muestra arriba se dan a continuación, también se hizo con Fritzing.
Una conexión principal que tenemos que entender es cómo hemos conectado los 8 pulsadores al Arduino a través del pin Analog A0. Básicamente, necesitamos 8 pines de entrada que se pueden conectar a los 8 botones de entrada, pero para proyectos como este no podemos usar 8 pines del microcontrolador solo para botones, ya que es posible que los necesitemos para un uso posterior. En nuestro caso, tenemos la pantalla LCD para interconectar.
Entonces usamos el pin analógico del Arduino y formamos un divisor de potencial con diferentes valores de resistencia para completar el circuito. De esta manera, cuando se presione cada botón, se suministrará un voltaje analógico diferente al pin analógico. A continuación se muestra un circuito de muestra con solo dos resistencias y dos botones.
En este caso, el pin ADC recibirá + 5V cuando no se presionen los botones, si se presiona el primer botón, el divisor de potencial se completa a través de la resistencia 560R y si se presiona el segundo botón, el divisor de potencial se compite con el 1.5. resistencia k. De esta manera, el voltaje recibido por el pin ADC variará según las fórmulas del divisor de potencial. Si desea saber más sobre cómo funciona el divisor de potencial y cómo calcular el valor de voltaje recibido por el pin ADC, puede usar esta página de calculadora de divisor de potencial.
Aparte de esto, todas las conexiones son directas, la pantalla LCD está conectada a los pines 8, 9, 10, 11 y 12. El zumbador está conectado al pin 7 y el interruptor SPDT está conectado al pin 6 de Arduino. El proyecto completo se alimenta a través del puerto USB de la computadora portátil. También puede conectar el Arduino a un suministro de 9 V o 12 V a través del conector de CC y el proyecto seguirá funcionando igual.
Entendiendo el
El Arduino tiene una práctica función de tono () que puede usarse para generar señales de frecuencia variable que pueden usarse para producir diferentes sonidos usando un zumbador. Entonces, entendamos cómo funciona la función y cómo se puede usar con Arduino.
Antes de eso, debemos saber cómo funciona un zumbador piezoeléctrico. Podríamos haber aprendido sobre los cristales piezoeléctricos en nuestra escuela, no es más que un cristal que convierte las vibraciones mecánicas en electricidad o viceversa. Aquí aplicamos una corriente variable (frecuencia) por la cual el cristal vibra produciendo sonido. Por lo tanto, para hacer que el zumbador piezoeléctrico haga algo de ruido, tenemos que hacer que el cristal piezoeléctrico vibre, el tono y el tono del ruido dependen de qué tan rápido vibre el cristal. Por tanto, el tono y el tono pueden controlarse variando la frecuencia de la corriente.
Bien, entonces, ¿cómo obtenemos una frecuencia variable de Arduino? Aquí es donde entra la función de tono (). El tono () puede generar una frecuencia particular en un pin específico. La duración del tiempo también se puede mencionar si es necesario. La sintaxis de tone () es
Sintaxis tono (pin, frecuencia) tono (pin, frecuencia, duración) Parámetros pin: el pin en el que generar el tono frecuencia: la frecuencia del tono en hercios - unsigned int duration: la duración del tono en milisegundos (opcional1) - largo sin firmar
Los valores de pin pueden ser cualquiera de su pin digital. He usado el pin número 8 aquí. La frecuencia que se puede generar depende del tamaño del temporizador en su placa Arduino. Para UNO y la mayoría de las otras placas comunes, la frecuencia mínima que se puede producir es 31Hz y la frecuencia máxima que se puede producir es 65535Hz. Sin embargo, los humanos solo podemos escuchar frecuencias entre 2000 Hz y 5000 Hz.
Tocando tonos de piano en Arduino:
De acuerdo, incluso antes de comenzar con este tema, déjeme aclarar que soy un novato con las notas musicales o el piano, así que por favor perdóneme si algo mencionado bajo este título es un galimatías.
Ahora sabemos que podemos usar la función de tonos en Arduino para producir algunos sonidos, pero ¿cómo podemos tocar tonos de una nota en particular usando la misma? Por suerte para nosotros, hay una biblioteca llamada "pitches.h" escrita por Brett Hagman. Esta biblioteca contiene toda la información sobre qué frecuencia es equivalente a qué nota en un piano. Me sorprendió lo bien que esta biblioteca podía funcionar y tocar casi todas las notas en un piano, usé la misma para tocar las notas de piano de Pirates of Caribbean, Crazy Frog, Mario e incluso Titanic y sonaban increíbles. ¡Ups! Nos estamos saliendo un poco del tema aquí, así que si estás interesado en eso, echa un vistazo a tocar melodías usando el proyecto Arduino. También encontrará más explicaciones sobre la biblioteca pitches.h en ese proyecto.
Nuestro proyecto tiene solo 8 botones, por lo que cada botón puede tocar solo una nota musical en particular y, por lo tanto, podemos tocar solo 8 notas. Seleccioné las notas más utilizadas en un piano, pero ¿puedes seleccionar 8 o incluso expandir el proyecto con más botones y agregar más notas?
Las notas seleccionadas en este proyecto son las notas C4, D4, E4, F4, G4, A4, B4 y C5 que se pueden tocar con los botones 1 a 8 respectivamente.
Programando el Arduino:
Basta de teoría, pasemos a la parte divertida de programar el Arduino. El Programa Arduino completo se proporciona al final de esta página; puede saltar hacia abajo si está ansioso o sigue leyendo para comprender cómo funciona el código.
En nuestro programa Arduino tenemos que leer el voltaje analógico del pin A0, luego predecir qué botón se presionó y reproducir el tono respectivo para ese botón. Mientras hacemos esto, también debemos registrar qué botón ha presionado el usuario y cuánto tiempo lo ha presionado, para que podamos recrear el tono que fue reproducido por el usuario más tarde.
Antes de pasar a la parte lógica, tenemos que declarar qué 8 notas tocaremos. La frecuencia respectiva para las notas se toma de la biblioteca pitches.h y luego se forma una matriz como se muestra a continuación. Aquí la frecuencia para tocar la nota C4 es 262 y así sucesivamente.
int notes = {262, 294, 330, 349, 392, 440, 494, 523}; // Establecer la frecuencia para C4, D4, E4, F4, G4, A4, B4,
A continuación, debemos mencionar a qué pines está conectada la pantalla LCD. Si está siguiendo exactamente los mismos esquemas dados anteriormente, no tiene que cambiar nada aquí.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pines a los que se conecta el LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
A continuación, dentro de nuestra función de configuración , simplemente inicializamos el módulo LCD y el monitor en serie para la depuración. También mostramos un mensaje de introducción solo para asegurarnos de que todo funcione según lo planeado. A continuación , dentro de la función de bucle principal tenemos dos bucles while.
Se ejecutará un bucle while siempre que el interruptor SPDT se coloque en la grabación más. En modo grabación el usuario puede pagar los tonos requeridos y al mismo tiempo también se guardará el tono que se está reproduciendo. Entonces, el ciclo while se ve así a continuación
while (digitalRead (6) == 0) // Si el interruptor de palanca está en modo de grabación {lcd.setCursor (0, 0); lcd.print ("Grabando…"); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Como habrás notado , tenemos dos funciones dentro del ciclo while. La primera función Detect_button () se usa para encontrar qué botón ha presionado el usuario y la segunda función Play_tone () se usa para reproducir el tono respectivo. Aparte de esta función, la función Detect_button () también registra qué botón se está presionando y la función Play_tone () registra cuánto tiempo se presionó el botón.
Dentro de la Detect_button () la función se lee el voltaje analógico del pin A0 y lo comparamos con algunos valores predefinidos para averiguar qué botón ha sido presionado. El valor se puede determinar usando la calculadora del divisor de voltaje anterior o usando el monitor en serie para verificar qué valor analógico se lee para cada botón.
void Detect_button () { analogVal = analogRead (A0); // lee la etiqueta de voltaje analógica en el pin A0 pev_button = button; // recuerda el botón anterior presionado por el usuario if (analogVal <550) button = 8; si botón (analogVal <500) = 7; si el botón (analogVal <450) = 6; si el botón (analogVal <400) = 5; si el botón (analogVal <300) = 4; si el botón (analogVal <250) = 3; si el botón (analogVal <150) = 2; si el botón (analogVal <100) = 1; if (analogVal> 1000) button = 0; / **** Rcord los botones presionados en una matriz *** / if (button! = pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; botón_registrado = 0; button_index ++; } / ** Fin del programa de grabación ** / }
Como se dijo, dentro de esta función también registramos la secuencia en la que se presionan los botones. Los valores registrados se almacenan en una matriz denominada botón_registrado. Primero verificamos si hay un nuevo botón presionado, si lo presionamos, también verificamos si no es el botón 0. Donde el botón 0 es nada pero no se presiona ningún botón. Dentro del bucle if almacenamos el valor en la ubicación del índice dada por la variable button_index y luego también aumentamos este valor de índice para que no sobrescribamos en la misma ubicación.
/ **** Rcord los botones presionados en una matriz *** / if (button! = Pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; botón_registrado = 0; button_index ++; } / ** Fin del programa de grabación ** /
Dentro de la Play_tone () la función vamos a reproducir el tono correspondiente a la tecla pulsada mediante el uso de múltiples si las condiciones. También usaremos un arreglo llamado record_time dentro del cual guardaremos el tiempo durante el cual se presionó el botón. La operación es similar a la grabación de la secuencia de botones, usamos la función millis () para determinar cuánto tiempo se presionó cada botón, también para reducir el tamaño de la variable dividimos el valor entre 10. Para el botón 0, lo que significa que el usuario no está presionando cualquier cosa, no tocamos ningún tono durante la misma duración. El código completo dentro de la función se muestra a continuación.
void Play_tone () { / **** Rcord el tiempo de retraso entre cada pulsación de botón en una matriz *** / if (button! = pev_button) { lcd.clear (); // Luego límpialo note_time = (millis () - start_time) / 10; record_time = note_time; time_index ++; hora_inicio = millis (); } / ** Fin del programa de grabación ** / if (botón == 0) { noTone (7); lcd.print ("0 -> Pausa…"); } if (botón == 1) { tono (7, notas); lcd.print ("1 -> NOTA_C4"); } if (botón == 2) { tono (7, notas); lcd.print ("2 -> NOTE_D4"); } si (botón == 3) { tono (7, notas); lcd.print ("3 -> NOTE_E4"); } if (botón == 4) { tono (7, notas); lcd.print ("4 -> NOTE_F4"); } if (botón == 5) { tono (7, notas); lcd.print ("5 -> NOTE_G4"); } if (botón == 6) { tono (7, notas); lcd.print ("6 -> NOTE_A4"); } if (botón == 7) { tono (7, notas); lcd.print ("7 -> NOTA_B4"); } if (botón == 8) { tono (7, notas); lcd.print ("8 -> NOTA_C5"); } }
Finalmente, después de grabar, el usuario debe cambiar el DPST a la otra dirección para reproducir el tono grabado. Cuando se hace esto, el programa rompe el ciclo while anterior y entra en el segundo ciclo while donde tocamos las notas en la secuencia de los botones presionados por una duración que fue previamente grabada. El código para hacer lo mismo se muestra a continuación.
while (digitalRead (6) == 1) // Si el interruptor de palanca está en modo de reproducción { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Reproducción en curso…"); for (int i = 0; i <sizeof (botón_grabado) / 2; i ++) { retardo ((tiempo_grabado) * 10); // Espere antes de pagar la siguiente melodía if ( botón_registrado == 0) noTone (7); // el usuario no ha tocado ningún otro botón tono (7, notas - 1)]); // reproduce el sonido correspondiente al botón tocado por el usuario } } }
¡Juega, graba, reproduce y repite!:
Haga el hardware según el diagrama de circuito que se muestra y cargue el código en la placa Arduino y su tiempo mostrado. Coloque el SPDT en el modo de grabación y comience a reproducir los tonos de su elección, presionando cada botón producirá un tono diferente. Durante este modo, la pantalla LCD mostrará " Grabando…" y en la segunda línea verá el nombre de la nota que se está presionando actualmente como se muestra a continuación.
Una vez que haya tocado su tono, mueva el interruptor SPDT al otro lado y la pantalla LCD debería mostrar " Now Playing…" y luego comience a reproducir el tono que acaba de tocar. El mismo tono se reproducirá una y otra vez siempre que el interruptor de palanca se mantenga en la posición que se muestra en la imagen de abajo.
El funcionamiento completo del proyecto se puede encontrar en el video que se muestra a continuación. Espero que haya entendido el proyecto y haya disfrutado construyéndolo. Si tiene algún problema para crear este, publíquelo en la sección de comentarios o utilice los foros para obtener ayuda técnica sobre su proyecto. Además, no olvide consultar el video de demostración que se muestra a continuación.