Dans cette partie, je vais décrire comment j’ai réussi à commander le PiRobot grâce à un programme compilé en C++. Pour se faire j’utilise la bibliothèque WiringPi pour le contrôle du GPIO. J’utilise également des bibliothèques libres utilisant WiringPiI2C pour la carte PWM (PCA9685) et pour la carte d’acquisition analogique (ADS1115).
Table des matières
1. WiringPi, I²C, Bibliothèques ? Késako ?
Mon Raspberry Pi 2 ne possède pas nativement les bibliothèques pour commander les différents organes de contrôle du PiRobot en C++. Il faut donc procéder à l’utilisation de bibliothèques. Ces bibliothèques sont facilement trouvables lorsque cela concerne la programmation Python sur Raspberry Pi. Ayant déjà utilisé cette méthode sur le PiRobot, j’étais contraint à de gros soucis de latence sur la gestion des moteurs en multithread. D’où mon choix de passer sur un langage compilé (C++) plus proche de la couche matérielle qu’un langage interprété comme le Python.
Heureusement, un certain Gordon a développé une bibliothèque en C/C++ permettant de gérer les ports GPIO normalement dédiés aux différents bus (SPI, I²C, UART…) et met à disposition 17 E/S pour piloter des éléments extérieurs. Cette bibliothèque nommée WiringPi (http://wiringpi.com) est une bibliothèque bas-niveau, non spécifique à des cartes additionnels spécifiques (quelques éléments y sont néanmoins intégrés) qui permet une utilisation aisée des entrées/sorties GPIO et des bus de données. On trouve sur le net des bibliothèques « surcouches » qui utilisent WiringPi pour piloter divers éléments sur les bus. Ces bibliothèques nous faciliterons grandement le code.
Afin de connaître les adresses I²C des modules, activez la communication I²C dans raspi-config puis tapez i2cdetect –y 1 sur Raspberry Pi 2 ou tous modèles supérieurs et i2cdetect –y 0 pour les modèles inférieurs.
2. Installation et utilisation de WiringPi
Personnellement j’utiliserai principalement WiringPi afin de contrôler le sens de rotation des différentes roues du PiRobot. En effet, sur la carte de contrôle des moteurs, un pin me permet de contrôler le sens d’un moteur selon si une tension est présentée sur la pin ou non. J’ai testé en Python avec le 3,3V d’une sortie GPIO du Raspberry Pi et la commande a bien était prise en compte. Le seuil de déclenchement est donc inférieur à 3,3V.
J’ai remarqué également que cette commande était inversée entre mes 2 roues avant et 2 roues arrière :
digitalWrite(SENS_MOTEUR_1, LOW); //recule
digitalWrite(SENS_MOTEUR_2, LOW); //recule
digitalWrite(SENS_MOTEUR_3, LOW); //avance
digitalWrite(SENS_MOTEUR_4, LOW); //avance
Et vice-versa.
Installons WiringPi, grâce au tuto sur le site de Gordon : http://wiringpi.com/download-and-install/
Le plan A a fonctionné parfaitement chez moi.
Pour tester l’installation, ne pas oublier :
gpio –v
gpio readall
Cette dernière commande nous sera très utile par la suite. Elle donne un aperçu du GPIO du Raspberry Pi avec la correspondance entre les numéros BCM (adressage sur le contrôleur), wPi (adressage WiringPi) et les numéros de pins du Raspberry Pi.
On peut remarquer sur la capture d’écran ci-dessus le GPIO. 0 (BCM 17, wPi 0, Physical 11) est configuré en mode « OUT ». Le mode permet d’indiquer au contrôleur si la pin GPIO va recevoir une tension de commande (IN) ou en donner une (OUT). Je veux donner une information numérique, j’exporte le mode en « OUT » à l’aide de l’adresse BCM :
gpio export 17 out
Il faudra faire cela pour chaque pin utilisé. Pour se référer aux pins, j’utilise ce document :
Personnellement j’utilise 4 pins pour le sens de mes 4 moteurs : 7, 11, 13 et 15. Ce qui correspond respectivement aux adresses BCM : 4, 17, 27 et 22.
gpio export 4 out
gpio export 17 out
gpio export 27 out
gpio export 27 out
Note H.S. : J’ai commencé à coder le serveur côté Raspberry Pi sur Eclipse (voir mes précédents tutos…). Entre temps, Microsoft nous a sorti un Visual Studio 2017 RC tout neuf intégrant une extension pour compiler sur des systèmes Unix/Linux embarqués ou non. J’ai été vite séduit. Ce n’est pas de la cross-compilation à proprement parler, car la compilation s’effectue à même le Raspberry. Cependant, tout est faisable à distance dans VS2017RC et l’interface est très simple d’utilisation.
Pour faire le test ci-dessus, je me suis inspiré de l’exemple « Blink » : http://wiringpi.com/examples/blink/
J’ai vérifié le changement d’état en tapant gpio readall dans une console SSH connectée au PiRobot.
3. Ajout de la bibliothèque pour la gestion PWM via I²C
Ici, je vais utiliser la bibliothèque de Reinbert (https://github.com/Reinbert/) se nommant comme le composant que je dois commander : pca9695.
Pour cela, sur le Raspberry Pi, je récupère les fichiers :
git clone https://github.com/Reinbert/pca9685.git
Le développeur a prévu un installateur (Makefile) afin de créer les librairies directement dans le système (on n’aura ainsi pas besoin de les intégrer dans notre projet, mais juste les appeler).
Pour se faire, on se rends dans le dossier cloné : pca9685. Puis dans src. Il ne restera plus qu’à faire un sudo make install.
Il ne faudra pas oublier d’instancier la librairie au début du programme (ou dans les headers) avec :
#include <pca9685.h>
Et wiringPiPca9685 dans les fichiers d’édition de liens.
Il faut noter également que la première adresse PWM (pour accéder au PWM 0) sera la n°300.
4. Et la bibliothèque C++ pour le composant ADS1115 ?
A ce jour je n’ai pas encore trouvé de bibliothèque C++ ou C pour ce composant. Je viens de commencer les recherches à ce sujet. Au cas où il faudrait que je code ma propre bibliothèque, je pourrai la réaliser en utilisant la base I²C de WiringPi et en m’inspirant des bibliothèques Arduino existants pour l’ADS1115. Ce composant me permet de recevoir l’information du courant consommé sur chaque moteur (0-2A sur une échelle de 0-5V). Cela me permettrai de tracer des courbes de couple sur le PiRobot. Le sujet n’étant pas prioritaire pour le moment, je laisse ce thème de côté pour plus tard. Mon objectif est déjà de contrôler le PiRobot à distance à partir d’une tablette Windows. Wait&See…
BenTeK.
0 commentaires