Dans le tutoriel précédent, nous avons découvert le framework Johnny-Five qui permet de créer des objets connectés (et bien plus) à base d’Arduino, Raspberry Pi (ou Orange Pi) en Javascript. Johnny-Five est également une très bonne solution pour remplacer le GPIO d’un Orange Pi par un Arduino Nano v3.

 

Dans les tutoriels précédents, nous avons utilisé un Arduino connecté à un port USB. Dans ce tutoriel, nous allons utiliser le Firmata WiFi (librairie StandardFirmataWiFi) disponible depuis l’IDE Arduino qui vous nous permettre de communiquer avec un ESP8266 en Wi-Fi. Si le sujet vous intéresse, voici d’autres tutoriels pour aller plus loin

Pourquoi ne pas utiliser le projet Firmware Serial UDP ?

Si vous faites un recherche sur internet avec les mots clés ESP8266 Johnny-Five, vous trouverez également ce projet de firmware Serial UDP. Ce firmware est disponible sous la forme d’un binaire qui s’installe à l’aide de l’outil esptool.py d’Espressif (lisez cet article pour en savoir plus).  Il vous faudra au préalable installer Python 2.7 sur votre ordinateur. J’ai rencontré des difficultés pour me connecter à un ESP8266. C’est probablement une erreur de configuration. Le code source n’étant pas proposé sur GitHub (ou une autre plateforme), je vous conseille plutôt d’utiliser le firmwareWiFi qui fonctionne très bien. Il est plus simple à installer et il est entièrement configurable.

Installer le firmware StandardFirmataWiFi sur l’ESP8266

Le firmware StandardFirmataWiFi permet d’accéder à toutes les fonctionnalités de l’Arduino via une liaison série par TCP. Il est compatible avec les shields Arduino, Shield 101, cartes MKR1000 et tous les ESP8266. Vous pouvez par exemple ajouter un ESP-01 à un Arduino Uno, ce qui est beaucoup moins cher qu’un Shield WiFi.

Connectez l’ESP8266 à l’ordinateur et ouvrez l’IDE Arduino. Dans le menu des examples, vous trouverez un sous-menu nommé Firmata. Sélectionnez le firmware StandardFirmataWiFi.

ide arduino install firmata

Par défaut, le débogage est désactivé. Cherchez la ligne contenant la chaine #define SERIAL_DEBUG est enlevez les commentaires (//).

Allez ensuite dans le fichier wifiConfig.h pour configurer les paramètres de connexion

  • Step 3 (ou chercher ssid) : indiquer le réseau WiFi sur lequel l’ESP8266 doit se connecter
  • Step 4 : permet d’indiquer un IP fixe (STATIC_IP_ADDRESS). Dans ce cas, il faudra aussi renseigner le masque de sous-réseau (SUBNET_MASK) et l’IP du routeur (GATEWAY_IP_ADDRESS)
  • Step 5 : SERVER_PORT, le port de connexion au serveur
  • Step 6 : le type de sécurité du réseau WiFi. Par défaut WPA (WIFI_WPA_SECURITY). Compléter le mot de passe correspondant au type de sécurité (wpa_passphrase pour le WPA).

La configuration est terminée. Téléverser le programme, c’est terminé !

Pour vérifier que tout est correct, ouvrez le moniteur série à 9600 baud. Vous pourrez également récupérer l’adresse IP de l’ESP8266 si vous ne l’avez pas fixée.

Exemple : piloter une led, lecture d’un BMP180 en WiFi

Passons au test maintenant. Nous allons reprendre l’exemple précédent et l’adapter à la nouvelle configuration.

Matériel nécessaire

Circuit

La Led est branchée sur la broche D3 (GPIO-0). Sur la Wemos D1 mini, le bus I2C (SDA – D2, SCL – D1).

Blynk ESP8266 firmata wifi nodejs johnny-five led bmp180_bb

Code Javascript

Pour établir la communication avec l’ESP8266 nous allons installer le packages npm etherport-client (page du package)

sudo npm install firmata etherport-client

Une fois que l’installation est terminée, créez un nouveau script

cd ../..
cd nodebot
nano j5ESPDemo.js

Au début du script, on va initialiser l’objet qui vous nous permettre d’établir la connexion série avec l’ESP8266 en WiFi

var EtherPortClient = require("etherport-client").EtherPortClient;

Pour se connecter à l’ESP8266, il faut juste créer un objet EtherPortClient. Cet objet nécessite deux paramètres, l’adresse IP de l’ESP et que le port.

var board = new five.Board({
  port: new EtherPortClient({
    host: "xxx.xxx.xxx.xxx",  // IP ESP8266
    port: 3030                
  }),
  timeout: 10000,
  repl: false
});

pour le reste, la programmation est parfaitement identique aux tutoriels précédents.

Pourquoi le package npm Firmata n’est pas utilisé ?

Sur internet, vous trouverez de nombreux tutoriels qui établissent la communication au travers du package Firmata. Ce package permet de piloter le GPIO de l’Arduino en javascript. C’est également l’objectif du framework Johnny-Five. L’API complète de gestion de la carte est détaillée ici. A mon sens, il n’est donc pas utile de rajouter cette “sur-couche” à vos projets. Je n’ai rencontré aucune difficulté pour communiquer en I2C avec le BMP180 et piloter le GPIO depuis l’application Blynk.

ESP8266 + Johnny-Five + Blynk

Allons encore un peu plus loin en intégrant l’ESP8266 à Blynk. Grâce à Johnny-Five vous n’aurez aucune programmation à faire sur l’ESP8266. Si vous débutez avec Blynk, commencez ici. Voici un schéma qui montre l’architecture du système. Tout se passe en WiFi :

  • L’application Blynk fonctionne sur un smartphone (ou tablette) connecté en WiFi au serveur Blynk local
  • Le serveur Blynk fonctionne sur un Raspberry Pi 3 connecté au réseau local en WiFi.
  • Le code javascript peut être exécuté sur le serveur Blynk. Ici, il est exécuté sur un Orange Pi Lite (WiFi, 512Mo) lui même connecté en WiFi au serveur Blynk local.
  • La Wemos d1 mini fonctionne sur batterie à l’aide d’un Shield Battery et d’une batterie LiPo 1100mAh.

Blynk Nodejs Johnny-Five ESP8266-Firmata BMP180 raspberry orange pi

 

Projet Blynk

Créer un nouveau projet et ajouter :

  • 2 Jauges (V0 pour la température et V1 pour le baromètre)
  • 1 bouton de type switch (V2)

esp8266 johnny-five blynk

Code Javascript

Collez le code du projet dans un nouveau script en modifiant les paramètres suivants :

  • Token : le token du projet Blynk reçu par email
  • IP du serveur Blynk local (comment installer un serveur Blynk local sur Raspberry Pi)
  • IP ESP8266
  • Port
var Blynk = require('blynk-library');
var five = require("johnny-five");
var EventEmitter = require('events').EventEmitter;
var EtherPortClient = require("etherport-client").EtherPortClient;

var AUTH = 'b065eb0a6e36434da42367b3fa7c3340';  // Remplacer par votre Token Blynk - Replace by your Blynk Token

var event = new EventEmitter();                 // Evenements javascript - Javascript Events
var DEBUG = true; //false;                      // Active les messages de mise au point - Activate debug message

// Setup Blynk
var blynk = new Blynk.Blynk(AUTH, options = {
  // Connecteur au serveur Blynk local - Local Blynk server connector
  connector : new Blynk.TcpClient( options = { addr:"IP_SERVEUR_BLYNK", port:8442 } )
});

var V0 = new blynk.VirtualPin(0);  // Temperature
var V1 = new blynk.VirtualPin(1);  // Barometer
var V2 = new blynk.VirtualPin(2);  // On/Off led
var temp, pa;

blynk.on('connect', function() { console.log("Blynk ready."); });
blynk.on('disconnect', function() { console.log("DISCONNECT"); });

// update host to the IP address for your ESP board
var board = new five.Board({
  port: new EtherPortClient({
    host: "192.168.1.73",
    port: 3030
  }),
  timeout: 10000,
  repl: true,
  debug: true
});

board.on("ready", function() {
  console.log("READY!");
  var led = new five.Led(0);

  var bmp180 = new five.Multi({
    controller: "BMP180",
    freq: 5000
  });

  bmp180.on("change", function() {
    console.log("Temperature BMP180   ", this.thermometer.celsius, "°C");
    console.log("Atm. Pressure BMP180 ", this.barometer.pressure * 10 , "hPa");
    temp = this.thermometer.celsius;
    pa = this.barometer.pressure * 10;
  });

  board.on("exit", function(){
    led.stop();
    led.off();
  });
  event.on('V2', function(param){
    if ( param == 1 || param == true ) {
      if ( DEBUG ) { console.log("Start strobe led"); }
      led.strobe(500);
    } else {
      if ( DEBUG ) { console.log("Stop strobe Led"); }
      led.stop();
      led.off();
    }
  });

});

setInterval(function() {
  if ( temp != undefined ) {
    if ( DEBUG ) { console.log('Temperature:', temp + ' C'); }
    V0.write(temp);
  }
  if ( pa != undefined ) {
    if ( DEBUG ) { console.log('Humidity:   ', pa    + ' hPa'); }
    V1.write(pa);
  }
}, 5000);

V2.on('write', function(param){
  if ( DEBUG ) { console.log("V2 ", param); }
  event.emit('V2',param);
});

Enregistrez avec CTRL + X puis Y puis exécutez le script node j5ESPDemo.js

node j5ESPBlink.js 
Connecting to TCP: 192.168.1.24 8442
1491226899573 SerialPort Connecting to host:port: 192.168.1.73:3030  
1491226899605 Connected Connecting to host:port: 192.168.1.73:3030  
Connected
Authorized
Blynk ready.
1491226905821 Repl Initialized  
>> READY!
Temperature BMP180    20.9 °C
Atm. Pressure BMP180  983.7 hPa
V0  [ '1' ]
Start strobe led
Temperature BMP180    20.9 °C
Atm. Pressure BMP180  983.67 hPa
V0  [ '0' ]
Stop strobe Led
Temperature BMP180    20.9 °C
Atm. Pressure BMP180  983.63 hPa

