Sylvain Mahé Le site Web Retour à l'accueil Principes Partager mes idées et mes projets librement et gratuitement. Thématiques Mécatronique du système embarqué, artisanat pluridisciplinaire, bricolage commun, esthétique logicielle et matérielle, minimalisme fonctionnel, conceptualisation alternative, rédaction technique et littéraire, partage pédagogique documenté. Contact ✆ Téléphone : 06.45.49.96.98
✉ E-mail : contact@sylvainmahe.site
✎ Site Web : sylvainmahe.site
Écriture de la page : Sylvain Mahé
Lire les voies PWM d'un récepteur de modélisme avec la classe PwmRead L'une des utilisations possibles de la classe PwmRead est la lecture des sorties PWM d'un récepteur de modélisme standard afin de piloter un modèle radiocommandé. Bien d'autres applications sont possibles, mais c'est celle-ci qui fera l'objet d'un exemple ici. La modulation de la largeur d'impulsion (PWM) est un moyen pratique de communication entre deux (ou plusieurs) périphériques, ce principe ne demande qu'un seul fil de liaison. La classe PwmRead permet de mesurer la largeur d'impulsion PWM avec une résolution d'1 microseconde. Exemple d'utilisation de la classe PwmRead : #include <PwmRead.h> int main() { PwmRead myChannelThrottle = PwmRead (1, true); PwmRead myChannelPitch = PwmRead (2, true); PwmRead myChannelRoll = PwmRead (3, true); PwmRead myChannelYaw = PwmRead (4, true); PwmRead myChannelCut = PwmRead (5, true); PwmRead::start(); while (true) { myChannelThrottle.read(); myChannelPitch.read(); myChannelRoll.read(); myChannelYaw.read(); myChannelCut.read(); //si l'interrupteur de coupure moteur est activé : if (myChannelCut.us < 1500) { //coupure des gaz } else { //sinon, utilisation des valeurs pour piloter le modèle radiocommandé : //myChannelThrottle.us (gaz) //myChannelPitch.us (tangage) //myChannelRoll.us (roulis) //myChannelYaw.us (lacet) } } return 0; } Cet exemple montre un peu comment organiser un programme pour pouvoir lire les voies PWM d'un récepteur de modélisme standard afin de piloter un modèle radio-commandé. Au début du code, 5 objets de type PwmRead sont déclarés :
- Le 1er paramètre indique le numéro du port GPIO de l'automate programmable en entrée qui va servir à lire le signal PWM, respectivement les ports GPIO numéro 1, 2, 3, 4, et 5 dans l'exemple.
Avec la classe PwmRead, ce sont tous les ports GPIO de l'automate programmable qui peuvent servir à la lecture de signaux PWM. - Le 2ème paramètre true permet de définir que la lecture du PWM débute par un front montant, et termine par un front descendant (le cas le plus courant), ou inversement si le paramètre était indiqué à false. Ce paramètre n'a pas d'utilité dans le cadre de la lecture de sorties PWM type récepteurs de modélisme standards, où l'on s'attends toujours à un front montant lorsque le signal débute. En revanche, cette fonctionnalité peut être utile voir indispensable pour d'autres applications. Ensuite, la lecture PWM est démarrée en appelant la fonction statique start. À la suite du programme dans la boucle, les 5 objets de type PwmRead appellent leurs fonctions read respectives, ce qui permet de mettre à jour les variables us (largeur d'impulsion en microsecondes) relatives aux objets déclarés, et de s'en servir pour piloter le modèle radiocommandé. Une sécurité dans le cas d'un récepteur de modélisme partiellement défaillant :
La lecture PWM s'effectuant de manière séquentielle dans l'ordre de déclaration des objets, imaginez le cas extrême d'une défaillance de l'une des voies de votre récepteur de modélisme, cas ou la lecture de la voie deviendrait impossible. Il serait alors judicieux de considérer que si au bout d'un certain temps, le signal PWM ne peut être mesuré, la lecture passe à l'objet suivant (à la voie suivante) sans mettre à jour la variable us relative à l'objet considéré. C'est ce que permet la classe PwmRead :
En effet si les fronts attendus (montant puis descendant ou descendant puis montant) ne sont pas obtenus dans un délai de 100 millisecondes maximum par canal, alors la lecture du PWM de la voie courante est considérée comme échouée pour cause d'une défaillance en amont, à la suite de quoi la lecture PWM passe à la voie suivante automatiquement. Autre fonction disponible : La fonction statique stop permet d'arrêter la lecture des signaux PWM sur tous les ports GPIO utilisés par la classe PwmRead, un nouvel appel à la fonction statique start permet de redémarrer la lecture de manière séquentielle (ports après ports, dans l'ordre de déclaration des objets). Ports des automates programmables concernés par la lecture du PWM : Automate programmable MODULABLE 20 :
- Port GPIO 1 (PD0) = PCINT16 (pin change interrupt 16)
- Port GPIO 2 (PD1) = PCINT17 (pin change interrupt 17)
- Port GPIO 3 (PD2) = PCINT18 (pin change interrupt 18)
- Port GPIO 4 (PD3) = PCINT19 (pin change interrupt 19)
- Port GPIO 5 (PD4) = PCINT20 (pin change interrupt 20)
- Port GPIO 6 (PD5) = PCINT21 (pin change interrupt 21)
- Port GPIO 7 (PD6) = PCINT22 (pin change interrupt 22)
- Port GPIO 8 (PD7) = PCINT23 (pin change interrupt 23)
- Port GPIO 9 (PB0) = PCINT0 (pin change interrupt 0)
- Port GPIO 10 (PB1) = PCINT1 (pin change interrupt 1)
- Port GPIO 11 (PB2) = PCINT2 (pin change interrupt 2)
- Port GPIO 12 (PB3) = PCINT3 (pin change interrupt 3)
- Port GPIO 13 (PB4) = PCINT4 (pin change interrupt 4)
- Port GPIO 14 (PB5) = PCINT5 (pin change interrupt 5)
- Port GPIO 15 (PC0) = PCINT8 (pin change interrupt 8)
- Port GPIO 16 (PC1) = PCINT9 (pin change interrupt 9)
- Port GPIO 17 (PC2) = PCINT10 (pin change interrupt 10)
- Port GPIO 18 (PC3) = PCINT11 (pin change interrupt 11)
- Port GPIO 19 (PC4) = PCINT12 (pin change interrupt 12)
- Port GPIO 20 (PC5) = PCINT13 (pin change interrupt 13)

Automate programmable MODULABLE 32 :
- Port GPIO 1 (PB0) = PCINT8 (pin change interrupt 8)
- Port GPIO 2 (PB1) = PCINT9 (pin change interrupt 9)
- Port GPIO 3 (PB2) = PCINT10 (pin change interrupt 10)
- Port GPIO 4 (PB3) = PCINT11 (pin change interrupt 11)
- Port GPIO 5 (PB4) = PCINT12 (pin change interrupt 12)
- Port GPIO 6 (PB5) = PCINT13 (pin change interrupt 13)
- Port GPIO 7 (PB6) = PCINT14 (pin change interrupt 14)
- Port GPIO 8 (PB7) = PCINT15 (pin change interrupt 15)
- Port GPIO 9 (PD0) = PCINT24 (pin change interrupt 24)
- Port GPIO 10 (PD1) = PCINT25 (pin change interrupt 25)
- Port GPIO 11 (PD2) = PCINT26 (pin change interrupt 26)
- Port GPIO 12 (PD3) = PCINT27 (pin change interrupt 27)
- Port GPIO 13 (PD4) = PCINT28 (pin change interrupt 28)
- Port GPIO 14 (PD5) = PCINT29 (pin change interrupt 29)
- Port GPIO 15 (PD6) = PCINT30 (pin change interrupt 30)
- Port GPIO 16 (PD7) = PCINT31 (pin change interrupt 31)
- Port GPIO 17 (PC0) = PCINT16 (pin change interrupt 16)
- Port GPIO 18 (PC1) = PCINT17 (pin change interrupt 17)
- Port GPIO 19 (PC2) = PCINT18 (pin change interrupt 18)
- Port GPIO 20 (PC3) = PCINT19 (pin change interrupt 19)
- Port GPIO 21 (PC4) = PCINT20 (pin change interrupt 20)
- Port GPIO 22 (PC5) = PCINT21 (pin change interrupt 21)
- Port GPIO 23 (PC6) = PCINT22 (pin change interrupt 22)
- Port GPIO 24 (PC7) = PCINT23 (pin change interrupt 23)
- Port GPIO 25 (PA7) = PCINT7 (pin change interrupt 7)
- Port GPIO 26 (PA6) = PCINT6 (pin change interrupt 6)
- Port GPIO 27 (PA5) = PCINT5 (pin change interrupt 5)
- Port GPIO 28 (PA4) = PCINT4 (pin change interrupt 4)
- Port GPIO 29 (PA3) = PCINT3 (pin change interrupt 3)
- Port GPIO 30 (PA2) = PCINT2 (pin change interrupt 2)
- Port GPIO 31 (PA1) = PCINT1 (pin change interrupt 1)
- Port GPIO 32 (PA0) = PCINT0 (pin change interrupt 0)
Références : Récapitulatif des fonctions et variables de cette classe : unsigned long us = 0; PwmRead (const unsigned char PIN, const bool RISING); static void start(); void read(); static void stop();