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