Proyecto 46 

Scary Pumpkin

16 de febrero de 2020

Hace años que me rondaba la idea de hacer algo con Arduino para la noche de Halloween, pero por unas cosa u otras lo iba dejando de lado. Hasta que por casualidad dí con el canal de Electronoobs, un chico que hace cosas la mar de interesantes y que si no seguís, estáis tardando en hacerlo. 

En uno de sus proyectos enseña cómo hacer una calabaza impresa en 3d para Halloween. Pues bien, con algunas modificaciones y basándonos en el proyecto original del amigo Andrei veremos como hacer una calabaza tenebrosa para asustar a los amigos la noche de Halloween.

A grandes rasgos el proyecto consiste en una calabaza impresa en 3D, un sensor de movimientos, un reproductor de MP3 y unos ledes RGB, todo controlado con Arduino. Cuando el sensor detecta movimiento, manda una señal al Arduino y éste ejecuta una serie de efectos luminosos a la vez que el reproductor MP3 reproduce pistas grabadas con sonidos terroríficos.

Os recomiendo que echéis un vistazo al vídeo que enlazo más arriba. Si ya lo habéis visto, las principales diferencias respecto del proyecto original son varias. Por un lado la calabaza que voy a utilizar la he sacado de Thingiverse porque me parece más fácil de imprimir, además voy a omitir la parte del humidificador para simplificar el proyecto.

Como se aprecia en la foto, la calabaza original es muy pequeña para nuestro propósito, así que antes de imprimirla hay que redimensionarla en todas direcciones en un 200% aproximadamente.

Otra diferencia es que voy a utilizar ledes RGB convencionales, en lugar de los ledes direccionables del proyecto original. Así aprovecho una tira de ledes RGB de 5V que tengo por casa.

Tira de ledes RGB de 5V.

Sin más preámbulos, vamos al lío. 

1. Imprime la calabaza.

Imprime la que más te guste y si no tienes impresora 3D puedes comprar una calabaza en un bazar. Recuerda que debe ser lo suficientemente grande como para que quepa dentro toda la electrónica que lleva el proyecto.

Como dije más arriba, he impreso una calabaza que encontré en thingiverse pero escalada un 170% y aún así me quedé un poco justo de espacio, por eso recomiendo doblar el tamaño original.

La falta de espacio de debe a que quiero que la calabaza sea autónoma y poder colocarla en cualquier sitio sin depender de un enchufe y para ello voy a utilizar dos baterías -del tipo 18650- para alimentar la electrónica.

Al final, aunque la electrónica, las baterías y el altavoz cabían en el interior de la calabaza, aquello quedaba muy apretado -hay que sumar el cableado, que también ocupa- así que decidí imprimir una caja para la electrónica y las baterías, dejando en la calabaza únicamente el altavoz. Así me ahorro volver a imprimir una calabaza más grande.

Caja para la electrónica.

Pero si prefieres utilizar un alimentador externo como en el proyecto original, entonces no necesitas tanto espacio como yo dentro de la calabaza y te puede servir una de menor tamaño.

Casualmente en el momento de imprimir la calabaza tenía montado un filamento color naranja, por lo que la calabaza quedó muy chula. Si tienes filamento de otro color y lo quieres aprovechar, puedes pintar la calabaza con un spray naranja, como en el proyecto de Electronoobs.

Calabaza terminada sobre la caja de electrónica.

2. Esquema

En cuanto a los componentes vamos a necesitar lo siguiente:

· Un Arduino NANO v3.

· Una tira de ledes RGB de 5V, de la que cortaremos dos ledes para los ojos y una pequeña tira de 10 ledes para iluminar el interior de la calabaza.

· Un integrado ULN 2803 para alimentar los ledes, así simplificamos el circuito y reducimos el cableado.

· Un sensor de movimiento.

· Un reproductor MP3 y un pequeño altavoz de 8 Ohmios, se puede reciclar de una vieja radio o juguete.

· Unas baterías, pilas o un alimentador externo de 5V (o de 12V si los ledes son de 12V) el capítulo de la alimentación lo dejo a voluntad de cada uno.

Links al sitio donde he comprado los componentes al final de la página.

Conecta los componentes como en el esquema. 

3. Montaje

El montaje es muy sencillo.

En primer lugar corta dos ledes, pégalos en un trozo de papel a la distancia de los ojos y suelda unos cables para unirlos entre ellos y otros más largos que irán hasta el ULN2803.

