Un mur virtuel pour Roomba avec un Raspberry Pi

J’ai un aspirateur Roomba depuis un moment, et dans certains cas, j’aimerais l’empêcher de passer dans une pièce (ou sous le canapé, où il se coince). Il était livré avec un mur virtuel, et cet accessoire reste assez cher (comptez un bon 45 €) en plus d’être encombrant. Je me suis donc demandé s’il était possible d’émuler un mur de ce type avec un Raspberry Pi.

Ce que je propose ici est plus une démonstration technologique, qui demande des améliorations sur la directivité du signal et sur l’intégration. Mais placer directement le tout dans le chambranle d’une porte (par exemple) ne semble pas irréaliste.

Le matériel reste assez basique : un Raspberry Pi Zero (moins de 10 € livré) et un émetteur infrarouge de chez Grove. Il vaut moins de 5 € chez le constructeur, environ 9 € chez Amazon (mais ça arrive plus vite). Il faut relier le Raspberry Pi et le capteur avec des câbles Dupont (par exemple) sur les broches GPIO. Sur mon Pi Zero, j’avais déjà installé un header pour les GPIO, mais il existe un modèle livré directement avec.

Le montage basique

Le montage va passer par LIRC, un programme qui sert à la base pour les télécommandes. C’est assez logique : les Roomba communiquent par infrarouge et les murs virtuels envoient en fait en permanence un code infrarouge précis qui va indiquer à l’aspirateur qu’il ne peut pas passer.

Le mur virtuel original


Le montage de base

La méthode varie un peu en fonction des versions de l’OS, mais voici les étapes avec la dernière Raspbian (Stretch).

sudo apt-get install lirc

sudo nano /etc/modules

Dans le fichier, ajouter les deux lignes suivantes.

lirc_dev
lirc_rpi gpio_in_pin=18 gpio_out_pin=17

sudo nano /etc/lirc/hardware.conf

Dans le fichier, ajouter les lignes suivantes.

LIRCD_ARGS="--uinput --listen"
LOAD_MODULES=true
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

sudo nano /boot/config.txt

Ajoutez la ligne suivante.

dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17

sudo nano /etc/lirc/lirc_options.conf

Dans le fochier, modifiez les lignes pour obtenir le résultat qui suit.

driver = default
device = /dev/lirc0

sudo reboot

Maintenant, LIRC devrait fonctionner, et il faut installer le nécessaire pour le Roomba. Les informations se trouvent sur ce site, qui explique comment fonctionne l’infrarouge fonctionne avec les Roomba.

wget https://gist.githubusercontent.com/peterjc/7422624/raw/df803b63b86efcc39eaf2e57939b7653850333ee/make_roomba_lirc.py
python make_roomba_lirc.py > Roomba_LIRC.conf
sudo cp Roomba_LIRC.conf /etc/lirc/lircd.conf
sudo /etc/init.d/lircd restart

Si tout se passe bien, la commande suivante va lister les possibilités.

irsend list iRobot_Roomba ""

Ensuite, la commande suivante va lancer pendant environ une minute la commande de mur virtuel.

irsend send_start iRobot_Roomba virtualwall

La commande irsend send_stop iRobot_Roomba virtualwall arrêt la commande. Dans mon cas, j’ai mis un script bash basique qui va lancer la commande, attendre 62 secondes (pour être certain que la commande passe en timeout) et la relancer en boucle.

Le contenu du script :

#!/bin/bash
while true; do
irsend send_start iRobot_Roomba virtualwall
sleep 62
done

Que je lance avec la commande bash ./script.sh &.

Pour vérifier si ça fonctionne, vous pouvez lancer le Roomba ou tout simplement utiliser un appareil photo qui voit l’infrarouge. Personnellement, j’utilise un vieux Blackberry pour ça. Avec un appareil sensible, la LED deviendra violette.

Ca marche

J’ai essayer de filmer, en accéléré, le déplacement du Roomba. Ma solution a le défaut de diffuser assez largement le signal donc il ne s’agit pas réellement d’un mur virtuel, mais d’une zone. Bien évidemment, il suffirait de mettre une sorte de guide ou d’enchâsser la LED dans un trou pour limiter la diffusion et resserrer le faisceau. Avec un Raspberry Pi Zero et le boîtier de grove, on peut imaginer une intégration assez poussée du mur virtuel. Si je fais quelque chose de montrable un jour, je le publierais ici.

Le capteur, en haut à gauche de l’image, envoie un cône qui bloque le Roomba.