Hoy os traigo un montaje muy apropiado para estas fechas. Una calabaza diabólica basada en Arduino que se activa por proximidad, habla y enciende sus ojos.
Para detectar la proximidad de un individuo tenemos varias opciones. Yo he optado por un sensor de ultrasonidos HC-SR04. Quizá no sea lo más óptimo pero es lo que tenía más a mano. También necesitaremos un par de LEDs con sus respectivas resistencias de 1K y un pequeño altavoz o speaker (cuidado, no lo he probado, pero me temo que con un piezoeléctrico no funcione bien). La idea es que cuando alguien se acerque a la calabaza, emita un sonido digitalizado y encienda sus dos ojos (LEDs). Éste es el circuito.
El altavoz se conecta a tierra y al pin 11, el sensor de ultrasonidos a los pines 9 y 10 (además de a VCC y GND), y finalmente, he usado los pines 2 y 3 para controlar el encendido de los LEDs. La cosa queda así.
Otro asunto es cómo meter todo en la calabaza. La mía, de plástico, era un poco pequeña y me ha costado acomodar y manipular dentro. He colocado el sensor en la boca y los LEDs en los ojos con la ayuda de un cutter. Aunque esto ya lo dejo a vuestra pericia manual, que seguramente es mejor que la mía.
No voy a entrar en más detalle sobre el funcionamiento de los LEDs ni del HC-SR04 que ya hemos usado en proyectos anteriores. Para reproducir sonidos digitalizados he usado la librería PCM de Damellis. Gracias a esta librería es posible reproducir pequeños samples de 8 bits a 8000 kHz. Dichos samples se transforman en un array de valores entre 0 y 255, que se insertan directamente en el programa. Como su autor lo explica bastante mejor que yo en su blog, es preferible que lo leáis allí.
El programa para Arduino es el siguiente.
#include <PCM.h>
#define MIN_DISTANCIA 30
int echo = 9; // Pin para echo
int trigger = 10; // Pin para trigger
int ojo1 = 2; // leds para los ojos
int ojo2 = 3;
unsigned long tiempoRespuesta;
unsigned long distancia;
const unsigned char sample[] PROGMEM = {
126, 124, 123, 123, 123, 124, 124, 124, 124, ...
};
void setup()
{
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(ojo1, OUTPUT);
pinMode(ojo2, OUTPUT);
}
void loop()
{
digitalWrite(trigger, HIGH); // Enviamos pulso de 10 microsegundos
delayMicroseconds(10);
digitalWrite(trigger, LOW);
tiempoRespuesta = pulseIn(echo, HIGH); // Y esperamos pulso de vuelta
distancia = tiempoRespuesta/58; // Calculo de distancia en cm
if (distancia < MIN_DISTANCIA) {
digitalWrite(ojo1, HIGH);
digitalWrite(ojo2, HIGH);
startPlayback(sample, sizeof(sample));
delay(5000);
digitalWrite(ojo1, LOW);
digitalWrite(ojo2, LOW);
}
}
He quitado los valores del array para almacenar el sample porque es bastante largo.
Os dejo el vídeo de la calabaza diabólica. Eso sí, tendréis que subir el sonido para escucharla porque suena bastante bajo.



Comentarios
Publicar un comentario