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

ComponenteUnidadesPrecio
Arduino Uno2
Placas de Inserción2
Altavoces27.99€
Módulo de tarjeta SD14.99€
Tarjeta SD1
Micrófono11€
Servomotores3
Botones2
Transistor1
Resistencias3
Cables de alimentación de batería21€
Pilas 9 voltios25€
Goma Eva, esponjas y alambres4.10€
Pintura acrílica satinada13.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.

Video Demostración

Documentación extra

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *