Débuter avec Johnny-Five. IoT et robotique facile avec Arduino, Raspberry Pi, Orange Pi • Domotique et objets connectés à faire soi-même

Johnny-Five est une librairie Javascript Open Source permettant le développement rapide et facile d’objets connectés ou de petits projets robotique (bras articulé, voiture radio-commandée…). Dans le tutoriel précédent, nous avons vu comment remplacer le GPIO de l’Orange Pi qui pêche par son manque de librairies par un Arduino Pro Micro 5V/16MHz.

Nous avions utilisé Node-RED pour piloter le GPIO de l’Arduino. Dans ce tutoriel, nous allons débuter la programmation en javascript avec le package Johnny-Five.

Présentation du package Johnny-Five (J5) pour NodeJS

knvksa6j0aylcp0f4txy-3763498

Johnny-Five est un projet Open Source très populaire destiné à la programmation d’objets connectés ou robotique en Javascript (page officielle). Le nom a été inspiré du personnage du film Short Circuit dont voici un petit extrait pour le plaisir de re-découvrir.

J5 supporte un grand nombre de cartes de développement, dont les plus courantes  Arduino Uno, SparkFun RedBoard, Arduino Leonardo, Arduino Mega, Arduino Fio, Arduino Micro, Arduino Mini, Arduino Nano, Arduino Pro Mini, BotBoarduino, chipKit Uno32, Spider Robot Controller, DFRobot Romeo, Teensy 3, BeagleBone Black, CHIP, Blend Micro v1.0, Electric Imp April, Intel Galileo Gen 1, Intel Galileo Gen 2, Intel Edison Arduino, Intel Edison Mini….

Présentation du projet

Nous allons utiliser un Arduino Nano v3 5V/16MHz pour remplacer le GPIO de l’Orange Pi Lite. L’Arduino fonctionnera avec le firmware Firmata. Une led est branchée sur la broche D9. Un bouton permettra de démarrer / arrêter le clignotement de la Led. Enfin un BMP180 permettra de comprendre comment utiliser le bus I2C.

Pour ce tutoriel, vous pouvez utiliser n’importe quel modèle d’Orange Pi (ici un Orange Pi Lite – WiFi – 512Mo) fonctionnant sous Armbian.

Vous pouvez également le faire fonctionner sur un Raspberry Pi (le GPIO de ce dernier ne sera pas exploité).

Matériel utilisé

Circuit

Installer le firmware Firmata depuis l’IDE Arduino

Le firmware Firmata permet d’accéder à toutes les fonctionnalités de l’Arduino via le port série (à l’aide d’un câble USB). Connectez la carte à l’ordinateur et ouvrez l’IDE Arduino. Dans le menu des examples, vous trouverez un sous-menu nommé Firmata.

Sélectionnez le firmware qui correspond à votre besoin. Le plus courant est d’utiliser le firmware Standard. Le StandardFirmataPlus permet de communiquer avec des périphériques par liaison série UART, USART ou SoftwareSerial.

fdnmj9bvbq4wyoefgnfk-5476439

Téléversez le firmware sur l’Arduino comme n’importe quel autre croquis.

C’est prêt ! Pour personnaliser le firmware, lisez cet article.

Installer Node.js sur Armbian ou Raspberry Pi OS (ancien Raspbian)

Node.js est un moteur d’exécution (runtime) qui permet de faire fonctionner des scripts Javascript sur un ordinateur ou un mini-PC (Raspberry Pi, Orange Pi…). C’est un moteur multi-plateforme, c’est à dire que le code écrit sur un environnement pourra fonctionner à l’identique (à condition que les ressources matérielles existent également) sur un autre environnement.

Node.js est disponible pour Windows, macOS, Linux (x86 et ARM).

Commencez par vérifier que Node.js n’est pas déjà installé sur votre distribution

# node -v && npm -v
v5.12.0
3.8.6

Si vous obtenez un message d’erreur, installez Node.js 4.x (ou supérieur) ainsi que Python et Build

curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -
sudo apt-get install -y build-essential python-dev nodejs

Installer le package J5 pour NodeJS

J5 s’installe très simplement à l’aide de la commande install de npm.

npm, le gestionnaire de package de Node.js a été installé en même temps. Exécutez cette commande pour installer le package Johnny-Five pour Node.js

npm install -g johnny-five

Un programme simple pour débuter : faire clignoter une Led

Commençons par un programme simple pour comprendre le principe de fonctionnement du Javascript et de la librairie Johnny-Five. Placez vous à la racine de la carte SD, créez un nouveau répertoire (par exemple nodebot) puis un nouveau fichier (strobe.js par exemple)

cd ../..
mkdir nodebot && cd nodebot;
nano strobe.js/code>

En Javascript, on utilise la commande require pour charger des dépendances. On définit un objet (ici five) qui permettra d’appeler l’API Johnny-Five (J5).

var five = require("johnny-five"),

La première chose à faire est de créer une carte. Par défaut, Jonny-Five va scanner les ports USB à la recherche d’une carte compatible. Dans ce cas, il n’y a qu’une simple déclaration à faire

board = new five.Board();

Vous pouvez avoir plusieurs cartes attachées à votre Orange Pi (ou Raspberry Pi). Dans ce cas on pourra indiquer le port USB, ou le port COM sous Windows. On peut aussi définir d’autres paramètres comme la vitesse (baudrate), pinmode, configurer le bus I2C… Tout est détaillé ici.

Il est obligatoire d’attendre que la carte soit prête (ready) avant de piloter la led. On récupère l’état en écoutant l’événement javascript ready. On pourra alors appeler une (des) fonction(s) ou mettre du code dans la fonction.

board.on("ready", function() {
  // Code ou appel d'une autre fonction
  // Code or call other function
});

Ici on va exécuter le code directement dans la fonction. On attache la Led à la broche puis puis on appel la pro

Ensuite on doit définir l’objet que l’on veut utiliser. Ici, on va attacher une Led sur la broche 13 de l’Arduino (initialisation) puis on appel la méthode strobe() qui va la faire clignoter à une fréquence de 250ms.

var led = new five.Led(13);
led.strobe(250);

Enfin, on va arrêter proprement la led lors de l’arrêt du programme. Pour arrêter un script, il suffit de taper deux fois au clavier CTRL + C ou de saisir .exit dans la console (ce qui n’est pas toujours possible s’il y a de nombreux message de log). Pour cela, on va brancher un traitement en écoutant l’événement exit. Pour arrêter le clignotement (strobe), on appel la méthode stop(). Mais stop se contente d’arrêter toutes les méthodes en cours de fonctionnement en laissant les actionneurs dans leur état actuel. Il faut donc appeler led.off() pour être certain d’éteindre la led.

board.on("exit", function(){
  led.stop();  
  led.off();
});

Collez le code complet du projet puis enregistrer avec CTRL+X puis Y.

var five = require("johnny-five"),
board = new five.Board();   // Cree un carte J5 - create J5 board

board.on("ready", function() {
  // Cree une Led sur la broche 13 - Create an Led on pin 13
  var led = new five.Led(13);
  
  // Fait clignoter la led (on/off) avec une frequence de 100ms
  // Strobe the pin on/off, defaults to 100ms phases
  led.strobe(250);
  
  // Arrête le clignotement et éteint la led à l'arrêt (.exit)
  // Stop strobe and power off the led on .exit 
  board.on("exit", function(){
    led.stop();  
    led.off();
  });
});

Lancez le script avec la commande node strobe.js ou node strobe . Johnny-Five recherche la carte Arduino puis fait clignoter la Led jusqu’à ce que le script soit arrêté avec la combinaison de touche CTRL + C (2 fois) ou la commande .exit

root@orangepilite:~/nodebot# node strobe
1489998297086 Device(s) /dev/ttyUSB0  
1489998297172 Connected /dev/ttyUSB0  
1489998298753 Repl Initialized  
>>

Démarrer/arrêter le clignotement de la led avec un bouton

Allons un peu plus loin maintenant. Nous allons ajouter un bouton pour arrêter/démarrer le clignotement de la Led. C’est la classe Button qui s’occupe de gérer les boutons dans Johnny-Five. La documentation complète se trouve ici.

Au début du programme, on va ajouter une variable qui permet de stocker l’état de la led.

var ledStatus = false;

On dispose de plusieurs paramètres pour définir un bouton. Au minium, on doit indiquer la broche sur laquelle il est branché  le bouton :

  • pin broche
  • invert la logique du bouton est inversée
  • isPullup initialise le bouton avec une résistance de rappel.
  • holdtime temps en millisecondes durant lequel le bouton doit être maintenu appuyé pour déclencher un événement “hold”
