Proyecto con Arduino: luces y sonido para el Mjolnir del MCU

Otro proyecto con solo luces y audio. La gracia es que las luces las he programado de tal forma que parezcan relampagueos de rayos. ¿Por qué? Pues porque el circuito es para colocarlo dentro de una réplica del Mjolnir del MCU.

Sobre el circuito:

El circuito consta de cuatro tiras de once LEDs cada una para las luces, y un lector de tarjeta micro-sd, un amplificador de audio (un circuitito adicional con un LM386 y muchos condensadores) y un altavoz para el audio. Y un botón, claro. Al pulsar el botón, una combinación aleatoria de los LEDs en las cuatro tiras se encienden a flashazos durante cinco minutos, a la vez que suena el sonido de un trueno (que es un archivo .WAV). El amplificador no aparece en el diagrama pero solo es una etapa que añadí para que se oyera bien porque el altavoz iba a ir dentro del martillo y tenía miedo de que no se escuchara.

Lo único diferente del proyecto, en verdad, es el “algoritmo” de generación de los flashazos.

El código, como digo, es un “más de lo mismo” salvo por la generación de los flashes de luz:


#ifdef __AVR__
#include
#endif
#include "SD.h" //Lib to read SD card
#include "TMRpcm.h" //Lib to play auido
#include "SPI.h" //SPI lib for SD card
#include
#include
#include
#include

#define SD_ChipSelectPin 4 //Chip select is pin number 4
TMRpcm music; //Lib object is named "music"

#define PIN_A 5
#define PIN_B 6
#define PIN_C 7
#define PIN_D 8
#define STRIPS 2
#define NUM_LEDS 10

#define COLOR_ORDER RGB
#define LED_TYPE WS2811

#define MAX_BRIGHTNESS 255
#define FPS 50
#define FLASHES 18

struct CRGB leds[STRIPS][NUM_LEDS];

unsigned int dimmer = 1;

#define FREQUENCY 3

int boton = 2;
long tiempo_anterior;
long diferencia;
bool flagLuces = false;

int strip;
int segment;
int first;
int last;
int halfUp;
int segundos;
int intervalo;

void setup() {
Serial.begin(9600);
pinMode(boton, INPUT);

LEDS.addLeds(leds[0], NUM_LEDS).setCorrection(TypicalLEDStrip);
LEDS.addLeds(leds[1], NUM_LEDS).setCorrection(TypicalLEDStrip);
LEDS.addLeds(leds[1], NUM_LEDS).setCorrection(TypicalLEDStrip);
LEDS.addLeds(leds[1], NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(MAX_BRIGHTNESS);

attachInterrupt(digitalPinToInterrupt(boton), botonLuces, FALLING);

music.speakerPin = 9; //Auido out on pin 9

if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD fail");
return;
}

music.setVolume(6); // 0 to 7. Set volume level
music.quality(1); // Set 1 for 2x oversampling Set 0 for normal
}

void loop() {
if(flagLuces){
flagLuces = false;
thunder();
lightning();
}
}

void botonLuces(){
diferencia = millis() - tiempo_anterior;
tiempo_anterior = millis();
//Serial.println(diferencia);

if(diferencia > 500){
flagLuces = true;
}
}

void thunder(){
music.play("ALARMA.wav");}
}

void lightning() {
segundos = millis();
do {
for (int flashCounter = 0; flashCounter < random8(5,FLASHES); flashCounter++)
{
if(flashCounter == 0) dimmer = 5;
// the brightness of the leader is scaled down by a factor of 5
else dimmer = random8(1,3); // return strokes are brighter than the leader

strip = random8(2);
segment = random (NUM_LEDS);
halfUp = random (2);
first = 0;
last = NUM_LEDS;

if (halfUp) {
last = segment;
} else {
first = segment -1;
}
for (int i = first; i< last; i++) {
leds[strip][i].setRGB(255/dimmer, 255/dimmer, 255/dimmer);
}
FastLED.show();
delay(random8(4,10)); // each flash only lasts 4-10 milliseconds
for (int i = 0; i< NUM_LEDS; i++) {
leds[strip][i].setRGB(0, 0, 0);
}
FastLED.show();

if (flashCounter == 0) delay (150); // longer delay until next flash after the leader
delay(50+random8(100)); // shorter delay between strokes
}
delay(random8(FREQUENCY)*100); // delay between strikes
intervalo = millis() - segundos;
} while (intervalo < 5000);
}

 

Sobre el código:

El código tiene interrupción por pulsación, y la generación de los flashazos es solo varios bucles uno dentro de otro que seleccionan aleatoriamente el brillo del flash, los leds que lo emitirán, y su duración. Cada ráfaga de flashes dura aproximadamente cinco segundos, que es el centinela del bucle (5000 milisegundos). También he cambiado la biblioteca para los LEDs en este proyecto, porque para el control que quería sobre las tiras de LEDs me parecía que FastLED podría ser más útil que la de AdaFruit.

El circuito, como he comentado al comienzo del post, era para instalar dentro de una réplica del Mjolnir del MCU. El diseño de la réplica es de Henry Creations:

Y el efecto de las luces (y el audio) ha quedado así:


 
Queda mucho más espectacular cuanta menos luz hay, la verdad.

************************************************************

Espero que esta entrada pueda ser de utilidad, y si no, como siempre, aquí tenéis un gato para compensar.

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.