ALBANTA LA PEZ QUE CANTA
MAQUETA DE PEZ QUE SINCRONIZA SONIDO Y MOVIMIENTO
Este proyecto ha sido realizado por el grupo 05 compuesto por Chris Andaya Bernales, Lucía Fresno Olmeda y Edson Víctor Fernández Espinoza del Grado Doble de Ingeniería de Computadores y Diseño y Desarrollo de Videojuegos.
El objetivo de este proyecto consiste en construir una maqueta de un pez que se mueve a ritmo de la música que esté sonando. Esta maqueta puede realizar movimiento en tres puntos distintos: la cabeza del pez, que se mueve hacia el espectador y vuelve a su posición inicial; la cola, que realiza el mismo movimiento; y la boca, que se mueve de arriba a abajo para dar la sensación de que el pez estuviera cantando.
La idea de este proyecto ha surgido de los famosos vídeos de Big Mouth Billy Bass, aunque la estética es ligeramente distinta: la maqueta simula un pez payaso y las canciones no son las que suelen aparecer en estos vídeos.
Aquí se puede ver un vídeo de ejemplo para que se pueda visualizar más claramente la idea del proyecto:
Materiales Utilizados
Componente | Unidades | Precio |
Arduino Uno | 2 | – |
Placas de Inserción | 2 | – |
Altavoces | 2 | 7.99€ |
Módulo de tarjeta SD | 1 | 4.99€ |
Tarjeta SD | 1 | – |
Micrófono | 1 | 1€ |
Servomotores | 3 | – |
Botones | 2 | – |
Transistor | 1 | – |
Resistencias | 3 | – |
Cables de alimentación de batería | 2 | 1€ |
Pilas 9 voltios | 2 | 5€ |
Goma Eva, esponjas y alambres | – | 4.10€ |
Pintura acrílica satinada | 1 | 3.80€ |
Esquema del circuito
Para este proyecto hemos utilizado dos placas Arduino Uno con dos circuitos distintos: uno que se encargará de la reproducción de la música y otra que se ocupará de mover los servomotores y configurar el sensor de sonido.
En el primero se ha utilizado un lector SD que permitía reproducir archivos tipo WAV en los altavoces a través de una tarjeta SD. Dentro de las conexiones también destacan los botones que servirán para el control de la música(pausa y pasar a la siguiente canción).
Es importante tener en cuenta de este circuito el cable que sale del pin 6 y no está conectado a nada. La razón de esto es que este mismo estará conectado también a la placa Arduino del circuito realizado para el movimiento, de forma que se pueda coordinar el inicio y la pausa de este último con el de la música.
En este circuito se han conectado los tres servomotores con sus respectivas conexiones además del sensor de sonido. Por otro lado se ve como llega un cable con una conexión al pin 6 de la placa. Este es el que viene del otro arduino el cual hace que se sincronice el control de la música con el control de movimiento. Así si la música se detiene, también lo harán los servos.
Código
Código de los altavoces
#include <SD.h> // Se incluye la libreria SD
#include <SPI.h> // Se incluye la libreria para la comunicacion SPI
#include <TMRpcm.h> // Se incluye la libreria para reproducir .WAV
#define SD_ChipSelectPin 4 // Selecciona la tarjeta SD. Puede ser
//cualquier pin que NO se esté utilizando ya.
TMRpcm Audio; // Se crea un objeto para usar las funciones de la //libreria TMRpcm
bool boton_A = 0; //Variable que guarda el estado del pulsador de //cambiar de cancion
bool boton_B = 0; //Variable que guarda el estado del pulsador de //pausar
int song = 0; //Se inician en 0 para que cuando se incremente la //cancion al principio se reproduzca la cancion 1
int last_song = 0; //Almacena el número de la ultima cancion
/* CONEXIONES DEL MÓDULO DE LA TARJETA SD
Arduino Nano/Arduino UNO
12 -------------------> MISO
11 -------------------->MOSI
13 -------------------->SCK
4 ---------------------->CS
9 ---------------------->Speaker
GND ------------------>GND
5V ------------------> VCC
*/
void setup() {
Serial.begin(9600); //Se inicializa el puerto serie
Serial.println("Inicializando");
Audio.speakerPin = 9; //Selecciona la salida de audio: pin 9
Audio.quality(1); // Mejoramos la calidad de sonido (puede ser 0 o 1)
Audio.setVolume(5); // Se selecciona el volumen: valor entre 0 y 7
//Inicialización de la SD
if (!SD.begin(SD_ChipSelectPin)) { // Comprueba si la tarjeta SD se ha inicializado correctamente
Serial.println("Fallo de la tarjeta SD, revisa las conexiones papu :v");
return; // Si la tarjeta SD falla, el programa termina
} else {
Serial.println("SD inicializada correctamente!");
}
pinMode(3, INPUT); // Declara el boton de pasar de cancion como entrada
pinMode(2, INPUT); // Declara el boton de pausar la cancion
pinMode(6, OUTPUT); //Declara el pin 6 como salida, para poder pasar la señal al otro Arduino Uno y coordinar las acciones de los botones con el movimiento
// De esta forma nos aseguramos de que el pez no se mueve si no está sonando ninguna canción
}
void loop() {
boton_A = digitalRead(3); //Se lee el boton de pasar de cancion
boton_B = digitalRead(2); //Se lee el boton de pausa
if (boton_A == 1) { // Si pulsas el pulsador se incrementa la cancion a reproducir
if (song <= 1)
song++; // Se incrementa la cancion a reproducir
else
song = 1; // Si se ha llegado a la ultima cancion, vuelve a la cancion numero 1
while (boton_A == 1) {
boton_A = digitalRead(3); //Espera a que levantes el dedo del pulsador para continuar
}
}
if (boton_B == 1) {
digitalWrite(6, LOW);
Audio.pause(); //Pausa la cancion que está sonando
Serial.println("Cancion pausada o renaudada");
while (boton_B == 1) {
boton_B = digitalRead(2); //Espera a que levantes el dedo del pulsador para continuar
}
}
if (song != last_song) { //Reproduce el audio una unica vez siempre que se haya cambiado de cancion
switch (song)
{
case 1:
digitalWrite(6, HIGH); // Se envía una señal HIGH para que los servos conectados a la otra placa sepan que se tienen que mover
Audio.play((char*)"barbie.wav");
Audio.loop(1);
while (!Audio.isPlaying()) {
digitalWrite(6, LOW); // Cuando se para el audio los servos deben pararse también
}
Serial.println("Cancion 1");
break;
case 2:
digitalWrite(6, HIGH);
Audio.loop(1);
Audio.play((char*)"sirenita.wav");
while (!Audio.isPlaying()) {
digitalWrite(6, LOW);
}
Serial.println("Cancion 2");
break;
}
last_song = song;
}
Código servomotores y sensor de sonido
#include <Servo.h>
Servo boca, cola, cabeza;
int pinMicro = 7;
int micState;
int estadoCabeza = 0;
int estadoCola = 0;
unsigned long tAntCabeza = millis();
unsigned long tAntCola = millis();
long tCola = 1000;
long tCabeza = 3000;
bool boton = 0; //Variable que guarda el estado del pulsador de cambiar de cancion
void setup() {
//Inicializamos el puerto serie
Serial.begin(9600);
//Pinneamos el micrófono como entrada
pinMode(pinMicro, INPUT);
//Attach los servos con sus pines
cola.attach(2);
cabeza.attach(4);
boca.attach(3);
//Inicializamos su posición inicial
cola.write(0);
cabeza.write(0);
boca.write(70);
//Partimos del sensor apagado
digitalWrite(pinMicro, LOW);
//botones
pinMode(10, INPUT); // Declara el pin que recibe la señal del boton para saber si los servos se deben mover o no
}
void loop() {
boton = digitalRead(10); //Se lee la señal del boton de entrada
while (boton == HIGH) { //El movimiento ocurre siempre que la señal que se reciba del botón sea HIGH
unsigned long currentTime = millis();
micState = digitalRead(pinMicro);
//El estado del servo de la boca cambia según la señal que reciba del micrófono
if (micState == HIGH) {
boca.write(0);
} else {
boca.write(70);
}
//El movimiento de la cola y la cabeza ocurre cada cierto tiempo. El tiempo que ha pasado entre un el momento actual t el último movimiento se mide con la operación
//currentTime - tAnt: si este tiempo es mayor al establecido para que ocurra el movimiento, el servo se mueve y la variable tAnt se actualiza
if (currentTime - tAntCabeza > tCabeza) {
tAntCabeza = currentTime;
if (estadoCabeza == 0) {
cabeza.write(180);
estadoCabeza = 1;
}
else if (estadoCabeza == 1) {
cabeza.write(0);
estadoCabeza = 0;
}
}
if (currentTime - tAntCola > tCola) {
tAntCola = currentTime;
if (estadoCola == 0) {
cola.write(50);
estadoCola = 1;
} else if (estadoCola == 1) {
cola.write(0);
estadoCola = 0;
}
}
boton = digitalRead(10);
}
Serial.println(pinMicro, DEC);
Montaje de la maqueta
Para el montaje del proyecto, empezamos primero con el diseño y el tamaño del pez para ver donde colocaríamos los servos.
Después hicimos la maqueta del pez con goma eva separándola en las tres partes movibles que tiene el diseño.
Por último, pintamos la parte exterior del pez, rellenamos el interior con esponja y utilizamos palos enganchados a los servos para poder movilizar las distintas partes del pez.