Dos ledes para los ojos.

Mini tira de 10 ledes para iluminar el cuerpo de la calabaza.

Pega un trozo de papel en la parte interior de los ojos de la calabaza para difuminar la luz de los ledes. 

Haz dos agujeros en la base de la calabaza, uno para fijar la calabaza a la tapa con un tornillo M4 y el otro para pasar los cables. Puedes usar la tapa de la caja como plantilla. 

Pega la tira de ledes alrededor del cuerpo y pega los otros dos ledes a la altura de los ojos.

Pega el altavoz en la tapa de la calabaza con un poco de silicona termofusible. 

Introduce los componentes en la caja -si procede-. Puedes montar el reproductor mp3 y el ULN2803 en una pequeña protoboard para ayudarte con las conexiones. El sensor de movimiento va en el agujero central, en la parte delantera. 

Caja con la electrónica.

Y en la parte trasera montamos el interruptor de encendido. 

Interruptor de encendido.

4. Sketch

El código para el Arduino lo he modificado a partir del original, manteniendo el mismo número de pistas, pero adaptado a ledes RGB en lugar de ledes direccionables.

En una tarjeta microSD -mejor si es de 2 GB o menos- mete 4 archivos MP3 con los nombres 0001 a 0004 en una carpeta llamada mp3 que cuelga directamente del directorio raiz de la tarjeta.

Al final de la página, en Descargas, he dejado un segundo sketch de 14 pistas con aullidos, risas macabras, gritos, ruido de fantasmas, susurros, alaridos y demás sonidos terroríficos. Solo tienes que añadir las 14 pistas mp3 a la tarjeta microSD y subir el sketch al Arduino.

Consulta el proyecto original para más info.

int red = 12, green = 11, blue = 10; // eyes leds

int red2 = 9, green2 = 8, blue2 = 7; // color leds


#include <SoftwareSerial.h>

#include <DFMiniMp3.h>


int PIR_in = 4;



//Variables

bool detected = false;

int mode = 0;




//////////////////////////////////////////////////////////////////

// implement a notification class,

// its member methods will get called 

//

class Mp3Notify

{

public:

  static void OnError(uint16_t errorCode)

  {

    // see DfMp3_Error for code meaning

    Serial.println();

    Serial.print("Com Error ");

    Serial.println(errorCode);

  }


  static void OnPlayFinished(uint16_t globalTrack)

  {

    Serial.println();

    Serial.print("Play finished for #");

    Serial.println(globalTrack);   

  }


  static void OnCardOnline(uint16_t code)

  {

    Serial.println();

    Serial.print("Card online ");

    Serial.println(code);     

  }


  static void OnCardInserted(uint16_t code)

  {

    Serial.println();

    Serial.print("Card inserted ");

    Serial.println(code); 

  }


  static void OnCardRemoved(uint16_t code)

  {

    Serial.println();

    Serial.print("Card removed ");

    Serial.println(code);  

  }

};

DFMiniMp3<HardwareSerial, Mp3Notify> mp3(Serial);

//////////////////////////////////////////////////////////////////




void setup() {

  pinMode(PIR_in,INPUT);

  

  delay(100);

  

  Serial.begin(115200);  

  mp3.begin();

  uint16_t volume = mp3.getVolume();

  mp3.setVolume(30);  

  uint16_t count = mp3.getTotalTrackCount();

  delay(1000);

  //mp3.playMp3FolderTrack(1);  // engine start + submarine sound

  //EEPROM_writeAnything(1, 000);


}


