Proyecto con Arduino: luces del Guantelete del Infinito (nano-gauntlet) de Avengers: Endgame

No pensaba subir este proyecto al blog porque no es más que “otra vez luces”, y de esos ya he subido como tres docenas. Pero me he decidido a hacerlo para así tener un “repositorio” de todos mis proyectos con arduinos, sean lo similares que sean.

Esta vez se trata de hacer un circuitito de seis LEDs que se enciendan con dos patrones: fijo, y palpitante. En plan luces de navidad, sí.

Sobre el circuito:

El diseño original iba a ser una tira de seis LEDs RGBW, pero cambié a seis leds independientes, todos conectados al mismo pin, porque facilitaría muchísimo la instalación una vez terminado. Cada led tenía que pasar por un agujerito bastante pequeño, y cuanto menos cable hubiera involucrado en el proceso, mejor.

El código es un copiapega de circuitos anteriores:


#include <Adafruit_NeoPixel.h>

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

bool encendido = false;

#define PIN 12
#define NUMPIXELS 1

Adafruit_NeoPixel pixel = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGBW + NEO_KHZ800);

String states[] = {"apagado", "encendido", "palpitante"};
byte state;

void setup() {
Serial.begin(9600);

pixel.begin(); // This initializes the NeoPixel library.
pixel.show(); // initialize all pixels to "off"

pinMode(boton, INPUT);
attachInterrupt(digitalPinToInterrupt(boton), pulsacion, FALLING);

state = 0;
}

void loop() {
switch (state) {
case 0:
if (encendido) {
apagar();
}
break;
case 1:
if (!encendido) {
encender();
}
break;
case 2:
if (encendido) {
apagar();
} else {
encender();
}
break;
}
}

void pulsacion() {
diferencia = millis() - tiempo_anterior;
tiempo_anterior = millis();

if (diferencia > 200) {
state = ++state % 3;
}
}

void encender() {
uint16_t i, j;

for (j = 0; j < 150 ; j++) {
for (int i = 0; i < NUMPIXELS; i++) {
pixel.setPixelColor(i, pixel.Color(0, 0, 0, 150));
}
pixel.setBrightness(j);
pixel.show();
delay(20);
}
encendido = true;
}

void apagar() {
uint16_t i, j;

for (j = 150; j > 0; j--) {
for (int i = 0; i < NUMPIXELS; i++) {
pixel.setPixelColor(i, pixel.Color(0, 0, 0, 150));
}
pixel.setBrightness(j);
pixel.show();
delay(20);
}
encendido = false;
}

El repositorio con el código lo podéis encontrar aquí.

Sobre el código:

El código tiene interrupción por pulsación, encendido gradual y apagado gradual de LEDs, que son dos cosas que ya he puesto ochenta veces por aquí. Lo único que he añadido es un contador módulo 3, que apague las luces, las encienda y deje fijas, o las encienda y apage en “pulsaciones” cuando se va pulsando repetidamente el botón. Es bastante sencillito, la verdad.

 

 

Lo espectacular del proyecto llega cuando lo instalamos en el guantelte del infinito que habíamos impreso con impresora 3D (el diseño está disponible en Thingiverse cortesía de HappyMoon) y las gemas del infinito que hicimos con resina (el molde también venía en el STL de HappyMoon, hicimos el negativo con silicona, y de ahí las gemas).

Podéis ver que el trabajazo aquí está en hacer la figura, no en el circuito en sí. Pero añadir el detalle de las luces mejora bastante la presentación.

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

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.