var button = new five.Button({
  pin:9,
  isPullup: true
});

On peut intercepter 3 événements sur un bouton :

  • hold le bouton a été maintenu pendant au minimum le temps indiqué précédemment
  • press ou down le bouton vient d’être appuyé
  • up ou release bouton vient d’être relâché

Ici on va intercepter l’événement press, qui va appeler la fonction strobeLed() dès qu’on appuie sur le bouton

button.on("press", function(){
  strobeLed();
});

La fonction strobeLed() test l’état de la variable statusLed pour démarrer le clignotement ou au contraire l’arrêter.

function strobeLed(){
  if ( ledStatus == false ) {
    console.log("Start Strobe Led");
    ledStatus = true;
    led.strobe(250);
  } else {
    console.log("Stop Strobe Led");
    ledStatus = false;
    led.stop();
    led.off();
  }
}

Récupérer des mesures d’un BMP180 sur le bus I2C

Nous avons vu dans le tutoriel précédent que la classe Multi est en charge des capteurs renvoyant plusieurs mesures. C’est le cas du BMP180 qui permet de mesurer la pression atmosphérique et la température.

On va créer un objet BMP180 qui sera actualisé toutes les 5 secondes (5000 ms)

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

Ici, nous allons simplement envoyer vers la console les mesures à chaque changement de valeur (ce qui devrait arriver toutes les 5 secondes).

bmp180.on("change", function() {
  console.log("Temperature BMP180   ", this.thermometer.celsius);
  console.log("Atm. Pressure BMP180 ", this.barometer.pressure);
});

Nous verrons dans un prochain tutoriel comment les envoyer sur un serveur Blynk par exemple.

Code complet du projet Johnny-Five

Voici le code complet du projet qu’il vous suffit de coller dans un nouveau fichier.

var five = require("johnny-five"),
board = new five.Board();
var ledStatus = false;

board.on("ready", function() {
  // Cree une Led attachee a la broche 13 - Create an Led on pin 13
  var led = new five.Led(13);
  // Cree un bouton attache a la broche 9 - Create a button on pin 9
  var button = new five.Button({
    pin:9,
    isPullup: true
  });
  // Cree un objet multi pour le BMP180 - Create a multi object for the BMP180 sensor
  var bmp180 = new five.Multi({
    controller: "BMP180",
    freq: 5000
  });
  
  // Affiche les mesures du BMP180 dans la console - display BMP180 value on the console
  bmp180.on("change", function() {
    console.log("Temperature BMP180   ", this.thermometer.celsius);
    console.log("Atm. Pressure BMP180 ", this.barometer.pressure);
  });
  
  // Bouton appuye, demarre ou stop le strobe - Button pressed, start or stop strobe
  button.on("press", function(){
    strobeLed();
  });
  
  // arrete proprement la led a l'arret du script - clean stop the strobe when script stop
  board.on("exit", function(){
    led.stop();
    led.off();
  });
  
  // fonction qui demarre ou arrete le strobe en fonction de l'etat precedent
  // Function that start or stop the strobe depending the previous state 
  function strobeLed(){
    if ( ledStatus == false ) {
      console.log("Start Strobe Led");
      ledStatus = true;
      led.strobe(250);
    } else {
      console.log("Stop Strobe Led");
      ledStatus = false;
      led.stop();
      led.off();
    }
  }
});

Enregistrez le script (strobe2.js par exemple) et exécutez le avec la commande node strobe2.js. Dès que Johnny-Five aura démarré la communication avec l’Arduino/Firmata, vous commencerez à recevoir des mesures du BMP180 et vous pourrez piloter la Led.

# node strobe.js 
1490018472982 Device(s) /dev/ttyUSB0  
1490018473105 Connected /dev/ttyUSB0  
1490018474708 Repl Initialized  
>> Temperature BMP180    21.5
Atm. Pressure BMP180  97.483
Start Strobe Led
Temperature BMP180    21.6
Atm. Pressure BMP180  97.483

Vous avez maintenant un petit aperçu de la puissance de Johnny-Five et du javascript, un language très puissant et très simple à prendre en main. Le duo Arduino/Firmata – Johnny-Five rend l’Orange Pi aussi intéressant que le Raspberry Pi, mais c’est toujours frustrant de ne pas pouvoir utiliser les librairies raspi-io.

Avez-vous aimé cet article ?