Communiquer avec le port série d'Arduino et NodeJS sous Docker

Environnement Docker  / NodeJS / Nodered / Arduino 

Pourquoi ?

NodeJS est un environement de développement adapté pour communiquer avec arduino et offre de nombreuses librairies de prise en charge de capteurs et de cartes, notamment la très pratique Johnny Five. Le principal problème rencontré est l'utilisation du module SerialPort, qui selon les environnements de développement, peut poser des soucis à l'installation (présence d'outils de développement, versions de python, etc). 

Cette page explique comment configurer un container docker prêt à l'emploi, commun, sur lequel s'appuyer pour des séances de TP.

Principe

Sous Windows et Mac, le Daemon Docker s'exécute au sein d'une machine ou d'un hyperviseur. Il faut donc trouver le moyen d'accéder à un Arduino dans un container Docker, lui même exécuté dans une machine. On se sert ici de VirtualBox pour présenter l'interface USB à Docker.

Arduino <—— USB——> VM [ Docker [ Container] ]

Outils à installer

- Docker

- Virtual box, 6.06 min (les versions antérieures plantent lors de la configuration USB)

- Extension virtual box (support usb2/3)

Etapes

1. créer une machine nommée nodered

docker-machine create nodered

 

2. stopper la machine pour modifier les paramètres USB

docker-machine stop nodered

 

3. activer le port USB 2

vboxmanage modifyvm nodered --usb on vboxmanage modifyvm nodered --usbehci on

 

4. activer la VM

docker-machine start nodered

 

5. passer au shell les infos de la machine. 

eval $(docker-machine env nodered)

 

on peut en profiter pour récupérer l’IP pour les étapes suivantes 

echo $DOCKER_HOST

 

6. lister les ports USB disponibles sur l’hôte, et repérer l’arduino ou le clone (ici Seeeduino)

vboxmanage list usbhost UUID: 5e880284-165c-42e6-af3d-fd5864e7e5c4 VendorId: 0x10c4 (10C4) ProductId: 0xea60 (EA60) Revision: 1.0 (0100) Port: 2 USB version/speed: 0/Full Manufacturer: Silicon Labs Product: CP2102N USB to UART Bridge Controller SerialNumber: 0001 Address: p=0xea60;v=0x10c4;s=0x000093314165ffca;l=0x14520000 Current State: Busy

 

7. Ajouter un filtre USB pour attacher l’arduino à la VM

vboxmanage usbfilter add 0 --target default --name USBUART --vendorid 0x10c4 --productid 0xea60

 

8. Lancer en tâche de fond un container nodered dans cette machine

- Cette étape télécharge une image standard linux avec l’environnement nodered et les outils de développement nodejs (nodered/node-red-docker)

- Le port 1880 est mappé de cible vers hôte, le port USB est accessible en tant que /dev/ttyUSB0

- Un dossier de partage de fichier est monté dans le container au point /share

docker run -d -p 1880:1880 --device /dev/ttyUSB0 --name nodered_tty nodered/node-red-docker -v ~/david/dossierpartage:/share

 

On peut utiliser une image réduite, mais sans outils de compilation permettant d’installer des librairies natives telles que Serial

docker run -d -p 1880:1880 -v ~/david/truc:/share --device /dev/ttyUSB0 --name nodered_slim4 nodered/node-red-docker:slim

 

9. Changer la permission du ttyUSB0 en exécutant la commande chmod avec l’utilisateur root

docker exec -u 0 -it nodered_tty bash -c "chmod a+rw /dev/ttyUSB0"

 

10. Tester l'installation du paquet serialport dans le container

docker exec -it nodered_tty bash node-red@4cf7e6d346a6:~$ npm install serialport > @serialport/bindings@2.0.8 install /usr/src/node-red/node_modules/@serialport/bindings > prebuild-install --tag-prefix @serialport/bindings@ || node-gyp rebuild + serialport@7.1.5 added 46 packages from 27 contributors and audited 1561 packages in 10.763s found 1 high severity vulnerability run `npm audit fix` to fix them, or `npm audit` for details ╭───────────────────────────────────────────────────────────────╮ │ │ │ New minor version of npm available! 6.4.1 -> 6.9.0 │ │ Changelog: https://github.com/npm/cli/releases/tag/v6.9.0 │ │ Run npm install -g npm to update! │ │ │ ╰───────────────────────────────────────────────────────────────╯

 

12. Tester un script js avec lecture du port /dev/ttyUSB0

node-red@64e5c41a2328:~/arduino$ node arduino.js Initialisation Arduino 1 open /dev/tty... data : A data : A ...

A cette étape, l'arduino est normalement reconnu et opérationnel !

 

Configuration dans l'environnement NodeRed

13. Dans le navigateur, se rendre à l’adresse IP:1880 du container (cf. étape 5), et installer le module node-red-node-serialport à l'aide du menu  Manage Palette