samedi 27 juin 2015

Firmata et Arduino (3): PWM en python

Nous continuons  donc cette série d'articles sur la façon d'utiliser le protocole Firmata pour contrôler une carte Arduino au moyen d'un script en python qui s'exécute sur un ordinateur hôte.  La dernière fois, nous avions vu comment régler l'état des sorties numériques de l'Arduino.  Cette fois, nous allons contrôler un signal modulé en largeur d'impulsion (PWM).

Qu'est-ce que le PWM?

La modulation par largeur d'impulsion (ou pulse width modulation, d'où l'acronyme PWM) est une succession de signaux logiques 0 ou 1 (donc 0 V et 5 V dans le cas de l'Arduino).  Lorsque le rapport cyclique (duty cycle) est de 0%, le signal est toujours à 0 V.  Lorsque le rapport cyclique est de 100%, le signal est toujours à 5 V.  Si le rapport cyclique est de 25%, le signal est haut pendant 25% du temps, et bas pendant les 75% restants...



Et à quoi ça sert, le PWM?

Au moyen d'un filtre passs-bas, un signal PWM peut être transformé en une tension analogique continue dont la valeur se situe entre 0 et 5 V.  On peut aussi utiliser un signal PWM pour contrôler la vitesse d'un moteur.  Dans cet article, nous utiliserons le signal PWM pour contrôler la luminosité d'une LED (plus le rapport cyclique sera élevé, plus la lumière émise par la LED sera intense).

Le circuit

Le circuit sera évidemment très simple:  une LED et une résistance de protection (220 ohms, par exemple), reliée à une des pins PWM de l'Arduino  (3, 5, 6, 9, 10, 11 sur l'Arduino Uno).  Les scripts présentés ci-dessous supposent que la LED est branchée à la pin 11.



Bibliothèque PyFirmata, etc.

Nous supposons que le sketch "StandardFirmata" a été téléversé dans votre Arduino, et que la bibliothèque pyFirmata a déjà été installée sur l'ordinateur hôte (si ce n'est pas le cas, référez-vous à l'article précédent pour plus de détails sur la façon de procéder).

Rédaction d'un script en python

L'utilisation du PWM avec pyFirmata nécessite deux étapes:

1) Le réglage d'une pin de l'Arduino en mode PWM, au début du programme, au moyen de la méthode "get_pin":

       LEDpin = board.get_pin('d:11:p')

À prime abord, la syntaxe peut sembler un peu nébuleuse: nous créons un objet de type PIN nommé "LEDpin".  Les arguments de get_pin indiquent que la pin numérique  numéro 11 est en mode PWM (le "d" est pour "digital" et le "p" est pour "PWM").

2)  Le réglage du rapport cyclique du signal PWM, chaque fois qu'on désire le modifier:

       board.digital[LEDpin.pin_number].write(rapport_cyclique)

Le rapport cyclique doit être un nombre se situant entre 0 (rapport cyclique de 0%) et 1 (rapport cyclique de 100%).  Par exemple, pour émettre sur la pin numéro 5 un signal PWM dont le rapport cyclique sera de 30%, on pourrait écrire:

       board.digital[5].write(0.3)

Premier exemple de script (interface en mode texte)

Dans ce premier exemple, l'utilisateur doit écrire un nombre (entre 0 et 100) pour régler le rapport cyclique (et, par conséquent, la luminosité de la LED).





Deuxième exemple de script (interface graphique)

Ici, nous utilisons Tkinter pour faire apparaître un curseur qui contrôle le rapport cyclique.




Yves Pelletier   (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire