Accueil | Objets Connectés | MQTT | Node-RED + MQTT + ESP8266 : comment piloter un système articulé PTZ en WiFi

Node-RED + MQTT + ESP8266 : comment piloter un système articulé PTZ en WiFi

Nous continuons notre série d’articles sur le pilotage à distance de servomoteur et plus particulièrement les systèmes articulés PTZ (Pan-Tilt). Dans les tutoriels précédents, nous avons vu comment faire pour piloter un servo depuis un smartphone à l’aide des librairies pour IoT Cayenne et Blynk. Aujourd’hui, nous allons apprendre comment faire en utilisant Node-RED. Pour communiquer avec l’ESP8266 en WiFi (ou depuis internet), nous utiliserons le protocole de communication MQTT (broker Mosquitto).

Comment ça marche ?

Voici un schéma qui présente comment on va piloter le système articulé PTZ. Nous allons utiliser le module Dashboard UI de Node-RED pour créer 2 sliders (Pan, Tilt). A chaque modification Node-RED publie un message MQTT. Par exemple servo/pan, 92. Le message est transmis sur le réseau local en WiFi à l’ESP8266. La librairie PubSubClient permet de s’abonner à serveur (Broker) MQTT et de recevoir les messages. Après décodage du message, on déplacer le servomoteur concerné à la position angulaire demandée.

Node-RED MQTT ESP8266 PTZ servo workflow

De quoi avez-vous besoin ?

Vous aurez donc besoin d’un ordinateur sur lequel est installé Node-RED. Si vous avez besoin de savoir comment faire, choisissez le tutoriel qui correspond à votre environnement :

Vous aurez également besoin d’un serveur (broker) MQTT. Il en existe plusieurs. Ici, nous utiliserons Mosquitto. Suivez l’article qui correspond à votre environnement pour l’installer.

Matériel utilisé

esp8266 Wemos D1 miniWemos D1 Mini
chargeur raspbery pi 3 5v 3000maAlimentation 5V/3A micro-usb
mini kit fpv pan tilt sg90Mini Kit FPV Pan Tilt avec 2 servos SG90
jumper dupontJumper Dupont
breadboardBreadboard

Circuit

Le circuit est identique aux tutoriels précédents.

node-red+mqtt+esp8266+ptz pan tilt kit

Code Arduino

Pour recevoir (ou envoyer) des messages avec le protocole MQTT, nous allons utiliser la librairie PubSubClient (documentation officielle)

Installation des librairies dans l’IDE Arduino

Avant d’aller plus loin, ouvrez le gestionnaire de librairie et installez les librairies suivantes :

ESP8266

ide arduino install servo esp8266 library

servo(esp8266)

 ide arduino install servo esp8266 library

PubSubClient

 ide arduino install pubsubclient esp8266 library

Comment fonctionne la librairie PubSubClient ?

Ici, nous ne rentrerons pas dans le détail de la connexion au réseau WiFi géré par la librairie ESP8266WiFi. Nous allons uniquement regarder comment s’abonner à plusieurs Topics MQTT et traiter les messages entrants.

La librairie PubSub a besoin d’un objet qui contient la connexion au réseau WiFi. On commence par créer un objet à l’aide de la classe WiFiClient comme ceci

Ensuite, on créé un objet client

Vous trouverez 3 variables au début du programme

  • const char* mqtt_server = “xxx.xxx.xxx.xxx” : c’est l’adresse IP de votre serveur (Broker) MQTT
  • const char* topic_pan = “servo/pan” : topic qui contient l’angle du servo Pan
  • const char* topic_tilt = “servo/tilt” : Topic qui contient l’angle du servo Tilt

Dans la fonction setup(), on réalise les opérations suivantes

  • On attache chaque servo sur le Pin qui lui correspond. Par exemple Pan sur D5 et Tilt sur D6
  • On appel la fonction setupWiFi()  qui s’occupe de connecter l’ESP8266 au réseau WiFi local
  • On se connecte au broker MQTT sur le port 1883 (le port par défaut) client.setServer(mqtt_server, 1883)
  • Enfin on définit une fonction callback qui sera appelée à chaque fois qu’un MQTT message est reçu client.setCallback(callback)

Réception des messages MQTT dans le programme Arduino

La fonction callback (documentation) permet donc de récupérer les messages entrants. Elle contient le topic, le message (payload) et la longueur du message. Avant de pouvoir traiter le message, il faut le convertir en string. Il n’y a aucun helper pour décoder les messages qui arrivent sous la forme d’un tableau de byte. Heureusement, on trouve beaucoup d’exemples sur internet. Voici comment décoder le message entrant

La fonction servo.write(position) acceptant en entrée en entier, on devra convertir le message (payload)

Pour déterminer si on doit déplacer le Pan ou le Tilt, on va utiliser la fonction de comparaison de chaînes strcmp. Il renvoi le nombre de caractères différents entre les 2 chaines. S’il n’y a aucune différence (retour = 0), c’est que les deux chaines sont identiques. Ce qui va par exemple nous donner pour le Topic Pan :

Code Arduino complet

Voici le code Arduino complet. Créer un nouveau sketch et modifier les paramètres dans le code avant de téléverser :

  • SSID, Password
  • Adresse IP broker MQTT
  • Broche servo Pan et tilt

Flow Node-RED

Pour ce flow Nod-RED, vous aurez besoin d’installer plusieurs modules. Ouvrez le gestionnaire de palette (tutoriel complet) et installez les modules suivants

Importez ce code Node-RED directement sur un flow

node-red ptz servo control esp8266 wemos d1 mini flow

Que fait ce flow ?

On dispose de 2 sliders pour commander la position du servo Pan et du servo Tilt. Un bouton Reset permet de repositionner les 2 servos à 90°. Enfin une boucle repeat permet de faire un scan avec un pas de 10° dans chaque direction (Pan et Tilt).

node-red ptz servo control esp8266 wemos d1 mini

Réception des messages MQTT

Vous pouvez écouter les messages qui transitent sur le réseau MQTT à l’aide d’un client. Vous pouvez par exemple utiliser MQTT.fx (disponible pour Linux,  macOS et Windows, la page de téléchargement). Lancez MQTT.fx et connectez vous au Broker. Souscrivez (subscribe) au topic servo/#. Le # permet de récupérer tous les messages de l’arborescence. Ici pan et tilt.

node-red mqtt mqttfx

Test en fonctionnement

Après avoir téléversez le programme dans l’ESP8266 et déployé le flow Node-RED, ouvrez le dashboard depuis n’importe quel navigateur internet. Vous pouvez également piloter le système articulé depuis le navigateur internet d’une tablette ou d’un smartphone. Ouvrez la page à l’adresse

Voici une petite vidéo de démonstration pour terminer l’article.