Hé! Vous semblez être en United States, souhaitez-vous utiliser notre site English ?
Switch to English site
Skip to main content

Eclairage RGBW intelligent avec MQTT et I2C

Utilisation d'un Raspberry Pi et de la carte LED RGBW d'IES

Partout, les LED haute puissance sont en train de remplacer les lampes à filament : on les trouve dans les logements, les locaux professionnels, les automobiles et même dans l'horticulture. Il est possible d'associer des LED rouges, vertes et bleues pour mélanger les couleurs tandis que les LED blanches offrent différentes "températures" de couleurs ou teintes.

Le module shield à LED RGBW 4 canaux, d'IES permet de mélanger les couleurs de 12 LED maximum par canal et il est contrôlé par un bus I2C standard. Cela signifie qu'il est notamment compatible avec les plates-formes Arduino et Raspberry Pi. Pour plus d'informations sur I2C, cliquez ici.

Nous allons, dans cette communication, décrire rapidement la carte, l'intégrer à un boîtier et la contrôler avec un Raspberry Pi via MQTT, un protocole de connectivité entre machines (M2M) ou d'Internet des objets (IoT) conçu pour assurer une extrême légèreté.

La condition nécessaire pour ce qui vous concerne est de posséder un accès root à un Raspberry Pi sur un réseau local et d'avoir un broker MQTT, par exemple Mosquitto, en cours d'exécution.

Contenu de la boîte

La carte est livrée avec un module LED RGBW compact fixé à un dissipateur pour vous permettre de commencer rapidement à travailler sans avoir à identifier et à vous procurer d'autres LED. En suivant les instructions du guide de démarrage rapide, j'ai commencé par souder deux paires de contacts d’embase à la carte pour connecter l'alimentation du système et les broches SDA/SCL, ce qui est nécessaire pour contrôler l'I2C. Comme nous souhaitons utiliser la carte avec un Raspberry Pi, il faut retirer deux cavaliers déconnectant les résistances de pull up sur les lignes SDA et SCL qui doivent être utilisées avec les tensions I2C plus élevées de l'Arduino.

J'ai ensuite créé une plaque de montage simple pour maintenir la carte en position à côté d'un Raspberry Pi pour éviter tout risque de déconnexion de fils ou de court-circuit.

Bien que la carte principale soit alimentée par le contrôleur hôte, dans ce cas d’un Arduino ou d’un Pi, une seconde alimentation est requise pour les LED haute puissance de 12 à 48 V c.c. Cela varie selon le nombre de LED connectées. Pour plus d'informations sur ce point, veuillez vous reporter à la fiche technique.

Mise en fonctionnement

Après avoir connecté la carte à un Raspberry Pi avec une alimentation 12 V c.c., le système a été initialisé et l’I2C a été activé. Sur les modèles de PI plus récents, cette opération peut être effectuée à l'aide de l'outil raspi-config . Pour que Python puisse accéder au bus I2C, j'ai ensuite installé le module Python smbus :

$ sudo apt-get install python-smbus

 

Après une réinitialisation du système, j'ai utilisé la commande suivante pour voir la carte connectée au bus I2C du Pi sur l'adresse par défaut 0x70 :

$ i2cdetect -y 1

Ensuite, la démo "RGBW.py" a été extraite des exemples fournis et copiée sur le Pi. Elle a ensuite été exécutée comme suit :

$ python RGBW.py

Cela a d'abord généré une erreur d'autorisation étant donné que l'utilisation du bus I2C sur le Pi exige un accès au root. Il est possible de contourner cette obligation en exécutant le script Python en tant que root :

$ sudo python RGBW.py

Mais cette option n'est pas une bonne pratique. Il est préférable d'ajouter l'utilisateur "pi" (l'utilisateur par défaut sur le Pi) au groupe "i2c" :

$ sudo adduser pi i2c

À la suite d'une réinitialisation, le script peut alors être exécuté conformément à notre première tentative :

$ python RGBW.py

 

 

 

On obtient, cette fois, une erreur différente qui impose quelques recherches. Nano – un éditeur de texte pratique et relativement convivial – m'a permis d'identifier rapidement et facilement la ligne qui devait être modifiée, car elle était signalée par un commentaire clair et pertinent à l'intérieur du code.

Après avoir effectué cette modification et enregistré le fichier, le script de la démo s'est exécuté et le module LED est passé par différentes couleurs.

Pendant l'exécution du module LED contrôlé par le script Python qui s'exécutait sur un Pi, nous avons pu commencer à construire quelque chose d'un peu plus intéressant.

Concevoir un dispositif

J'ai décidé de m'en tenir, pour le moment, à la LED et au dissipateur fournis et j'ai découpé au laser un boîtier simple pour loger la carte en utilisant une plaque en acrylique dépoli pour assurer la diffusion de la lumière. J'ai ajouté des trous pour créer un flux d'air assurant un refroidissement passif même si le dissipateur ne chauffe pas énormément.

