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)

1 commentaire:

  1. Un grand merci pour cet article qui permet d'avancer a grand pas dans la communication entre Python et Arduino.
    Par contre je suis face à un problème il semble que en quittant le scriptle port (com9 dans mon cas) ne se libère pas et il n'est plus possible de relancer le script ou d'utiliser l'arduino avec son ide par exemple.
    Avez vous une solution pour libérer le port car la seule méthode que j'ai trouvé consiste à quitter python.

    Cordialement, Philippe.

    RépondreSupprimer