Estrella de Navidad con leds WS2812B y Arduino controlada por bluetooth.

Modelo acabado y funcionando.

Materiales necesarios

  • 1 Arduino Nano
  • 1 Módulo Bluetooth HC-05
  • Tira de 1 metro de leds WS2812B
  • Una fuente de alimentación potente.

Electrónica

Tan solo conectar el Módulo HC-05 que se comunicará por SoftwareSerial a los pines D4 para Rx y D7 para Tx, que podrás cambiar a tu conveniencia.

Los leds deben alimentarse directamente de la fuente como trataremos más adelante y el pin de conexión será en este caso el D8. Algunos autores proponen añadir una resistencia de 470ohm para proteger los primeros leds.


Piezas 3D imprimibles

Se ha diseñado para que encajen todas las piezas por presión. No es necesario emplear ni tornillos ni pegamento, pues el artefacto se sustenta por sí mismo.

Consta de una base compuesta por 5 piezas (esquinas de la estrella) que encajan una con la otra. Una de las «esquinas» es diferente a las otras cuatro pues por ella se conectarán los leds con la unidad central (ver detalle en la fotografía).

La base se colocará de forma vertical y al ser tan ancha se sostendrá por ella misma sin necesidad de soporte como se aprecia en la fotografía.

La tira led recorre todo el perímetro de la estrella e irá colocada en el surco diseñado para tal efecto.

Unos embellecedores exteriores harán de tapadera para ocultar definitivamente los leds y que no se vean. Encajarán a presión sobre las piezas de la base.

Se ha usado Petg translúcido para imprimir las piezas y aportar una mejor luminosidad aunque pienso que en PLA blanco también dará buen resultado.

Y por último una caja oculta que contendrá la electrónica de control. El microcontrolador y el BT.

En esta fotografía se muestra un prototipo que incluía además mejoras como recepción de IR y botón de apagado que no son necesarios.

Ensamblaje

Imprimir y encajar las piezas de la estructura, se aconseja material traslúcido.


Leds WS2812B conocidos como NeoPixel

Los WS2811, WS2812 y WS2812B son LED que disponen de lógica integrada, por lo que es posible variar el color de cada LED de forma individual (a diferencia de las tiras RGB convencionales en las que todos los LED cambian de color de forma simultánea).

Están basados en el LED 5050, llamado así porque tiene un tamaño de 5.0 x 5.0 mm. Es un LED de bajo consumo y alto brillo, que incorpora en un único encapsulado los 3 colores RGB.

La genial novedad del WS2812B (y resto de familia) es añadir un integrado dentro de cada LED, que permite acceder a cada pixel de forma individual. Por este motivo este tipo de LED se denominan “individual addressable”.

Aunque la resistencia en el pin de entrada es aconsejable para no dañar los primeros leds, yo no la uso.

La alimentación de la tira LED tiene que realizarse desde una fuente de alimentación externa de 5V, dado que Arduino no dispone de potencia suficiente. La referencia GND será común.


Cálculo de la potencia necesaria.

Las dimensiones del perímetro de la estrella son 98cm. Para una tira con una densidad de 144 leds por metro como es mi caso, emplearemos 140 leds.

Teniendo en cuenta que cada uno de los leds en su máximo brillo consumirán sobre 60mA (20x 3 colores), tendremos que la corriente necesaria debe ser mayor de 60×140, que resulta 8.4 amperios una burrada en términos energéticos. La potencia P=I*V debería ser de 8.4*5= 42W.

En casos de mucho consumo y gran número de LED también puede ser necesario alimentar por más de un punto a la vez (por ejemplo, cabeza y cola de la tira). De lo contrario, la caída de tensión hará que los últimos LED viren a rojo.

Usaré una alimentación de 5V y 2A, y evitaré usar el blanco a máxima potencia.


Programación del microcontrolador

Librerías

La librería de efectos de los leds WS2812b es WS2812FX.h que puedes descargar de aquí aunque se encuentra accesible desde la IDE de arduino.

