Raspberry Pi : Piloter un robot en C# via le port GPIO

Le robot

blog ai3 pi2go-lite-front-300x232 Raspberry Pi : Piloter un robot en C# via le port GPIO  blog ai3 pi2go-lite-rear-300x246 Raspberry Pi : Piloter un robot en C# via le port GPIO  blog ai3 pi2go-lite-top-300x255 Raspberry Pi : Piloter un robot en C# via le port GPIO

Le raspberry pi 2 dispose d’un port GPIO (General-purpose input/output) avec lequel il est possible de piloter toute sorte de périphériques, par exemple un robot comme le Pi2Go Lite. Le robot est motorisé et est possède un ensemble de capteurs. Lors du montage, le raspberry pi 2 est monté sur le robot avec 6 piles afin qu’il se déplace en toute autonomie.

Le port GPIO est composé de 40 pins et mis à part les pins dédiées à un usage spécifique, elles peuvent toutes être utilisées pour lire ou écrire les valeurs high (1) ou low (0).

D’un point de vue logiciel, le Pi2Go est livré avec une API écrite en Python. Le défi posé dans le cadre de ce billet est de porter l’ensemble de l’API ainsi que toutes les couches inférieures vers notre langage favori : le C#.

L’ensemble des points abordés dans ce billet ont été implémentés et les sources sont disponibles sur le Github du projet.

 

Voyons un peu plus en détail les composants du Pi2Go Lite. Vous allez voir qu’il est un bon cas d’école pour apprendre à contrôler le port GPIO du Pi parce qu’il dispose de composants posant chacun des problématiques différentes de programmation. En voici la liste :

  • 4 LEDs (2 à l’avant et 2 à l’arrière), Ecriture de High pour allumer une LED et Low pour l’éteindre.
  • 2 capteurs infrarouges : Si un obstacle proche est détecté, alors une valeur High est lue sur la pin concernée.
  • 2 moteurs permettant de propulser le rover. Afin de faire varier la vitesse de rotation des moteurs il est nécessaire d’implémenter la modulation de largeur d’impulsion (PWM en anglais).
  • Un sonar ultrasonique pour mesurer la distance de l’obstacle devant le robot. Le principe du sonar ultrasonique est de lancer une impulsion (écriture), puis d’attendre l’écho en retour (lecture). Plus la distance entre le rover et l’obstacle est grande, plus l’écho est longue à revenir. Connaissant la vitesse du son, il est facile de calculer la distance de l’obstacle.
  • Le module additionnel Pan and Tilt permet d’ajouter une caméra (compatible avec le pi 2) qu’il est possible d’orienter verticalement et horizontalement grâce à 2 servos. Les servos peuvent être positionnés de 0 à 90° en envoyant un signal selon une certaine fréquence qui indique la position souhaitée.

 

Nous allons maintenant voir quels sont les logiciels chargés de piloter tous ces composants.

Les logiciels livrés avec le Pi2Go Lite

Outre le matériel, le Pi2Go Lite est livré avec des logiciels qui sont conçus pour s’exécuter sur le Pi 2 via une distribution Linux. Pour ma part j’utilise Raspbian, qui est une Debian spécialement préparée pour le Pi 2.

Les logiciels fournis sont principalement destinés à être utilisés par le langage Python :

  • RPi.GPIO : Il s’agit d’une librairie qui permet de piloter le port GPIO. Cette librairie est développée en Python, mais les fonctions bas niveau son écrites en C. Outre l’activation – désactivation des pins et la lecture des pins, elle gère aussi le PWM qui régule la vitesse des moteurs des roues.
  • ServoBlaster : Un programme écrit en C, dédié au pilotage des servos moteurs permettant de changer la position de la caméra.
  • Une librairie Pyhton écrite par les concepteurs du Pi2Go qui repose sur RPi.GPIO et ServoBlaster pour proposer des fonctions haut niveau comme : allumer les LEDs, avancer / reculer, tourner à droite / gauche, mesurer la distance de l’obstacle le plus proche, orienter la caméra (haut, bas droite, gauche).
  • Le programme qui est chargé de faire l’interface homme  / machine. Il s’agit d’un script Python qui s’exécute en ligne de commande. Il permet de piloter le robot grâce aux touches du clavier.