void loop() {

  if(digitalRead(PIR_in) && !detected)

  {

    detected = true;

  }

  

  if(!digitalRead(PIR_in) && detected)

  {

    detected = false;

  }


  


  if(detected)

  {

    mode = mode + 1;

    if(mode > 3)

    {

      mode = 0;

    }


    

    if(mode == 0)

    {

      mp3.playMp3FolderTrack(1);  

      fadeEyesRed(4000);

      fadeEyesWhite(1500);

      eyesColor(255,0,0); 

      ledsColor(255,0,0); 

      eyesOff();

      delay(1000); 

      eyesColor(255,0,255); 

      ledsColor(255,0,255);       

      delay(2000);

      eyesColor(127, 127, 127);

      fadeOutEyesRed(4000);  

      delay(1000);      

      

    }//end of mode 0


    if(mode == 1)

    {

      mp3.playMp3FolderTrack(2);  

      haha();     

      eyesOff();

      delay(1000);     

      allWhite();

      delay(1600);

      allOff();

      fadeEyesBlue(5600); 

      haha(); 

      delay(450);

      fadeEyesWhite(500);

      fadeEyesWhite(500);

      eyesOff();

      delay(1800);

      fadeEyesWhite(500);

      fadeEyesWhite(700);

      eyesOff();

      delay(1400);

      fadeEyesWhite(500);

      fadeEyesWhite(700);

      eyesOff();

      delay(1400);

      fadeEyesWhite(500);

      fadeEyesWhite(700);

      eyesOff();

      delay(2000);  

       

            

     

    }//end of mode 1


    if(mode == 2)

    {

      mp3.playMp3FolderTrack(3);  

      haha(); 

      delay(400);    

      haha(); 

      delay(180); 

      haha(); 

      delay(80); 

      haha(); 

      delay(10); 

      haha();       

      delay(2000);      

     }//end of mode 2


     if(mode == 3)

    {

      mp3.playMp3FolderTrack(4);  

     eyesColor(127, 127, 127);

     fadeEyesRed(300);

     delay(2000); 

     eyesColor(127, 127, 127);

     fadeOutEyesWhite(2000); 

     delay(5000);      

     }//end of mode 3


   

  }//end of detected


  if(!detected)

  {

    allOff();

  }


}//end void loop


void eyesColor(int rPWM, int gPWM, int bPWM)

{

 analogWrite(red, rPWM);

 analogWrite(green, gPWM);

 analogWrite(blue, bPWM);

}


void ledsColor(int rldPWM, int gldPWM, int bldPWM)

{

  analogWrite(red2,rldPWM);

  analogWrite(green2,gldPWM);

  analogWrite(blue2,bldPWM);

}


void allWhite()

{

  eyesColor(255,255,255); 

  ledsColor(255,255,255);

}


void allOff()

{

  eyesColor(0,0,0);

  ledsColor(0,0,0);

}


void haha()

{

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(175);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(225);

      eyesOff();

      delay(30);

      fadeEyesRed(155);

      eyesOff();

      delay(30);

      fadeEyesRed(130);

      eyesOff();

      delay(30);

}



void eyesOff()

{

  eyesColor(0,0,0);

  ledsColor(0,0,0);  

}


void fadeEyesBlue(int DELAY)

{

  float loop_delay = DELAY / 255;

  int i = 0;

  while(i < 255)

  {

    eyesColor(0,0,i);

    ledsColor(0,0,i);

    i = i + 1;

    delay(loop_delay);

  }

}



void fadeEyesWhite(int DELAY)

{

  float loop_delay = DELAY / 255;

  int i = 0;

  while(i < 255)

  {

    eyesColor(i,i,i);

    ledsColor(i,i,i);

    i = i + 1;

    delay(loop_delay);

  }

}


void fadeEyesRed(int DELAY)

{

  float loop_delay = DELAY / 255;

  int i = 0;

  while(i < 255)

  {

    eyesColor(i,0,0);

    ledsColor(i,0,0);

    i = i + 1;

    delay(loop_delay);

  }

}


void fadeOutEyesWhite(int DELAY)

{

  float loop_delay = DELAY / 255;

  int i = 0;

  while(i < 255)

  {

    eyesColor(255-i,255-i,255-i);

    ledsColor(255-i,255-i,255-i);

    i = i + 1;

    delay(loop_delay);

  }

}


void fadeOutEyesRed(int DELAY)

{

  float loop_delay = DELAY / 255;

  int i = 0;

  while(i < 255)

  {

    eyesColor(255-i,0,0);

    ledsColor(255-i,0,0);

    i = i + 1;

    delay(loop_delay);

  }

}


5. Links

Dónde comprar

Sensor de movimiento

Reproductor mp3

Los componentes que no enlazo ya los tenía por casa, seguro que no tenéis problemas en encontrarlos.

Calabaza stl en Thingiverse

Descarga el esquema, el sketch y la caja para la electrónica aquí.

Agradecimientos

Al Sr. Andrei por compartir tan amablemente con la comunidad maker su proyecto y permitir que otros podamos replicarlo.

Mira el proyecto original en YouTube.

Canal ELECTRONOOBS en inglés y ELECTRONOOBS España

Sitio web electronoobs.io