I2c_logo.svgDans 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).

 

 

 

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.

Tableau_I2C

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.

I2CDetect

On voit bien les adresses 40 et 48 apparaître.

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.

Les personnes qui ont lu cet article ont aussi lu :  [PiRobot] Partie 7.5 - Retour caméra dans l'application !

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.

Pi_GPIO

gpio readall

 

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 :

physical-pin-numbers

Numéros physiques du pinout GPIO Raspberry Pi

 

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.

Test sur BCM 4

Test : 2 changements d’état sur la BCM 4 répété 5 fois.

Pour faire le test ci-dessus, je me suis inspiré de l’exemple « Blink » : http://wiringpi.com/examples/blink/

Les personnes qui ont lu cet article ont aussi lu :  [3/50] Défi 50 objets : L’anémomètre connecté – Partie 2

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.

pca9685

Le fameux PCA9685 (16 x 12 bits PWM)

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.

VS2017RC-linkfiles

Dans VS2017, l’édition de lien s’effectue dans les propriétés du projet.

Il faut noter également que la première adresse PWM (pour accéder au PWM 0) sera la n°300.

tableau pwm

L’adresse PWM est aussi appelée PIN_BASE. L’adresse 316 commande tous les PWM en même temps.

prog-i2c

Ce bout de code fait tourner les moteurs du PiRobot à env. 50% de leur capacité. Les deux moteurs à l’avant « reculent », les deux de l’arrière « avancent ». Il suffit de corriger en remplaçant LOW par HIGH sur les moteurs 1 et 2.

 

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.

Pin It on Pinterest

Shares
Share This