Communiquez avec votre Arduino, en Python.

This article is also available in english

Après avoir pris connaissance de la plate forme Arduino, il est temps de commencer à réaliser des montages un peu plus utiles que simplement faire clignoter des LEDs. Nous avons vu qu’il était possible de communiquer avec l’Arduino via le câble USB. Exploitons donc cette fonction pour que notre PC puisse réagir en fonction de conditions extérieurs.

L’Arduino communique avec le PC via le câble USB, qui est une communication série. L’Arduino envoi donc un flux de données vers Le PC qui peut en envoyer en retour. Pour le prototype de notre montage, nous allons juste tester cette communication.

Préparation

Côté matériel, nous allons utiliser ce que nous avions déjà dans les articles précédents. Il va nous falloir programmer le client côté PC. Pour cela, prenons le langage Python.

Python est efficace pour lire les flux, comme nous avons pu le voir dans l’article sur le Mir:ror. Il est évidemment possible d’interagir avec l’Arduino avec d’autres langages et à chacun de choisir selon sa convenance.

Si vous ne disposez pas d’un Arduino, l’Arduino UNO est disponible par exemple via Amazon. Les composants se trouvent chez n’importe quel revendeur de matériel électronique, mais vous pouvez aussi trouver des packs Arduino et matériel.

Le montage

Pour le montage en lui même, nous allons rester simple et reprendre celui avec la photoresistance et la diode. Avec le programme existant, nous avons un capteur qui envoi une valeur sur l’interface série, donc tout ce qu’il faut pour lire un état extérieur. Nous allons donc nous concentrer sur la partie Python.

Arduino, photorésistance et LED

Python possède une bibliothèque assez complète pour communiquer par l’interface série, pySerial. Les informations pour l’installation sont disponibles sur https://pythonhosted.org/pyserial/.

La bonne pratique consiste à créer un Virtualenvs pour travailler sur votre projet au sein duquel vous installerez la bibliothèque par le classique

pip install pyserial

La lecture de l’état de l’Arduino.

Passons à du code. Le script suivant doit être adapté à votre configuration en ce qui concerne le chemin de lecture, ici /dev/tty.usbserial. qui est le chemin du port série sur une machine Linux. Une astuce pour récupérer votre chemin vers le port série est de regarder dans l’environnement Arduino dans le menu Outils/Port.

import serial

ser = serial.Serial('/dev/tty.usbserial', 9600)
while True:
    line = ser.readline()
    print('Value:', line)

Lançons ce scripte, et on doit voir sur la console s’afficher la ligne avec la valeur captée par le récepteur. Et voilà… Il n’y a réellement aucune difficulté pour la lecture. Il faut juste à partir de ce code proposer un traitement plus intelligent. On peut commencer par limiter la quantité d’affichage :

import serial

ser = serial.Serial('/dev/tty.usbserial', 9600)

was_dark = False

while True:
    value = int(ser.readline())
    if value < 200 and not was_dark: # Adapt the value to your component
        print('Its dark here, would you turn on the light ?')
        was_dark = True
    elif value > 200 and was_dark:
        print('Oh, it is light enough now.')
        was_dark = False

Commander l’arduino

Envoyer un message vers l’arduino est aussi simple que le lire puisqu’il suffit d’écrire sur l’interface série plutôt que de lire. Par contre, nous allons devoir revoir notre code sur l’arduino car dans l’état, il ne lit pas les entrées du port série. Changeons donc ce programme par

int val = 0;
int sensorPin = 0;
int ledPin = 13;
byte incomingByte;

void setup() {
    Serial.begin(9600);
    pinMode(ledPin, OUTPUT);
}

void loop() {
    val = analogRead(sensorPin);
    Serial.println(val);

    if (Serial.available() > 0) {
        incomingByte = Serial.read();
        digitalWrite(ledPin, HIGH);
    }

    delay(1000);
    digitalWrite(ledPin, LOW);}

Avec ce programme, l’Arduino envoie en permanence sur le port série la valeur du capteur, et lit sur le port série. Dans la pratique, si une donnée est envoyée à l’Arduino par le port série, elle est stockée dans un tampon (de taille maximum de 64 bytes). La fonction Serial.available() vérifie si une donnée est présente dans ce tampon. Si oui, nous lisons un byte et allumons pendant 1 seconde la LED.

Après avoir chargé ce programme sur l’Arduino, la première partie de cet article fonctionne toujours. Pour tester l’écriture, nous n’allons pas écrire un gros scripte, mais l’exécuter via l’interpréteur intéractif.

>>> import serial
>>> ser = serial.Serial('/dev/tty.usbserial', 9600)
>>> ser.write('0')

Nous ne nous occupons pas ici de ce que nous envoyons à l’Arduino. En effet, ce dernier allume la LED en consommant un byte. Dans le but de tester la communication, c’est satisfaisant. Dans la pratique, il faudra évidemment adapter en fonction de son besoin de traitement.

Voici donc les bases pour envoyer et recevoir des données entre un Arduino et un PC connecté en USB. Le PC en lui même peut être un autre type de machine (NAS, routeur…) sur lequel on peut déployer un client. Le gros du travail sera donc bien de définir les données à échanger. A voir dans un prochain article.

Si vous êtes impatient d’en découvrir d’avantage, le livre Démarrez avec Arduino – 3e édition du cocréateur de l’arduino est une bonne initiation.

À propos de... Darko Stankovski

iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.

Vous aimerez aussi...

4 réponses

  1. Camus dit :

    Bonjour,

    Tout d’abord merci pour ton article fort intéressant!
    Je suis débutant et je ne comprend pas:
    « le script suivant doit être adapté à votre configuration en ce qui concerne le chemin de lecture (/dev/tty.usbserial). »
    En effet lorsque je met ton code dans Python, il me renvoie que le chemin spécifié est introuvable, donc en effet je doit le modifier. Le problème est que je n’ai aucune idée de comment… Je sais déjà coder en python (un peu) mais la je vois pas comment faire…

    Merci d’avance,

    Amaury

    • Camus dit :

      En fait c’est bon sous Windows il fallait simplement mettre COM5 au lieu de /dev/tty.usbserial.
      Par contre je me vois l’accès refusé à chaque fois que je relance un programme sur python. La premiere fois c’est bon et la deuxieme bloque…

      • Merci pour l’autoréponse 🙂

        Je ne vais pas être d’une grande aide là dessus, cet article a été rédigé sous Linux. Si j’ai ajouté le script suivant doit être adapté à votre configuration, c’est justement parce que je n’ai pas testé sur d’autres plate-formes. Et n’ayant plus de Windows…

        La seule piste que je pourrai donner pour le blocage c’est est-ce que le premier lancement ne bloque-t-il pas COM5 qui du coup n’est pas libre pour les accès suivants. Mais à nouveau, je ne saurai pas informer sur Windows…

  1. 27 avril 2013

    […] et principalement à but pédagogique. Vous disposez cependant de tout ce qu’il faut pour communiquer avec votre machine. Je vous laisse imaginer des application et revenir nous en faire […]

Laisser un commentaire

En naviguant sur Dad 3.0, vous acceptez l’utilisation de cookies pour une navigation optimale et nous permettre de réaliser des statistiques de visites. Plus d'informations

Le blog Dad 3.0 utilise les cookies pour vous permettre une navigation optimale et nous permettre de réaliser des statistiques de visite. Dad 3.0 affichant des publicités, celles-si utilisent également des cookies pour un ciblage publicitaire. En continuant la navigation sur Dad 3.0, vous acceptez le dépôt et la lecture de cookies.

Fermer