L'impression 3D est un outil performant mais lent, parfois jusqu'à plusieurs jour pour des objets un peu volumineux. Surveiller le bon déroulement de l'impression durant tout ce temps est trop contraignant. Pour pouvoir faire cela sans être physiquement présent, nous fabriquons aujourd'hui notre système de surveillance à distance à l'aide d'une carte Raspberry Pi et d'une caméra !

Au menu :

  • installation et configuration d'un Raspberry Pi,
  • compilation et installation de programmes sur Linux,
  • utilisation du flux de diffusion vidéo mjpg-streamer,
  • utilisation du serveur de gestion d'impression 3D OctoPrint,
  • modélisation et impression 3D avec Tinkercad.

1. Le Raspberry Pi

Source : tutoriel « Configurer ton Raspberry Pi ».

1.1. La carte SD

Tel quel, le Raspberry Pi n'est qu'une simple carte électronique connectant entre eux des morceaux de métal. Pour le mettre en action, il nous faut installer un programme initial appelé Raspbian. C'est le système d'exploitation du Rapsberry Pi, comme Ubuntu ou Windows peuvent l'être pour un ordinateur. Pour ce faire, nous utilisons le logiciel Raspberry Pi Imager, qui télécharge et installe une image (i.e. une copie) de Raspbian sur une carte SD.

Durant cette étape, nous sommes amenés à choisir une version de Raspbian. Nous optons pour Raspberry Pi OS Lite (32-bit), car nous voulons privilégier les performances et ne nécessitons pas d'environnement graphique. Voilà, nous pouvons lancer l'écriture de l'image sur la carte SD.

Ceci fait, nous insérons la carte SD dans le Rapsberry Pi, branchons un écran en HDMI, un clavier en USB. En branchant l'alimentation, la carte démarre pour la première fois.

1.2. Premier démarrage

Nous nous connectons avec les identifiants par défaut : pi:raspberry (en faisant attention à la lettre a dans le mot de passe, car le clavier est par défaut disposé en QWERTY). Une fois connectés, nous avons accès à un terminal. Ce terminal permet d'écrire et d'exécuter des commandes : ce sont des logiciels textuels. Par exemple, la commande echo affiche le texte qu'on lui donne :

$ echo Bonjour le monde
Bonjour le monde

La première commande que nous exécutons est :

sudo raspi-config

raspi-config est la commande permettant de configurer le Raspberry Pi, et sudo indique qu'en tant qu'administrateur de la carte, nous avons le droit d'effectuer cette configuration. Ainsi,

  1. nous disposons le clavier en AZERTY,
  2. nous activons l'interface pour le SSH (afin de nous connecter au Raspberry Pi à distance lorsqu'il sera autonome),
  3. et nous connectons le Raspberry Pi au réseau Wi-Fi local.

Ceci fait, nous effectuons les dernières mises à jour du système, ça ne fait jamais pas trop de mal.

sudo apt-get update
sudo apt-get upgrade

1.3. Installation des programmes

Nous avons deux programmes à installer. Un premier, pour diffuser en continu le flux de la caméra : mjpg-streamer. Le second, pour avoir une interface de communication et de surveillance de l'imprimante, notamment les relevés de température et de position de la tête d'impression et du plateau : OctoPrint. Si cela vous intéresse, l'Annexe A détaille ce processus.

2. Le Routeur

Le Raspberry Pi est destiné à agir en tant que serveur, auquel se connecteront les clients qui voudront surveiller l'imprimante 3D. Le serveur et les clients forment un réseau.