Comme vous pouvez le voir sur cette photographie, la Wemos fonctionne sur batterie (1100 mAh). Ce n’est pas une situation idéale, car on ne peut pas profiter de la mise en veille de l’ESP8266. C’est un bon exemple d’architecture qui pourrait être mis en place pour développer une télécommande.

esp8266 firmatawifi nodejs johnny-five bmp180 i2c led orange pi lite raspberry pi 3

Voilà, en installant le firmware StandardFirmataWiFi nous avons coupé le cordon entre l’ordinateur (ou le mini PC Raspberry Pi…) et l’ESP8266. En quelques lignes de code, il est très simple de piloter ou récupérer des mesures depuis un ESP8266 en WiFi.

 

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous désinscrire à tout moment.

Promos à ne pas louper

9
Poster un Commentaire

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

  S’abonner  
Notifier de
Antoine

Bonjour, je suis sur un projet arduino et j’aimerai le faire via jhonny-five et nodejs. J’aimerai donc connecter en wifi, mon arduino mega qui est relié en filaire à un ESP8266, à mon serveur raspberry pi. Seulement je n’arrive désespérément pas à installer standart Firmata wifi sur l’ESP8266, faut t’il l’installer sur l’esp8266 via un FTDI ou directement l’installer sur l’arduino et dans ce cas je n’ai rien à faire sur l’esp8266 ?
Perso j’ai un peu beaucoup de mal avec l’esp8266 …

Merci beaucoup pour votre aide 🙂
Antoine

Bonjour Antoine. Lorsque l’ESP8266 est connecté à un Arduino (Uno ou Mega), il ne faut plus le considérer comme un ESP8266 mais comme une “simple” antenne WiFi. Tu peux suivre ce tutoriel pour le branchement http://electroniqueamateur.blogspot.fr/2015/08/module-wifi-esp8266-test-et.html L’ESP8266 se comporte alors de manière transparente, il renvoi à l’Arduino les messages reçus et renvoi les messages en provenance de l’Arduino au serveur Johnny-Five via le réseau WiFi. Il n’y a donc rien à installer (ou du moins, il faut réinstaller le firmware Nodemcu d’origine en suivant cet article https://projetsdiy.fr/esp-01-esp8266-flasher-firmware-origine/). Il existe une autre solution 100% ESP8266 si ton projet ne dépasse pas… Lire la suite »

Antoine

Merci c’est bien la solution esp8266 + arduino qu’il me faut. Maintenant je n’arrive pas encore à flasher l’esp8266 (cf https://projetsdiy.fr/esp-01-esp8266-flasher-firmware-origine/#Avant_decommencer_avec_l8217ESP8266 dans les commentaires) mais déjà ça avance 😉 merci beaucoup pour ton aide.
Antoine

Antoine

Bonjour, j’ai encore un soucis quand je veux téléversé le prog StandardFirataWifi j’ai ce message d’erreur : In file included from D:ArduinoESP8266StandardFirmataWiFiStandardFirmataWiFi.ino:97:0: sketchwifiConfig.h:88:25: fatal error: ESP8266WiFi.h: No such file or directory #include ^ compilation terminated. Plusieurs bibliothèque trouvées pour “Firmata.h” Utilisé : D:ArduinoProgramme arduinolibrariesFirmata Non utilisé : D:ArduinoArduino_installArduinolibrariesFirmata exit status 1 Erreur de compilation pour la carte Arduino/Genuino Uno Ducoup je pense que c’est la librairie ESP8266Wifi.h qui ne doit pas être installé mais je ne la trouve pas dans le gestionnaire de bibliothèque.Sais-tu comment faire ? Merci beaucoup pour ton aide 🙂 Antoine

Bonsoir Antoine. Tu as du sélectionner la mauvaise carte.

Antoine

J’ai compiler pour la carte Arduino/Genuino Uno, il faut sélectionner Generic esp8266 module ?

Oui si t’as carte n’est pas dans la liste. Sinon, il faut la sélectionner dans la liste pour avoir la bonne configuration. réduit la vitesse de port série (115200b) pour éviter les erreurs

Antoine

J’ai ce message d’erreur :

Les options de compilation ont été modifiées, tout sera recompilé
Archiving built core (caching) in: C:UsersANTOIN~1AppDataLocalTemparduino_cache_749024corecore_esp8266_esp8266_generic_CpuFrequency_80,FlashFreq_40,FlashMode_dio,UploadSpeed_115200,FlashSize_512K64,ResetMethod_ck,Debug_Disabled,DebugLevel_None_____f7c928dd58685cee5197197b9c213096.a

mais ça à l’air de marcher quand même vu qu’il me dit “le croquis utilise … octets…” Y a plus qu’a essayé 😉 merci 🙂

Parfait ! Le projet avance. Bon courage ++

Domotique et objets connectés à faire soi-même