Sincronizar la pulsera de los conciertos (PixMob) con música utilizando un ESP8266

Posted by Carlos Ganoza on 30 Nov, 2022

Este último año se han vuelto a realizar varios conciertos en mi país después de que se levantaran las restricciones sobre la celebración de eventos masivos, y una de las cosas que más llamó la atención en estos conciertos fue el uso de las pulseras led entre los asistentes, estas pulseras las pudimos ver en conciertos como el de Bad Bunny o Coldplay. Aunque realmente no es nada nuevo, Pixmob, la empresa que los fabrica, viene comercializando sus productos desde el 2010.

También bandas de kpop como BTS usan las denominadas “Army Bomb” en sus conciertos desde hace mucho:

¿Aún  levantas tu encendedor? el futuro es hoy, viejo!¿Aún levantas tu encendedor? el futuro es hoy, viejo!

En el caso de las pulseras, son repartidas “gratuitamente” a los asistentes, y una vez comenzado el show se sincronizan para emitir todas los mismos colores de manera armoniosa.

¿Pero cómo funcionan?

Tuve la oportunidad de asistir al concierto de BadBunny y al ingresar me dieron esta pulsera:

una pulsera de la empresa PixMob:

Mi pulsera a punto de ser violentadaMi pulsera a punto de ser violentada

Al terminar el concierto muchos nos quedamos con las ganas de seguir usándolas, así que me puse a investigar y esto fue lo que descubrí:

Si desarmamos la pulsera podemos ver que cuenta con un receptor Infrarrojo, dos leds RGB y se alimentan con dos baterías CR1632 de 3v.

Mi pulsera violentadaMi pulsera violentada

He visto algunos proyectos en github vinculados a esta pulsera, entre ellos encontré este repositorio de Daniel Weidman que a través de ingeniería inversa había conseguido los códigos de colores para el funcionamiento de la pulsera.

Como verán en el repositorio, el proyecto está orientado para funcionar con FliperZero, y para mi mala suerte, a pesar de que me compré uno, nunca me llegó…

La buena noticia es que si tenía varias placas de desarrollo, entre ellas un NodeMCU(ESP8266) y me dispuse a hacer un dispositivo que controle a estas pulseras (porque a mi no me va a ganar la pobreza), y que no solo nos permita controlar las luces, sinó que tambien estas se prendan al ritmo de la música.

NERD ALERT

Si no te quieres comer todo el cuento, puedes ir a mi repositorio y usar el código y diagrama para armar el controlador directamente:

https://github.com/drneox/pixmob-music-rhythm

Gracias por seguir leyendo, nunca dudé de ti…

INSTRUCCIONES:

Para este proyecto usaremos lo siguiente:

  • KY-038 Sensor.
  • IR LED Emitter.
  • BC547 Transistor.
  • NodeMCU Board (ESP8266).

1) Montamos todo de la siguiente forma:

-Utilizamos el transistor como amplificador para nuestro emisor infrarrojo, en este caso estoy usando un BC547 pero podría también ser un 2n2222 u otro NPN.

A través de la base del transistor, conectado a el pin D1, controlaremos las señales IR que emitirá nuestro LED(si lo conectamos directamente la luz será muy tenue y no funcionará) y para esto también necesitamos utilizar la librería IRremoteESP8266.

2) Abrimos Arduino IDE e instalamos la librería como se muestra en la imagen:

Herramientas > Administrador de bibliotecas.

3)Creamos un nuevo sketch donde la vamos a importarla de la siguiente manera:

1
2
3
#include <IRremoteESP8266.h>

#include <IRsend.h>

y continuamos configurando nuestros pines:

1
2
3
const int IRLedPin = 5;  // led GPIO pin

IRsend irsend(IRLedPin);

IRLedPin = 5 hace referencia al GPIO 5 que en NODEMCU está etiquetado como D1 como lo vemos en la siguiente imagen:

4) Definimos algunos colores basándonos en el repositorio compartido anteriormente:

1
2
3
4
5
6
7
uint16\_t yellow[21] = {1400, 1400, 700, 700, 700, 1400, 700, 2800, 700, 2100, 1400, 700, 700, 700, 700, 1400, 1400, 2800, 1400, 2800, 700};

uint16\_t blue[27] = {700, 700, 700, 2100, 1400, 700, 700, 2800, 700, 1400, 700, 700, 700, 1400, 1400, 700, 700, 1400, 700, 700, 700, 700, 700, 700, 700, 2100, 700};

uint16\_t green[21] = {1400, 1400, 700, 700, 700, 700, 1400, 2800, 700, 1400, 700, 1400, 700, 1400, 700, 1400, 1400, 2800, 1400, 2800, 700};

uint16\_t pink[23] = {700, 700, 700, 2100, 1400, 700, 700, 2800, 700, 1400, 700, 700, 700, 2800, 1400, 1400, 700, 2100, 700, 700, 700, 2100, 700};

Yo elegí estos pero tú puedes usar tu color de la suerte.

5) Inicializamos irsend en setup:

1
2
3
4
5
void setup() {

irsend.begin();

}

6) En loop vamos a poner lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void loop() {

irsend.sendRaw(yellow, 21, 38);

delay(200);

irsend.sendRaw(green, 21, 38);

delay(200);

irsend.sendRaw(pink, 23, 38);

delay(200)

irsend.sendRaw(blue, 27, 38);

delay(200)

}

Esto hará que la pulsera se ponga amarilla, espere 200 ms, luego verde, espere 200 ms, luego rosa, espere 200 ms y por último azul para esperar nuevamente 200 ms antes de volver a comenzar.

Aquí lo importante es pasar por sendRaw, el nombre de la variable del color, el tamaño del valor, y la frecuencia a la que funciona, en este caso a 38kHz.

Bien ya podemos controlar la pulsera con los colores que hemos elegido, ahora pasaremos a sincronizarla con la música, y para esto haremos uso del sensor de sonido KY-038.

Este sensor tiene un pin analógico y un pin digital, además de los pines de alimentación.

Después de probarlo, honestamente no he podido darle uso a los datos entregados por el pin analógico y al parecer son meramente referenciales, y aunque en el diagrama de este proyecto el pin analógico está conectado al pin A0, realmente podemos dejarlo desconectado.

7) declaramos nuestros pines:

const int microAnalog = A0; // pin analogico del sensor de sonido

const int microDigital = 16; // pin digital del sensor de sonido

8) cambiamos el modo a input dentro de la función setup() y nos quedarìa así:

1
2
3
4
5
6
7
8
9
void setup() {

irsend.begin();

pinMode(microAnalog, INPUT); // podemos ignorar esta linea

pinMode(microDigital, INPUT);

}

9) y en loop() vamos a poner lo siguiente:

1
2
3
4
5
6
7
if (digitalRead(microDigital) == HIGH) {

irsend.sendRaw(yellow, 21, 38);

}

delay(200)

Para que cada vez que el sensor de sonido nos mande una señal HIGH (cuando detecta un sonido que excede el umbral configurado) se envíe la señal por IR para encender la pulsera.

10)Como tenemos varios colores haremos lo siguiente para que se ejecuten de manera aleatoria:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void loop() {

int randomNumber = random(1, 4);

if (digitalRead(microDigital) == HIGH) {

if (randomNumber == 1) {

Serial.println("send yellow code");

irsend.sendRaw(yellow, 21, 38);

}

if (randomNumber == 2) {

Serial.println("send green code");

irsend.sendRaw(green, 21, 38);

}

if (randomNumber == 3) {

Serial.println("send pink code");

irsend.sendRaw(pink, 23, 38);

}

else {

Serial.println("send blue code");

irsend.sendRaw(blue, 27, 38);

}

delay(200);

}

}

11) Compilamos y cargamos el sketch en nuestro microcontrolador

Ahora cada vez que el sensor detecte un sonido y nos mande una señal HIGH al microcontrolador, se enviará una señal IR para encender la pulsera con un color aleatorio.

Notas:

  • Asegúrate de que el sensor KY-038 esté calibrado, de lo contrario siempre mandará una señal HIGH.

Esto lo haces girando la pequeña perilla (ver flecha amarilla) con un destornillador plano, hasta que la luz de la derecha se apague (ver flecha verde), esta luz solo se encenderá cuando detecte un sonido que pase el umbral.

  • Así como muestro en el video, tendrás que acercar el micrófono del sensor a la bocina lo más cerca posible para que detecte mejor el sonido.

Eso es todo, espero les haya gustado!

Y si tienes alguna duda o sugerencia, estaré atento a los comentarios.

Repositorio del proyecto: https://github.com/drneox/pixmob-music-rhythm


Carlos Ganoza

I have more than 6 years of experience in the technology market, I have been involved in different aspects of software development, cybersecurity, and open-source. I ♥ python, the open-source, and I always enjoy learning new skills.