Si ce réseau est « branché » au réseau Internet global, n'importe qui pourrait s'y connecter. C'est le cas de beaucoup de webcams et d'imprimantes, qui ne sont pas mêmes protégées par un mot de passe ; il existe même des moteurs de recherches spécialisés pour les trouver, par exemple Shodan. Mais même protégés, ces appareils (et l'Internet des objets en général) restent vulnérables. Le meilleur moyen pour nous d'éviter tout soucis est de se restreindre à un réseau local (i.e. séparé physiquement d'Internet).

Au vu de l'infrastructure réseau de la médiathèque, le plus simple, dans un premier temps, est d'utiliser un routeur Wi-Fi. Nous en avons justement un :

Pour l'installer, il suffit de le brancher et d'attendre qu'il démarre. À son dos est inscrit le mot de passe pour s'y connecter. Avec la commande sudo raspi-config, nous connectons le Raspberry Pi à ce réseau. Lorsque la connexion est établit, le routeur attribue une adresse au Raspberry Pi, appelée adresse IP. Nous allons en avoir besoin pour accéder au Raspberry Pi depuis les autres nœuds du réseau. Pour cela, nous utilisons la commande :

ifconfig -a

Cette commande affiche la configuration de toutes les interfaces réseau du Raspberry Pi, dont l'interface Wi-Fi. Nous notons l'adresse, dans notre cas, 192.168.0.101. Peut-être avez-vous remarqué que le début de cette adresse, 192.168.0 est une suite de nombres que vous avez déjà rencontré. En effet, cette plage d'adresses est spécifiquement utilisée pour les réseaux locaux, afin de ne pas se mélanger avec les autres.

Maintenant que nous connaissons cette adresse, nous pouvons connecter une autre ordinateur au réseau local, et nous connecter à distance au Raspberry Pi via SSH. SSH est un protocole de communication sécurisé, très utilisé pour se connecter à un serveur distant. Depuis l'ordinateur, dans un terminal, on exécute la commande :

ssh pi@192.168.0.101

Ici, pi est le nom de l'utilisateur avec lequel nous nous connectons, et 192.168.0.101 est l'adresse du serveur, le Raspberry Pi. On nous demande le mot de passe de l'utilisateur pi, qui était par défaut raspberry. Voilà, nous sommes connectés au serveur. Tout ce que nous allons taper et exécuter s'exécutera non pas sur notre ordinateur mais sur le Raspberry Pi !

3. La Caméra

3.1. Prendre une photo

Passons aux choses concrètes. Nous disposons d'une caméra adaptée pour le Raspberry Pi, aussi sont installation est très simple. Il nous suffit de brancher la nappe de câbles sur la carte, en faisant attention à ce que les parties de cuivre découvertes soient bien en contact avec les broches du Raspberry Pi.

Pour l'activer, nous utilisons notre connexion SSH sur la carte pour exécuter une seconde fois la commande sudo raspi-config, et activer l'interface de la caméra. Le Raspberry Pi redémarre. Nous nous y reconnectons, et viens l'heure du test. Pour prendre une photo, il faut utiliser la commande raspistill.

raspistill -o img_001.jpg

Voilà, la photo est prise. Comme on ne peut pas la visualiser sur le terminal, nous devons rapatrier l'image depuis le Raspberry Pi sur notre ordinateur. Le protocole SSH permet de faire cela, grâce à la commande scp.

scp pi@192.168.0.101:/home/pi/img_001.jpg .

Un nouveau fichier est apparu sur notre ordinateur. Nous l'ouvrons.

Bon. La balance des blancs est à refaire, mais la caméra fonctionne !

3.2. Diffusion en direct

Ensuite, nous allons utiliser le module mjpg-streamer pour diffuser en direct ce que voit la caméra. Rien de plus simple : un petit script est déjà présent pour démarrer le flux, nous l'exécutons.

./start.sh

Des informations sont affichées pendant quelques instants, puis le Raspberry Pi redevient plus calme. La diffusion a commencé. Pour y accéder, depuis notre ordinateur, nous ouvrons un navigateur et tapons l'adresse suivante :

http://192.168.0.101:8080

Notez l'utilisation de l'adresse 192.168.0.101, celle du Raspberry Pi. Le suffixe :8080 indique le port du serveur. Avec une analogie : si le serveur était une gare et les requêtes des trains, l'adresse serait Gare SNCF de Clermont-Ferrand et le port Voie G.

Notre navigateur affiche alors une page avec plusieurs onglets. En fouillant un peu, nous tombons sur le bon flux :

4. Le Serveur

Toutes les petites briques logicielles sont désormais en place. Nous pouvons désormais lancer le serveur principal, OctoPrint.

/home/pi/.local/bin/octoprint

Comme nous l'avons fait pour le flux vidéo, nous utilisons le navigateur de notre ordinateur pour nous rendre à l'adresse http://192.168.0.101:5000. L'adresse est la même, le port seul change. Nous sommes accueillis par un assistant de configuration.

Une fois cette phase de configuration terminée, nous avons accès à l'interface d'OctoPrint. Nous branchons le câble USB de l'imprimante sur le Raspberry Pi, et cliquons sur le bouton Connect depuis l'interface. Le Raspberry Pi est connecté à l'imprimante. L'onglet Temperature affiche désormais, en temps réel, la température du plateau et de la tête d'impression.

L'onglet Control affiche la vue en direct de la caméra.

Malheureusement, nous n'en avons pas tout à fait terminé avec le logiciel. En effet, il nous a fallut jusqu'alors démarrer manuellement les programmes gérant la diffusion vidéo et le serveur OctoPrint. En pratique, nous souhaitons simplement brancher le Raspberry Pi, et c'est tout. Pour faire cela, nous allons utiliser des services. Un service est un programme avec un statut spécial, on peut notamment lui demander de démarrer dès que le Raspberry Pi s'allume. Voir l'Annexe B pour plus de détails.

5. Montage du Raspberry Pi et de la caméra sur l'imprimante

5.1. Monture de caméra

Tout est prêt, il ne nous manque plus qu'à positionner le Raspberry Pi et la caméra autour de l'imprimante. Premièrement, il nous faut un bon angle de caméra. Pour cela, il existe des montures à imprimer en 3D. Nous choisissons celle-ci :

Ni une ni deux, nous lançons l'impression.

5.2. Support pour le Raspberry Pi

Petit problème : la monture n'était pas prévue pour le modèle exact de notre caméra. Ainsi, la connectique où est branchée la nappe de câbles vient buter contre le support, empêchant son insertion complète. Il nous faut donc insérer la carte de la caméra à l'envers ; mais cela raccourcit la longueur utilisable de la nappe, déjà trop courte. Aussi, nous manquons de jeu pour disposer le Raspberry Pi à un endroit convenable.

Le mieux serait d'asseoir le Raspberry Pi sur la bordure en haut de l'imprimante, mais elle est trop étroite. Nous pouvons tout de même nous en servir comme support pour des pieds porteurs que nous allons modéliser et imprimer nous-même !

Nous en imprimons deux :

Et voici le Raspberry Pi monté à sa place !

Nous pouvons donc désormais surveiller le bon déroulement de nos impressions, à distance ! Voici par exemple un cas où il aura fallu interrompre l'impression car le plastique s'est décollé du plateau :

5.3. Améliorations

Le support pour le Raspberry Pi n'est pas parfaitement adapté à la paroi, ce qui fait que l'installation semble parfois instable. Avec un peu de courage, nous nous relançons dans la modélisation, en se basant sur des mesures précises et en solidifiant la structure à l'aide d'attaches transversales. Voici donc les nouveaux plans (dessins générés grâce au logiciel FreeCAD) :

Nous commençons par modéliser le support qui s'appuiera contre la paroi :

Puis nous modélisons l'attache transversale :

Nous lançons les impressions, et assemblons le tout. Voilà, c'est stable maintenant !


Annexes

A. Installation des programmes

Ici nous détaillons l'installation des programmes que nous allons utiliser sur le Raspberry Pi. En premier lieu, pip, qui est un gestionnaire de modules pour Python, très connu.

sudo apt-get install python3-pip

Nous l'utilisons sans plus attendre, en installant le module OctoPrint, qui va joueur le rôle du serveur de contrôle de l'imprimante.

pip3 install OctoPrint

Nous allons également vouloir utiliser une caméra sur le Raspberry Pi. Pour intégrer la vue de la caméra dans l'interface d'OctoPrint, ce dernier nécessite la mise en place d'un flux vidéo de diffusion en continu, plus connu sous le nom de stream. Après quelques recherches sur Internet, nous trouvons mjpg-streamer, un programme effectuant cela. Nous n'avons accès qu'au code source de ce programme, sur la plateforme GitHub. Pour l'utiliser, nous allons devoir le compiler : transformer le code en langage machine pour que le Raspberry Pi comprennent les tâches qu'il doit exécuter.

Ainsi, en suivant la documentation du programme, nous commençons par installer les petits programmes prérequis pour son bon fonctionnement, essentiellement de quoi traiter les images prises par la caméra avant de les diffuser.

sudo apt-get install libjpeg8-dev imagemagick libv4l-dev

Ensuite nous installons le programme qui va effectuer la compilation, gcc.

sudo apt-get install cmake gcc g++

Enfin, il nous manque le code source. Comme nous l'avons dit, il est disponible en ligne, mais nous en avons besoin localement, sur le Raspberry Pi, pour pouvoir le compiler. Il va nous falloir le télécharger. Plusieurs solutions s'offrent à nous ; l'une d'entre elles est d'utiliser git, un programme petit mais très puissant, autour duquel a été conçu la plateforme GitHub. git va nous permettre de faire une copie de dépôt de code en ligne sur le Raspberry Pi, exactement ce que l'on souhaite.

sudo apt-get install git
git clone https://github.com/jacksonliam/mjpg-streamer

Voilà, nous avons les dépendences, les outils, le code, nous sommes prêts pour installer.

sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
cd mjpg-streamer/mjpg-streamer-experimental
make
sudo make install

Nous en avons presque terminé. Le dernier programme requis est ffmpeg, un utilitaire permettant de manipuler des médias comme des sons, des images ou des vidéos. Il sera utilisé par OctoPrint pour assembler les images d'un timelapse en une unique vidéo.

sudo apt-get install ffmpeg

Voilà, tous les programmes sont installés !

B. Installation des services

Pour créer le service gérant la diffusion de la vidéo, il suffit de créer un petit fichier texte dans un répertoire spécifique de Raspbian en renseignant quelques champs. Pour créer et éditer le fichier, nous utilisons le programme nano, un éditeur de texte pour le terminal simple d'utilisation.

sudo nano /etc/systemd/system/camstream.service

Dans ce fichier, nous écrivons les informations suivantes :

[Unit]
Description=Raspicam stream from MJPG-Streamer
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=pi
WorkingDirectory=/home/pi/mjpg-streamer/mjpg-streamer-experimental
ExecStart=/home/pi/mjpg-streamer/mjpg-streamer-experimental/start.sh

[Install]
WantedBy=multi-user.target

On y retrouve des informations telles que le chemin vers le script à exécuter pour démarrer le serveur (ExecStart), l'ordre de démarrage du service lors de la séquence de démarrage du Raspberry Pi, ici après le service gérant le réseau (After=network.target), etc. Enfin, nous démarrons le service une bonne fois pour toutes :

sudo systemctl start camstream.service
sudo systemctl enable camstream.service

Nous procédons de même pour le serveur OctoPrint.

sudo nano /etc/systemd/system/octoprint.service

Nous inscrivons les informations suivantes, en reprenant les directives précédentes mais en modifiant les champs concernés :

[Unit]
Description=OctoprintServer
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=pi
WorkingDirectory=/home/pi/
ExecStart=/home/pi/.local/bin/octoprint

[Install]
WantedBy=multi-user.target

Puis nous démarrons le service :

sudo systemctl start octoprint.service
sudo systemctl enable octoprint.service

Nous redémarrons le Raspberry Pi, et enfin, nous en avons fini avec l'aspect logiciel.

Article précédent Article suivant