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)

mardi 23 juin 2015

Firmata et Arduino (2): allumons des LEDs en python

Dans un récent article, nous nous sommes amusés à contrôler les sorties de l'Arduino au moyen d'un ordinateur, en utilisant le protocole Firmata.  Nous avions alors utilisé un logiciel général déjà existant (Firmata Test Program).

Dans ce second article (et dans ceux qui suivrons), nous allons voir comment procéder pour concevoir nos propres programmes en Python qui permettront à l'ordinateur hôte de contrôler les sorties de l'Arduino au moyen du protocole Firmata.

1) Préparation de l'Arduino

Téléchargez dans l'Arduino le sketch "StandardFirmata" (Menu Fichier - Exemples - Firmata - StandardFirmata).

2) Installation de la bibliothèque PyFirmata

Nous supposons que Python est déjà installé sur votre ordinateur, ainsi que "pip", le logiciel qui permet d'ajouter facilement des modules supplémentaires à Python.

Notez que pip est installé par défaut lors de l'installation de Python depuis les versions 2.7.9 et 3.4.0. Sous Windows, il m'a semblé plus simple de remplacer ma version 2.7.7 de Python par la version 2.7.9 plutôt que d'installer pip séparément (car à première vue, ça semblait un peu compliqué).  Sous Linux, il s'agit d'écrire "sudo apt-get install python-pip" et le tour est joué.

Pour installer PyFirmata, vous écrivez cette ligne de commande dans le terminal (si vous êtes dans Windows, vous faites:  Menu démarrer - Tous les programmes - Accessoires - Invite de Commande):

   pip install pyfirmata

(Sous Linux, je crois que j'ai dû écrire "sudo pip install pyfirmata" pour que ça fonctionne, ce qui bien sûr ne surprendra personne).


Si tout va comme prévu, ça devrait vous confirmer que PyFirmata a été installé avec succès.


3)  Construction d'un circuit constitué de 3 LEDs

À titre de démonstration, nous allons écrire un programme en Python qui contrôle l'état des sorties numériques de l'Arduino, ce qui aura pour effet d'allumer et d'éteindre des LEDs (bien entendu, rien ne vous empêche de remplacer les LEDs par autre chose comme, par exemple, des relais).

Nous branchons donc une LED a chacune des sorties 2, 3 et 4 de l'Arduino, chaque LED étant protégée par une résistance (220 Ω, par exemple).


4)  Script Python simple (interface en mode texte)

Voici un premier script en Python qui permet à l'utilisateur de contrôler l'état des LEDs à partir de l'ordinateur auquel est branché l'Arduino.

Pour modifier l'état d'une sortie numérique (l'équivalent d'un digitalWrite en langage Arduino), la syntaxe est la suivante:

     board.digital[numéro_de_pin].write(0_ou_1)

Ce programme est en mode texte:  c'est probablement plus facile à programmer (surtout si vous êtes novices en Python), mais c'est loin d'être idéal pour l'utilisateur, qui doit patiemment répondre aux questions qu'on lui pose au moyen d'une lettre ou d'un nombre.



Notez que pour que ça fonctionne correctement, vous devez  assigner la valeur appropriée à la variable "port".  Sous Windows ce sera probablement quelque chose comme "COM3", sous Linux ce sera plutôt "/dev/ttyACM0".  Il se peut que vous deviez démarrer l'IDE Arduino pour connaître le nom du port série correspondant à votre Arduino.



5)  Script Python avec interface graphique (Tkinter)

Le programme sera beaucoup plus convivial s'il comporte une interface graphique.  Le sketch présenté ci-dessous utilise Tkinter, qui semble être la solution la plus répendue pour produire des interfaces graphiques en Python.  En général, Tkinter est déjà installé par défaut avec Python.

Pour l'utilisateur, il s'agit de cocher ou décocher les cases pour allumer ou éteindre les LEDs branchées à l'Arduino.





Vous savez maintenant comment contrôler l'état des sorties numériques de l'Arduino à partir d'un ordinateur au moyen d'un script en Python.  Tel que mentionné dans le précédent article, le protocole Firmata permet également de lire l'état des entrées (numériques ou analogiques), produire un signal PWM et contrôler un servomoteur:  ce sera le sujet des prochains articles...


Yves Pelletier   (TwitterFacebook)

lundi 22 juin 2015

Firmata (1): l'Arduino comme périphérique d'un ordinateur

Vous désirez contrôler des relais à partir d'un ordinateur?  Interroger des capteurs afin d'accumuler les données dans un ordinateur (datalogging)?  Dans ce genre d'application, où l'Arduino est utilisé comme un périphérique USB plutôt que comme un dispositif autonome, Firmata peut s'avérer très utile.

Firmata est un protocole qui vise à faciliter la communication entre un ordinateur et un microcontrôleur.   Les messages échangés par l'ordinateur et le microcontrôleur sont similaire à ceux du protocole MIDI, utilisé dans le domaine des instruments de musique électroniques.

Dans ce premier article, je  vous invite à effectuer une petite expérimentation qui, en moins de 5 minutes, devrait vous convaincre de la pertinence, de l'efficacité et de la simplicité du protocole.

1) Préparation de l'Arduino

Sans grande surprise, votre Arduino doit être branché à l'ordinateur hôte, au moyen d'un câble USB.

Nous n'avons pas à installer la bibliothèque Firmata, puisqu'elle est incluse dans l'IDE Arduino. Notre tâche consistera simplement à téléverser dans la carte Arduino l'exemple "StandardFirmata" (Menu Fichier - Exemples - Firmata - StandardFirmata).


Votre Arduino est maintenant prêt à recevoir des messages en provenance de l'ordinateur, et à les interpréter correctement.

2) Préparation de l'ordinateur

Rendez-vous ensuite sur cette page web consacrée à Firmata et téléchargez le logiciel "Firmata Test Program" dans la version appropriée pour votre système d'exploitation (Linux, MacOS ou Windows).

Au démarrage, cette application vous demandera de sélectionner le port série correspondant à votre carte Arduino (menu "Port").  Une fois ce port sélectionné, la fenêtre affiche la liste des entrées/sorties de votre Arduino (sauf les pins 0 et 1, qui sont déjà  utilisées pour la communication série par USB entre l'ordinateur et la carte).



3)  Communication entre l'ordinateur et l'Arduino

À partir de ce logiciel, vous pouvez régler individuellement chaque pin de l'Arduino en entrée numérique (Input) ou en sortie (Output).  Lorsqu'elles en sont capables, certaines pins peuvent également être réglées en entrée analogique (Analog), pour émettre un signal en modulation de largeur d'impulsion (PWM) ou pour commander un servomoteur (Servo).

  • Si vous avez réglé la pin en entrée numérique (Input), son état logique (Low ou High) est affiché.
  • Si vous avez réglé la pin en sortie numérique (Output), un bouton vous permet de régler son état logique à Low ou High (par exemple, la LED de la carte Arduino s'allumera si vous réglez la pin 13 à High).
  • Si vous avez réglé la pin en entrée analogique (possible pour les pins 14 à 19, qui sont les entrées A0 à A5), leur valeur entre 0 et 1023 est affichée.
  • Si vous avez réglé la pin en mode "Servo", un curseur vous permet de régler la position du servomoteur.
  • Si vous avez réglé la pin en mode "PWM", un curseur vous permet de régler le rapport cyclique du signal émis.
Admettez que ce petit programme peut se révéler très pratique, ne serait-ce que pour tester le bon fonctionnement de toutes les pins de votre Arduino, vérifier le fonctionnement correct d'un servomoteur, etc.

Dans un prochain article, nous verrons comment utiliser Firmata dans nos propres programme en Python, qui s'exécuteront sur l'ordinateur hôte.


Yves Pelletier   (TwitterFacebook)