Reto del color
Introducción
En este ejercicio se cubrirán diferentes temas vistos en el curso, utilizaremos un ordenador Raspberry Pi, un microcontrolador ESP32 y unos cuantos leds direccionables.
El reto consiste en construir un sistema que nos permita controlar una tira de leds a través de mensajes de red que utilicen el protocolo MQTT. Cuando esto funcione correctamente y seamos capaces de cambiar los canales rojo, verde, azul y el brillo utilizando mensajes enviados desde la línea de comando, habrá que diseñar una interface web para visualizar y controlar sus valores.
El lado de la Pi
Lo primero que necesitamos es instalar nuestro servidor en una Raspberry Pi, la idea del reto es que la instalación se haga desde el principio, empezando con una SD card limpia. En la documentación de clase, la sección de Instalación del sistema te servirá de guía para hacerlo.
Si quieres conservar la imagen de Raspbeery Pi OS de tu SD card, puedes utilizar alguna utilería para respaldar una imagen completa. Si no tienes una de tu preferencia, puedes probar con etcher, en este link puedes encontrar información de cómo hacerlo.
Una vez que tengamos la Raspberry Pi funcionando y logremos tener acceso a través de SSH, podemos empezar a instalar el software que necesitaremos a lo largo del reto.
MQTT - mosquitto
Primero que nada para poder publicar mensajes y subscribirnos a tópicos del protocolo MQTT, necesitamos instalar mosquitto. Si necesitas refrescar tus conocimientos sobre este protocolo y cómo utilizarlo, puedes consultar la documentación de redes y comunicaciones.
Para asegurarnos de que todo está funcionando podemos subscribirnos a un tópico cualquiera con el comando:
Asegúrate de reemplazar broker_hostname con la dirección IP o el nombre del broker)
mosquitto_sub -h broker_hostname -t topic_name
Y luego abrir otra terminal para publicar un mensaje en el mismo tópico con el comando:
mosquitto_pub -h broker_hostname -t topic_name -m "Esto parece funcionar bien!!"
Si recibimos el mensaje en la primera consola, todo va bien!.
Recuerda que, como hacemos normalmente en clase, el broker MQTT que utilizaremos está siempre en la misma dirección IP (192.168.8.1) del router que ofrece la red raspiNET.
Node-red
Con Node-red podemos procesar los datos que recibamos por MQTT, construir interfaces gráficas rapidamente e integrar todo tipo de funcionalidades a través de un sistema de nodos. Si quieres revisar algunas de las posibilidades que te ofrece, puedes revisar la documentación de clase
Para instalar node-red en tu Raspberry pi puedes seguir las inbstrucciones que emos utilizado anteriormente en clase. Si activas la autenticación con user/pass, asegúrate de guardar bien los datos!!
Recuerda iniciar y habilitar el demonio de node-red con la interface de control de systemd: systemctl
Aquí hay mas información al respecto.
El lado del ESP32
Leds
Primero que nada necesitamos cortar la tira de leds y soldarle 3 cables que nos permitan conectar nuestro circuito. El circuito es muy sencillo, sólo necesitamos alimentar la tira de leds desde el pin de 5V, conectar los GND y el cable DIN (data in) ponerlo en algún GPIO del ESP32.
Puedes consultar el pinout y mucha más información del ESP32 en la documentación de clase
Código
La parte del código, como siempre, es un poco más compleja que el montaje del circuito.
Lo primero es asegurarte de que tus leds funcionan y los puedes controlar correctamente, para esto se recomienda instalar (si todavía no la tienes) la librería Neopixel de Adafruit y cargar algún ejemplo sencillo (podría ser: simple.ino). Asegúrate de cambiar el número de leds al mismo que tiene tu strip y poner el número de pin correcto.
Si todo funciona, ya puedes pasar a lo que sigue!!
Para poder controlar nuestros leds, necesitamos conectar el ESP32 a la misma red WiFi en la que está conectada nuestra Raspberry Pi y conocer la dirección IP del broker MQTT que vamos a utilizar. Para ser capaces de subscribirnos a un tópico y recibir mensajes MQTT, necesitamos utilizar la librería PubSubClient.
Puedes encontrar muchos ejemplos de cómo recibir y enviar mensajes en la documentación de clase.
Separa los problemas y ve uno por uno:
- Verifica que tus leds se prenden y funcionan correctamente.
- Conéctate a la red y recibe mensajes en algún tópico de tu elección, para verificar que funcionan los puedes imprimir en la consola Serial. Del lado de la Pi puedes usar mosquitto desde la consola.
- Envía mensajes de prueba con un timer desde el ESP y verifica su recepción en la Pi
- Planea como organizar tus tópicos, ten en cuenta que deberías controlar los canales: rojo, verde, azul y el brillo. Cuatro en total.
- Investiga y prueba cómo saber a que tópico llego cada mensaje, para que puedas utilizarlo en el canal que corresponde.
- Averigua como convertir los mensajes que te llegan en un tipo (byte pointer) al tipo que se requiere en la función de pixels.fill() (int).
- Prueba primero con un solo canal, y una vez que todo funcione agrega los demás.
- Ten en cuenta que para que node red está al tanto de lo que pasa en el ESP, cuando cambie algo del lado del ESP (por ejemplo en el boot) puedes enviar un mensaje a tópicos que actualicen el estado de los nodos.
Aquí hay una pista de como interpretar los mensajes!!
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensaje recibido [");
Serial.print(topic);
Serial.print("] ");
String payloadSTR;
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
payloadSTR.concat(String((char)payload[i]));
}
Serial.println();
int value = payloadSTR.toInt();
String topicSTR = String(topic);
Serial.println(topicSTR);
if (topicSTR.endsWith("red")) red = value;
else if (topicSTR.endsWith("green")) green = value;
else if (topicSTR.endsWith("blue")) blue = value;
else if (topicSTR.endsWith("bright")) bright = value;
pixels.fill(pixels.Color(red, green, blue), 0);
pixels.setBrightness(bright);
pixels.show();
}
Control!
Una vez que tengas el código del ESP32 listo para recibir mensajes y cambiar los colores y el brillo de los leds. puedes empezar verificando el funcionamiento y haciendo cambios remotos desde la consola de tu raspberry Pi utilizando mosquitto_pub.