Voici une vue d’ensemble de la stack logicielle à réécrire en C# :

blog ai3 Pi2Go-Lite-Original-Software-stack1-300x181 Raspberry Pi : Piloter un robot en C# via le port GPIO

Diagramme représentatif de la stack logicielle fournie avec le robot

 

Réécriture de la stack en C#

Heureusement, il est possible d’exécuter un programme .Net  sous Linux grâce à Mono, le pendant Open Source du framework .Net. Mono s’exécute parfaitement sur Raspbian. Il fait même partie des packages de base que l’on peut installer grâce au gestionnaire de paquets « APT » !

 

Au passage : pourquoi ne pas avoir utilisé Windows 10 IoT ?

J’ai bien tenté de porter le programme sur Windows 10 IoT, et l’implémentation est nettement plus simple que sous Linux, mais l’API de Windows ne permet pas d’utiliser certaines pins qui sont nécessaires au Pi2Go Lite 🙁

 

L’un des principal défaut de l’architecture logicielle originale, est qu’elle repose sur un assemblage d’outils et de librairies peu cohérentes et non unifiées. Par exemple, la commande des servos fait appel à un outil nommé « ServoBlaster » qui est lancé en ligne de commande via le script Python.

Dans cet article, nous avons pour objectif de développé un framework unifié et capable de prendre en compte l’ensemble des problématiques en évitant la duplication de code.

Ainsi l’architecture cible retenue est découpée en 4, chaque couche reposant sur la couche de niveau inférieur :

  1. Gestion bas niveau du port GPIO
  2. Pilotes (PWM pour les moteurs, Servos, Sonar etc.)
  3. Libraire haut niveau de contrôle du robot
  4. Programme IHM

Dans le cadre de ce post, je décrirai uniquement le fonctionnement de la gestion du port GPIO. Les autres composants seront détaillés ultérieurement dans d’autres posts qui seront publiés sur ce blog.

 

Gestion du port GPIO

Le fonctionnement du port GPIO est simple. Avant toute opération sur une pin, il est nécessaire de définir le mode d’accès : Input ou Output et ensuite on peut procéder à la lecture ou à l’écriture de d’une valeur.

Sous Linux, il existe plusieurs méthodes pour accéder au port GPIO :

  • En écrivant dans les fichiers du sysfs

Cette méthode a pour avantage d’être très simple et est accessible à tout langage capable de lire ou écrire dans des fichiers. Chaque pin est présentée sous la forme d’un fichier dans lequel on lit ou écrit pour communiquer.

Même si les performances sont suffisantes dans la majorité des cas, elle ne permet pas d’envoyer un signal à une fréquence suffisante pour, notamment, commander les servos de la caméra.

Elle est implémentée dans la classe SysfsLinuxGpioPort du projet.

 

  • Accès direct à la mémoire (DMA)

Avec le noyau Linux, il est possible d’activer un device « /dev/mem » qui est une représentation de l’ensemble de la mémoire RAM de l’ordinateur sous la forme d’un fichier. Dans le cas d’un usage classique d’un ordinateur ce device n’a pas lieu d’être activé et si c’était le cas cela représenterait une énorme faille de sécurité.

Dans le cadre d’un OS dédié au pilotage d’un robot, c’est très intéressant car cela permet d’accéder directement aux registres des périphériques sans librairie intermédiaire. Toutes les librairies C qui ont besoin de performances optimales, comme par exemple ServoBlaster, utilisent cette méthode.

Pour implémenter cette méthode, il est nécessaire de mapper le fichier « /dev/mem » dans la mémoire du processus courant en utilisant mmap. Après cette opération le processus peut librement écrire n’importe où dans la mémoire… et ensuite on peut commencer l’arithmétique des pointeurs. Ce qui n’est pas chose aisé après plusieurs années de C#, mais l’exercice est intéressant.

Je vous laisse découvrire le code de cette implémentation dans la classe DmaLinuxGpioPort.

 

Suite…

Nous avons vu comment est implémenté la gestion du port GPIO. Dans un prochain post, je décrirai comment sont implémentés les pilotes de chaque composant ainsi que l’écriture d’un contrôle à distance grâce aux WebSockets.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.