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. Podéis descargar el programa completo aquí.
Os dejo el vídeo de la calabaza diabólica. Eso sí, tendréis que subir el sonido para escucharla porque suena bastante bajo.
buen dia que tal? 🙂 me podras ayudar? como le puedo modificar el codigo para que realize el movimiento de un servomotor? al momento que el sensor detecte a alguien?
Buenos días,
Para controlar un servo necesitas conectarlo a un pin que soporte PWM. En Arduino puedes usar la librería Servo para manejarlos fácilmente. En este artículo tienes un ejemplo de uso de un servo: http://www.digilogic.es/robot-controlado-con-arduino/
Saludos.