1. Introduction

Mon idée de départ était de contrôler un thymio à distance un peu comme une voiture télécommander. Je me suis donc parti dans l'idée de faire un thymio télécommandé à l'aide d'une manette.

L'objectif de ce projet est de pouvoir télécommandé le Thymio à l'aide d’une manette de PS4. Les enjeux sont de pouvoir recevoir par bluetooth les différentes valeurs des joysticks et touches sur un Raspberry Pi et de les transmettre au Thymio par USB. Comme le Thymio n’a que deux roues, il ne pourra pas est contrôlé comme une voiture, il faut faire en sorte que l’on puisse le contrôler correctement avec la manette.

2. Matériel et méthodes

2.1 Matériel

● Raspberry Pi 3
● Wireless Thymio II
● Manette sans fil PS4 Dualshock 4
●Batterie externe

2.2 Méthode

Le projet se déroulera en 3 parties, la première où l'on va installer ds4drv afin de pouvoir connecter la manette de PS4 au raspberry, la deuxième où l'on installera aseba sur notre raspberry afin de pouvoir communiqué avec le Thymio et la troisième où on écrira le script Python qui fera marcher le tout.

2.2.1 Ds4drv

On va tout d’abord devoir installer ds4drv, ce qui va nous permettre de connectée la manette sans bluetooth et de pouvoir ainsi l'utiliser. On va aussi devoir installer python 3 afin d'utiliser pip pour install ds4drv plus facilement.

sudo apt install python3-dev python3-pip
sudo pip install ds4drv

Afin de facilité l'utilisation de ds4drv on va faire en sorte que ds4drv se lance au démarrage, en modifiant le ficher rc.local

sudo nano /etc/rc.local

Après # By default this script does nothing, on va ajouter /usr/local/bin/ds4drv, le ficher devrai ressemblé a ça:

# By default this script does nothing.
/usr/local/bin/ds4drv &
exit 0

Puis il faut reboot le raspberry. Après cela pour connecter la manette on aura qu'à maintenir appuyer le bouton Share et PS pour mettre la manette en mode d'appariement et attendre quelques secondes que le raspberry ce connecte.

On a maintenant la premier partie qui est faite, notre raspberry dispose de joysticks et de boutons que l'on pourra utiliser avec python.

2.2.2 Aseba

Nous allons passer à l'installation d'aseba. Tout d’abord, il faut télécharger le paquet .deb sur le site officiel https://www.thymio.org/fr:linuxinstall en prenant la version 1.5.5 ou supérieure.

On peux télécharger ce paquet directement depuis le Raspberry ou copier ce paquet sur le raspberry directement depuis votre ordinateur avec la commande :

scp aseba_1.5.5_armhf.deb pi@ADRESSE IP:~/. 

Puis pour installer le paquet on utilise la commande (en ssh sur le raspberry):

sudo dpkg -i aseba_1.5.5_armhf.deb

Une fois les outils Aseba installés , il faut connecter Thymio II physiquement à l'aide d'un câble USB. Pour vérifier que Thymio II est bien connecté vous pouvez lister les devices USB avec la commande:

lsusb

Il devrait y avoir le nom de l’École Polytechnique Fédérale de Lausanne qui y apparaît.

À ce point on peut lance Aseba Studio sur le Raspberry PI, mais ceci n'est pas le but. Le but est de pouvoir se connecter au Thymio et de lui transmettre des informations à travers le câble USB. Aseba fournit asebamedulla, un utilitaire de ligne de commande permettant d’accéder à un réseau Aseba via D-Bus. Cela permet de commander le Thymio à partir de langages tiers. On va ici utiliser Python et sa librairie D-bus.

2.2.3 Python

Pour écrire le scripte, je me suis basé sur le code de cette page https://www.thymio.org/en:thymioraspyexample

Afin d'écrire le scripte python qui contrôlera le thymio avec la manette, on aura besoin de pygame pour gérer les joysticks de la manette et on aura besoin de dbus afin de communiquer avec le thymio.

sudo apt install python-dbus
sudo apt-get install python-pygame

Maintenant installer on peut commencer à écrire le script.

Afin de pouvoir communiquer avec le thymio, il nous faut initialiser le réseau dbus avec le thymio, à l'aide de dbus:

dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba', '/'), dbus_interface='ch.epfl.mobots.AsebaNetwork')

Pour pouvoir utiliser la manette on va utiliser pygame. Tout d'abord il faut initialiser pygame.

pygame.init()

Puis on va crée le joystick j et l'initialise, ici "j" va être la manette dans notre programme.

pygame.joystick.init()
j = pygame.joystick.Joystick(0)
j.init()

