Moteur brushless, ESC et Raspberry Pi
Matériel et connexion à la Raspberry Pi
Matériel nécessaire
Pour commencer il faut du matériel. Je vais faire confiance à ce qui a été choisi pour la solution OpenROV: un moteur sans balais (ou brushless). Des solutions alternatives sont sûrement viables, et une bonne source d'inspiration pour ce type de motorisation se trouve dans les boutiques spécialisées en modélisme.
Nous allons donc avoir besoin non seulement d'un moteur, mais aussi d'un ESC (Electronic Speed Control) pour en contrôler la vitesse et le sens de rotation:
Pour pouvoir connecter et déconnecter proprement les différents éléments durant les tests, j'ai aussi investi dans un peu de connectique car le moteur et l'ESC en sont dépourvus. De plus, il faut une alimentation; j'ai récupéré un accumulateur dont je disposais.
- Connecteurs or Plast 3,5 (3,5mm)
- Connecteur Tamiya Mâle / Tamiya Mini femelle
- Câbles de connexion M/F pour montage boîte de connexion
- Accumulateur Ni-MH 7,2V 3600mAh
Connexion à la Raspberry
Disposant d'une Raspberry Pi B rev 2, le schéma d'implantation du connecteur GPIO (General Purpose Input/Output) est le suivant:
A chaque pin correspond une fonctionnalité. Après avoir repéré les pins correspondant à la terre et pour une éventuelle alimentation (attention dans notre cas, nous n'utiliserons pas les pins d'alimentation), il nous reste à trouver le rôle des différents pins pour y connecter nos appareils.
Voici un schéma de principe de connexion entre la Raspberry Pi, l'ESC et le moteur brushless. Vous noterez bien que l'alimentation de l'ESC ne doit être utilisée. La batterie fournit l'électricité nécessaire au fonctionnement de l'ESC et du moteur. Seul les connexions de la terre (fil noir) et pour l'envoi du signal de commande (fil blanc) doivent être réalisés avec l'ESC. La terre a été prise sur le pin 14, mais elle peut tout à fait être prise sur un autre pin du GPIO.
Contrôle du moteur Brushless grâce au GPIO
Choix d'une bibliothèque générant un signal pour contrôler le moteur brushless via un ESC
Plusieurs solutions permettent de contrôler le connecteur GPIO du Raspberry Pi. On trouve beaucoup de références, principalement à trois solutions:
La solution la plus prometteuse et référencée est WiringPi qui semble aussi être la plus utilisée pour contrôler le connecteur GPIO. Mais après avoir lu les forums du site de WiringPi, l'auteur de la bibliothèque indique lui-même que la bibliothèque ServoBlaster est plus adaptée que WiringPi pour générer un signal convenant à un ESC.
"""Most ESCs used in Radio Control applications take standard Radio Control PWM signals which isn't really PWM in the classic sense, but a pulse width from 1 to 2mS. Where 1mS is hard left (for a servo, or fully off for a motor controller), and 2ms is hard right, or fully on for a motor.
My softPwm module can not generate this sort of signal. There is an un-documented softServo module which can, but it is not good enough. Search for ServoBlaster to do this from the Pi."""
Nous partirons donc sur l'utilisation de ServoBlaster pour le contrôle des moteurs.
Installation et configuration de ServoBlaster
ServoBlaster permet le contrôle de plusieurs moteurs (8 de base, mais pouvant aller jusqu'à 21). Largement de quoi satisfaire nos besoins. Il nous reste donc à l'installer et à le configurer pour envoyer le bon signal à notre ESC et ainsi contrôler la vitesse de rotation de notre moteur.
Pour l'installation de ServoBlaster, il faut récupérer les sources les plus à jour par git et recompiler soit même le programme. Deux solutions sont possibles pour installer ServoBlaster: en module (donc en mode noyau) et en mode utilisateur. Ce dernier aura notre faveur, cette solution étant plus simple à mettre en place.
sudo apt-get install git git clone git://github.com/richardghirst/PiBits.git cd PiBits/ServoBlaster/user nano init-script # Supprimer la valeur --idle-timeout=2000 des options par défaut nano servod.c # Modifier la ligne 960 pour avoir "else if (strstr(modelstr, "BCM2709") || strstr(modelstr, "BCM2835"))" make sudo make install
Le lancement de cette dernière commande installe et démarre le serveur ServoBlaster et créé une entrée /dev/servoblaster avec laquelle nous pouvons avoir accès au contrôle du GPIO.
La documentation de ServoBlaster est bien faite et vous donnera toutes les informations utiles pour configurer spécifiquement votre installation. Pour le moment, j'utilise la configuration par défaut soit celle activant les pins 7,11,12,13,15,16,18,22 du connecteur GPIO avec le mapping suivant dans ServoBlaster.
Servo mapping:
- 0 on P1-7 GPIO-4
- 1 on P1-11 GPIO-17
- 2 on P1-12 GPIO-18
- 3 on P1-13 GPIO-21
- 4 on P1-15 GPIO-22
- 5 on P1-16 GPIO-23
- 6 on P1-18 GPIO-24
- 7 on P1-22 GPIO-25
Reste à tester que ceci nous permet d'envoyer un signal (et le bon si possible) pour contrôler notre moteur. Notre ESC est connecté au port GPIO-4 (donc le 7ème pin du connecteur) et bien entendu à une masse (pin 14). Donc ceci correspond au contrôle du servo 0 dans ServoBlaster. Malheureusement, après plusieurs tentatives, seule la valeur 200 permet de démarrer le moteur à pleine puissance et toute autre valeur éteint le moteur...
echo 0=200 > /dev/servoblaster echo 0=100 > /dev/servoblaster
Attention: quand le moteur démarre et s'arrête le couple fait bouger celui-ci. Il est donc important de bien le tenir ou l'attacher quand vous faites vos tests.
Le mode "tout ou rien" en puissance de moteur est assez limité alors même que l'on dispose d'un ESC pour justement contrôler la vitesse du moteur.
Calibrage de l'ESC
En fait, l'ESC n'est pas calibré. Il est nécessaire de le configurer pour indiquer quelles sont les valeurs maximales du contrôleur de notre moteur. Dans notre cas, le contrôleur de notre moteur n'est pas une télécommande, mais bien le signal qui sera envoyé par le Raspberry Pi via le pin GPIO et le contrôle de celui-ci à l'aide de ServoBlaster.
Cette étape doit être indiquée sur la documentation de votre ESC. Concernant le modèle donc je dispose (le Hobbywing EZRUN-18A Brushless ESC), la procédure est détaillée sur la notice, mais, je dois avouer, pas si simple à comprendre au premier abord. Voici donc, j'espère en plus clair, la procédure que j'ai suivie.
- L'ESC doit être éteint (petit interrupteur sur off).
- Appuyer sur le petit bouton rouge près de l'interrupteur et allumer l'ESC. Une led rouge clignote au dos du boîtier de l'ESC et un beep régulier se fait entendre. Relâcher le bouton rouge.
Nous voici dans le mode de calibrage de notre ESC. Nous allons maintenant indiquer les valeurs extrêmes et la valeur médiane de notre contrôleur, ce qui permettra à celui-ci de se calibrer automatiquement pour envoyer la bonne modulation de vitesse au moteur brushless en fonction du signal reçu sur l'ESC.
- La led au dos du boîtier doit clignoter et un beep régulier est émis.
- Commencer à envoyer le premier signal correspondant à la position
neutre. Dans notre cas, ServoBlaster a été configuré pour avoir les
valeurs extrêmes suivantes: minimum 50 (soit 500us) et maximum 250
(soit 2500us). La valeur médiane de cet intervalle est donc 150. Nous
allons donc envoyer cette valeur à l'ESC.
echo 0=150 > /dev/servoblaster
- Une fois la commande précédente exécutée, appuyer sur le petit bouton rouge de l'ESC (près de l'interrupteur). Une led verte (au dos du boîtier de l'ESC) flashe une fois et le beep sonore s'arrête (c'est sympa, ça commençait à casser les oreilles).
- Il faut maintenant envoyer la valeur maximale à l'ESC.
echo 0=250 > /dev/servoblaster
- A nouveau, après l'exécution de cette commande, appuyer sur le petit bouton rouge de l'ESC (pas la peine de vous rappeler où il se situe maintenant). La led verte au dos du boîtier de l'ESC clignote deux fois.
- Il nous reste maintenant à entrer la dernière valeur qui est la
valeur minimale du signal.
echo 0=50 > /dev/servoblaster
- Appuyer sur le bouton rouge. La led verte doit clignoter 3 fois, indiquant par la même que le processus de calibration est terminé.
Il ne vous reste alors plus qu'à attendre 3 secondes, à arrêter l'ESC, à le redémarrer et à tester que l'envoi de valeurs entre 150 et 249 fait varier la vitesse de rotation dans un sens et que les valeurs entre 150 et 51 dans l'autre sens. Il ne nous reste plus qu'à faire la configuration des paramètres de notre ESC (appelé programmation de l'ESC, bien grand mot pour donner quelques valeurs à des paramètres de configuration).
Configuration de l'ESC
La programmation ou plutôt la configuration de l'ESC peut se faire de deux manières différentes: soit via les leds du boîtier ESC avec un codage de l'information basé sur le nombre de flashs et la couleur de la led, soit à l'aide d'un boîtier de configuration. Cette dernière solution est bien plus pratique à utiliser, même si elle nécessite un petit investissement (mais je vous rappelle qu'il y aura a priori trois moteurs donc trois ESC à configurer).
Pour le modèle d'ESC dont je dispose, il y a deux boîtiers possibles:
Le deuxième étant moins cher que le premier, j'ai opté pour cette solution.
Pour modifier la configuration, il suffit de connecter le boîtier en lieu et place de la Raspberry Pi et d'allumer l'ESC. Les paramètres et leurs valeurs s'inscrivent sur les écrans. Il suffit d'appuyer sur le bouton item pour passer au paramètre suivant et sur value pour en modifier la valeur puis de valider avec la touche ok. Le paramétrage entré dans l'ESC est le suivant:
- 1 - Running Mode: 3 - Forward and Reverse
- 2 - Drag Brake Force: 3 - 10%
- 3 - Low Voltage Cut-off Threshold: 4 - 3.OV / Cell
- 4 - Start Mode (Punch): 5 - Level 5
- 5 - Maximum Brake Force: 4 - 100%
- 6 - Maximum Reverse Force: 4 - 100%
- 7 - Initial Brake Force: 1 - Drag Brake Force
- 8 - Neutral Range: 1 - 6%
- 9 - Timing: 5 - 15.00°
- 10 - Over-heat Protection: 1 - Enable
Nous voici donc maintenant avec notre moteur prêt à fonctionner.
Programmes de calibration et de test de l'ESC
Pour faciliter la tâche de calibration et de test du bon fonctionnement de votre ESC, j'ai écrit deux petits scripts. Le premier vous permet de réaliser la calibration et reprend le tutoriel qui est ci-dessus. Le deuxième permet de tester que votre calibration s'est bien déroulée en faisant varier la vitesse de votre moteur dans les deux sens. Attention à bien maintenir celui-ci pour ne pas qu'il bouge dans tous les sens.
Pour tester le bon fonctionnement de votre moteur, vous pouvez lancer le script suivant. La valeur 75 est au finale la valeur minimale pour le monde reverse et le maximum est 249. Je n'ai encore compris la raison de ce décalage.
sudo apt-get install bc ./esc-ezrun-test.sh -m 75 -M 249
Fichiers complémentaires
Vous trouverez ci-dessous les schémas de connexion (image et source) entre la Raspberry Pi, l'ESC et le moteur.