A tener en cuenta

Configurar el módulo HC-05 mediante comandos AT tiene su aquel aunque la mayoría vienen ya preparados y listos para vincularse y usarse. En proyectos anteriores hemos tratado este asunto. Echa un vistazo a Reloj analógico didáctico – Tutoriales de proyectos con Arduino (geniero.es) entre otros.

Código

El código en el IDE de Arduino es relativamente simple. Se recibirá por BT(bluetooth) una cadena con 2 valores separados por coma. Ejemplo: «2,132». El programa distingue el primer valor para saber si se trata de:

1=cambio de efecto (entre los 55 que ofrece la librería con ws2812fx.setMode()).

2=cambio de brillo (desde 0 a 255 con ws2812fx.setBrightness()).

3= Velocidad del efecto (de 0 a 100 para ws2812fx.setSpeed()).

4= valor del color rojo (0-255).

5= valor del color verde(0-255).

6= valor del color azul(0-255).

Así, en el ejemplo «2,132» se está recibiendo un cambio de brillo a 132.

Por último, si se pulsa el botón «Apagar», se recibe dos veces (para evitar errores de recepción) la cadena «2,0», que asigna al brillo el valor 0.

Dato a tener en cuenta es que se ha usado una tasa de 38400bps para comunicarse con el Serial.

/**********************************************/
/*  Estrella de Navidad 2020           */
/*  AUTOR: Pedrajas 2020                                                */
/**********************************************/

#include <WS2812FX.h>

#include <SoftwareSerial.h>   // Incluimos la librería  SoftwareSerial  
SoftwareSerial BT(4, 7);   // Definimos los pines RX y TX del Arduino conectados al Bluetooth

#define LED_COUNT 140
#define LED_PIN 8
WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);
byte rojo = 255;
byte verde = 255;
byte azul = 255;

String str = "";
const char separator = ',';
const int dataLength = 3;
int data[dataLength];

void setup() {
  BT.begin(38400);       // Inicializamos el puerto serie BT (Para Modo AT 2)
  Serial.begin(38400);
  Serial.println("Saludos");
  ws2812fx.init();
  ws2812fx.setBrightness(255);
  ws2812fx.setSpeed(2000);
  ws2812fx.setColor(rojo, verde, azul);
  ws2812fx.setMode(24);
  ws2812fx.start();
}

void loop() {

  ws2812fx.service();
  ws2812fx.setColor(rojo, verde, azul);

  if (BT.available() > 0) {                      //en caso de recibir datos BT
    str = BT.readStringUntil('\n');
    Serial.println (str);
    for (int i = 0; i < dataLength ; i++)
    {
      int index = str.indexOf(separator);
      data[i] = str.substring(0, index).toInt();
      str = str.substring(index + 1);
    }
    if (data[0] == 1)                             //lee el primer valor del BT (es 1)
    {
      ws2812fx.setMode(data[1]);                  //Lee el segundo valor (0-54) asigna el modo
    }
    if (data[0] == 2)
    {
      ws2812fx.setBrightness(data[1]);
    }
    if (data[0] == 3)
    {
      ws2812fx.setSpeed(data[1] * 100);
    }
    if (data[0] == 5)
    {
      rojo = (data[1]);
    }
    if (data[0] == 4)
    {
      verde = (data[1]);
    }
    if (data[0] == 6)
    {
      azul = (data[1]);
    }

  }

}

A lo mejor te conviene prescindir de la funcionalidad del BT y programarlo simplemente con efectos elegidos que varíen. Esto te ahorraría bastante código y piezas, así como la instalación del archivo *.apk en el móvil que propongo en el siguiente apartado y podrás descargar. Es tu decisión.


Programación Android

Si has decidido añadir la funcionalidad bluetooth a tu proyecto, necesitarás un programa de control. Aquí puedes descargar el que yo propongo para el móvil realizado en MIT App Inventor .


Feliz Navidad.