Puis on va crée la boucle principal. Dans cette boucle while, on a une boucle for qui s'active à chaque fois que la manette envoie un événement, un joystick qui bouge ou un bouton presser, grâce à la fonction pygame.event.get(). À chaque fois qu'il y a un événement le script va faire ce qu'il y a dans la boucle for.

Ensuite on a une condition qui va vérifier si l’événement est un joystick qui bouge, et si c'est le cas on va changé la vitesse des moteur du thymio. Pour contrôler le thymio, il y a plusieurs possibilités, mais je suis parti sur la plus simple, piloter le thymio avec deux joystick, un pour chaque roues. On utilise les deux axes vertical de chaque joystick, dont le valeur vont de -1 à 1 et on multiplié ces valeurs directement avec la vitesse maximum des roues du thymio. On a aussi inversé les axes, car ils sont à l'envers. Avec cette méthode on peut contrôler chaque roue séparément et avoir une grand mobilité.

while True:
    for event in pygame.event.get():
	if event.type == pygame.JOYAXISMOTION:
		y1 = j.get_axis(1) #axe Y, joystick gauche
             	y2 = j.get_axis(5) #axe Y, joystick droite
		y1 = 0-y1 #inverse y, car l'axe y est a l'envers
		y2 = 0-y2
        	left = 500*y1
                right = 500*y2

Puis, on n'a eu qu'à utilise .SetVariable pour transmettre la valeur du moteur au thymio.

network.SetVariable("thymio-II", "motor.left.target", [left])
network.SetVariable("thymio-II", "motor.right.target", [right])

Se qui nous donne le programme suivant:

# -*- coding: utf-8 -*
import pygame
import dbus
import dbus.mainloop.glib
import os

os.putenv('DISPLAY', ':0.0') #permet de ne pas avoir l'erreur pygame: video system not initialized

#Create Aseba network
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba', '/'), dbus_interface='ch.epfl.mobots.AsebaNetwork')

#Initialisation de pygame
pygame.init()
pygame.joystick.init()
#création d'un object joystick qui est la manette
j = pygame.joystick.Joystick(0)
j.init()

while True:
    for event in pygame.event.get():
	if event.type == pygame.JOYAXISMOTION:
		y1 = j.get_axis(1) #axe Y, joystick gauche
             	y2 = j.get_axis(5) #axe Y, joystick droite
		y1 = 0-y1 #inverse y, car l'axe y est a l'envers
		y2 = 0-y2
        	left = 500*y1
                right = 500*y2
		network.SetVariable("thymio-II", "motor.left.target", [left])
		network.SetVariable("thymio-II", "motor.right.target", [right])

Avant de lance le script avec python, il faut que la manette soit connecter et il faut lance asebamedulla avec la commande suivante:

asebamedulla "ser:name=Thymio-II"

3. Résultats

Pour que ça soit plus pratique on a mis le raspberry Pi avec la batterie externe au dessus du thymio et attacher avec des élastiques.

4. Discussion

Tout d'abord, il est important de relever la réussite de ce projet. En effet, le résultat obtenu est correspond exactement au but recherché, on arrive à contrôler le thymio avec la manette de PS4 et le tout est très fluide avec aucun problème avec le code. Pour parvenir à ce résultat j'ai eu quelques complications. Il y a eu un problème mineur avec pygame en ssh, que j'ai du régler avec une commande dans le script. Mais le principal a été d'installer aseba avec la bonne version, car l'installation d'aseba sur raspberry est mal documenté. De plus il y a eu beaucoup de problème pour mettre en place la communication avec le thymio, car utilisation d'asebamedulla est aussi mal documenté et ce base sur la librairie dbus et il est dur de comprendre le fonctionnement de dbus quand on ne l'a jamais utilisée.

Cependant il reste un problème dans l'utilisation de ce projet, on doit lancé asebamedulla et le script en ssh. On ne peut pas lancer le script au démarrage, car quand le script est lancé on doit avoir connecté la manette et le thymio, de plus il semble que lancer asebamedulla au démarrage ne fonctionne point.

5. Conclusion

Pour conclure, je suis globalement très satisfait du résultat obtenu, je trouve que c'est très "fun" de pouvoir contrôler un thymio avec une manette de PS4. Même si le projet n'est pas vraiment utile, il peut être utilise ou combiné afin d'améliorer d'autres projet. Le plus important reste que le projet soit fonctionnel et qu'il soit exactement comme je l'avait imaginé.

Références

https://github.com/chrippa/ds4drv
https://github.com/RetroPie/RetroPie-Setup/wiki/PS4-Controller
https://www.thymio.org/fr:linuxinstall
https://www.thymio.org/fr:thymioexplorer#toc2
https://www.thymio.org/en:thymioraspyexample