La carte et le module ont été retirés de la première plaque de montage et transférés dans le nouveau boîtier. L'ensemble a ensuite été suspendu au mur et connecté à un Raspberry Pi dans notre atelier qui exécute déjà différentes tâches d'automatisation via MQTT et Node-RED.

Les éléments matériels ayant été positionnés et testés, nous avons ensuite tenté d'améliorer les fonctionnalités et le contrôle logiciel.

Logiciel

Objectif du logiciel :

  • Contrôler la LED RGBW via MQTT
  • Autoriser un changement de couleur et de luminosité

À partir du code de l'exemple et de la fiche technique, j'ai commencé à élaborer un script Python pour contrôler la LED RGBW en utilisant le client Python Paho MQTT qu'on peut installer en exécutant :

$ sudo pip install paho-mqtt

 

 

 

 

 

À partir de la fiche technique de la carte LED, il est possible d'identifier les registres (sur les 20 existants) sur lesquels il faut écrire en fonction de ce qu'on souhaite contrôler. En établissant un tableau de correspondances entre les registres de la fiche technique (illustrés ci-dessus) et les nombres utilisés dans le code de démo (illustré ci-dessous), il a été possible de confirmer définitivement les registres concernés.

On constate, par exemple, que sur la fiche technique, les registres RGB rouge, RGB vert et RGB bleu sont numérotés 3, 4 et 5 respectivement et que cette numérotation apparaît aussi dans le code.

MQTT permet d'envoyer et de recevoir des messages attribués à des sujets particuliers. Les données utiles, ou contenu des messages, sont du texte et j'ai décidé de donner à mes messages un format d'objet JSON afin de pouvoir intégrer de nombreuses variables dans un seul message.

Comme il existe deux techniques différentes pour mélanger des couleurs, en utilisant des valeurs RGB ou HSB (hue (teinte), saturation et brightness (luminosité)), j'ai pensé qu'il pourrait être utile d'intégrer un choix de la méthode à utiliser avant d'écrire les valeurs dans chaque registre.

Le code Python correspondant se trouve dans le répertoire. Si on exécute le fichier dans le shell à l'aide de la commande :

$ python RGBW-LED-Control.py

On obtient la confirmation de la connexion au broker MQTT, de l'adresse IP et du sujet. Il est maintenant possible de démarrer une deuxième "shell session" dans un autre onglet ou une autre fenêtre.

Le script Python se connecte à une instance locale de Mosquitto, un broker MQTT – pour savoir comment la configurer, voir une publication précédente – et il est abonné au sujet "RGBW-LED". On peut maintenant le contrôler en publiant un message sur ce sujet à partir soit d'une machine locale, soit d'une autre machine connectée au réseau.

Voici un exemple de commande de publication :

$ mosquitto_pub -h 127.0.0.1 -t RGBW-LED -m '{"command": "RGB", "r": 80, "g": 60, "b":100, "w": 0, "hue": 0, "sat": 0, "bri": 0}'

Cette commande est exécutée depuis le shell et effectue les actions suivantes :

  • elle se connecte à l'adresse IP locale 127.0.0.1
  • elle publie sur le sujet RGBW-LED
  • elle envoie les données utiles {"command": "RGB", "r": 80, "g": 60, "b": 100, "w": 0, "hue": 0, "sat": 0, "bri": 0}
    • RGB indique que le contrôle des couleurs utilise les valeurs RGB
    • r, g et b définissent les valeurs de luminosité de la LED RGB
    • w définit la valeur de luminosité de la LED blanche
    • hue, sat et bri définissent les valeurs de teinte, de saturation et de luminosité

Notez que la commande ci-dessus envoie des valeurs de w, hue, sat et bri qui ne sont, en réalité, pas utilisées pour le contrôle RGB. En fait, les données utiles peuvent être synthétisées sous la forme suivante : {"command": "RGB", "r": 80, "g": 60, "b": 100} sans altérer le fonctionnement.

Autres exemples de données utiles :

  • Pour le contrôle de luminosité de la LED blanche :
    • {"command": "WHI", "w": 75}
  • Pour le contrôle des couleurs selon la méthode HSB :
    • {"command": "HSB", "hue": 255, "sat": 50, "bri": 80}

Envisager de nouvelles applications

Nous avons réalisé une belle démo dans laquelle nous pouvons exécuter un script Python depuis le shell, ou le configurer pour qu'il démarre lors de l'initialisation du Pi. Ce code est une méthode de contrôle simple et rapide de la carte LED RGBW via MQTT en utilisant un format de données utiles de message JSON simple.

Nous pouvons maintenant modifier la couleur de la lumière en fonction des relevés des autres capteurs connectés à notre Pi ou notre réseau, par exemple un capteur de température locale. Il est possible de connecter et de contrôler d'autres LED et cartes en apportant quelques modifications au code. Avec MQTT, les possibilités d'applications de l'Internet des objets (IoT) sont nombreuses et passionnantes !

 

maker, hacker, doer