Principe de fonctionnement

Dans cette activité, il s'agit de faire l'équivalent de l'activité précédente où l'on envoyait les commandes à l’Arduino depuis le moniteur série, mais cette fois-ci en étant dans un environnement Python :

ArduinoPrincipeCdePyhtonSerie

L'IDE Arduino est utilisé pour téléverser le programme Arduino dans la carte Arduino.

L'éditeur python est utilisé pour envoyer les ordres à la carte Arduino via la liaison série. Un programme analysera les réponses et réagira en conséquence.

Envoyer des commandes depuis python via la laison série

Environnement Arduino

Ce programme est identique à celui étudié dans l'activité 1.

a- Lancer l'IDE Arduino et noter le nom du port USB (Menu outil -> Port). Par exemple COM5.

b- Téléverser ce programme dans l'Arduino

//=======appel des bibliothèques requises
#include <OneWire.h>
#include <DallasTemperature.h>

//=======Configuration utilisation bibliothèques pour capteur température
//branchement de la sortie du capteur DS18B20 sur broche digitale n°4
#define ONE_WIRE_BUS 4
//configuration liason série
OneWire oneWire(ONE_WIRE_BUS);
//
DallasTemperature sensors(&oneWire);

//=======Déclaration des variables
//la led est branchées sur la broche digitale n°10
const int led = 10;
//le potar est branchées sur la broche analogique n°A1         
const int potar = A1;
//les variables reception et potarLevel sont de type integer    
int reception, potarLevel;
//déclaration variable nombre décimal (type float)
float tempC;
//déclaration des variables de type string
String message, commande = "";

//=======Fonction d'initialisation - exécutée 1 seule fois
void setup() {
  //définit le type d'entrée/sortie des broches utilisées
  pinMode(led, OUTPUT);
  pinMode(potar, INPUT);
  //définit les paramètres de la liaison série (cable USB)
  Serial.begin(115200);
  Serial.flush();
  //Active la librairie du capteur de température
  sensors.begin();
}

//=======Boucle principale
void loop() {
  //+++++++++++++Lecture des valeurs des capteurs
  //Lecture du niveau du potar
  potarLevel = analogRead(potar);
  //Lecture de la température
  sensors.requestTemperatures();
  tempC = sensors.getTempCByIndex(0);
  //++++++++++++++Traitement des ordres
  //-------Boucle de réception de données en provenance de la console
  while (Serial.available() > 0) {
    //lecture du code ASCII d'un caractère
    reception = Serial.read();
    //vérifie si c'est le dernier caractère Line Feed "\ln"
    if (reception !=10) {
      commande += char(reception);
    }
    //delais de 5/1000s
    delay(5);
  }
  //------Traitement de la commande on
  if (commande == "on") {
    //Met à l'état haut la sortie led
    digitalWrite(led, HIGH);
    //Affiche dans la console le message "ledOn"
    Serial.println("ledOn");
  }
  //------Traitement de la commande off
  if (commande == "off") {
    //Met à l'état bas la sortie led
    digitalWrite(led, LOW);
    //Affiche dans la console le message "ledOff"
    Serial.println("ledOff");
  }
  //------Traitement de la commande potar
  if (commande == "potar") {
    message = String("valeur =")+potarLevel;
    Serial.println(message);
  }
  //------Traitement de la commande temp
  if (commande == "temp") {
    message = String("température =")+tempC+String("°");
    Serial.println(message);
  }
  //efface la variable commande
  commande = "";  
}

 

Environnement python

a- Lancer l'environnement de développement de python (EduPython, Pyzo ou autre...).

b- Si besoin : installer la bibliothèque pyserial (voir procédure avec l'enseignant)

c- Copier/coller le programme ci-dessous et l'enregistrer dans votre dossier de travail avec comme nom : commandeArduinoPython1

d- Modifier dans le programme le nom du port USB (ligne 8) où le câble série est branché :

- le nom actuel, correspond au nom de port avec un système d'exploitation Linux :  portCom.port ="/dev/ttyACM0"

- vous remplacez le nom par celui relevé précédemment, par exemple : portCom.port ="COM5"

# coding: utf-8
#!/usr/bin/python

import serial
import time

portCom = serial.Serial()
portCom.port = "/dev/ttyACM0"
portCom.baudrate = 115200
portCom.open()

commande = 'yes'
while commande!='exit':
  commande = input("Entrez une commande : ")
  portCom.write(commande.encode())
  time.sleep(0.5)
  nbCar = portCom.in_waiting
  retour = portCom.read(nbCar)
  print(retour.decode())

e- Quelle commande faut-il saisir pour que le programme s'arrête ?

f- Tester le programme python avec les différentes commandes :

- allumer/éteindre la led : on et off

- lire la valeur du potentiomètre : potar

- lire la valeur du capteur de température : temp

Vous constatez que nous obtenons le même fonctionnement que dans l'activité 1.

Utiliser python pour piloter la carte Arduino

 Dans cette activité, l'objectif est de commander la vitesse de clignotement de la led à l'aide du potentiomètre.

Environnement de l’Arduino

Attention : ce programme est différent du précédent.

Vous devez le téléverser dans l’Arduino.

//=======appel des bibliothèques requises
#include <OneWire.h>
#include <DallasTemperature.h>

//=======Configuration utilisation bibliothèques pour capteur température
//branchement de la sortie du capteur DS18B20 sur broche digitale n°4
#define ONE_WIRE_BUS 4
//configuration liason série
OneWire oneWire(ONE_WIRE_BUS);
//
DallasTemperature sensors(&oneWire);

//=======Déclaration des variables
//la led est branchées sur la broche digitale n°10
const int led = 10;
//le potar est branchées sur la broche analogique n°A1         
const int potar = A1;
//les variables reception et potarLevel sont de type integer    
int reception, potarLevel;
//déclaration variable nombre décimal (type float)
float tempC;
//déclaration des variables de type string
String message, commande = "";

//=======Fonction d'initialisation - exécutée 1 seule fois
void setup() {
  //définit le type d'entrée/sortie des broches utilisées
  pinMode(led, OUTPUT);
  pinMode(potar, INPUT);
  //définit les paramètres de la liaison série (cable USB)
  Serial.begin(115200);
  Serial.flush();
  //Active la librairie du capteur de température
  sensors.begin();
}

//=======Boucle principale
void loop() {
  //++++++++++++++Traitement des ordres
  //-------Boucle de réception de données en provenance de la console
  while (Serial.available() > 0) {
    //lecture du code ASCII d'un caractère
    reception = Serial.read();
    //vérifie si c'est le dernier caractère Line Feed "\ln"
    if (reception !=10) {
      commande += char(reception);
    }
    //delais de 5/1000s
    delay(5);
  }
  //------Traitement de la commande on
  if (commande == "on") {
    //Met à l'état haut la sortie led
    digitalWrite(led, HIGH);
  }
  //------Traitement de la commande off
  if (commande == "off") {
    //Met à l'état bas la sortie led
    digitalWrite(led, LOW);
  }
  //------Traitement de la commande potar
  if (commande == "potar") {
    //Lecture du niveau du potar
    potarLevel = analogRead(potar);
    Serial.println(potarLevel);
  }
  //------Traitement de la commande temp
  if (commande == "temp") {
    //Lecture de la température
    sensors.requestTemperatures();
    tempC = sensors.getTempCByIndex(0);
    Serial.println(tempC);
  }
  //efface la variable commande
  commande = "";  
}

 

Environnement python

Dans Python, Copier/Coller le programme ci-dessous et vous l'enregistrez dans votre dossier de travail avec comme nom : commandeArduinoPython2

# coding: utf-8
#!/usr/bin/python
#=======appel des bibliothèques======================
import serial
import time

#=======fonction clignotement led====================
def clignote(delai):
    #delai est exprimé en seconde
    i=0
    while i<10:
        #envoi la commande pour allumer la led
        commande='on'
        portCom.write(commande.encode())
        time.sleep(delai)
        #envoi la commande pour éteindre la led
        commande='off'
        portCom.write(commande.encode())
        time.sleep(delai)
        i=i+1

def potentiometre():
    #envoi de la commande de lecture du potentiomètre
    commande='potar'
    portCom.write(commande.encode())
    time.sleep(0.3)
    #réception des données sur la liaison série
    nbCar = portCom.in_waiting
    retour = portCom.read(nbCar)
    val = retour.decode()
    #val est une suite de caractères et non un nombre
    #si val n'est pas vide
    if (retour.decode()!=''):
        #convertir en entier
        val=int(retour.decode())
    else:
        val=0
    return val

#=======paramétrage de la liaison série==============
portCom = serial.Serial()
portCom.port = "COM8"
portCom.baudrate = 115200
portCom.open()

#=======gestion du clignotement de la led avec le potentiomètre
#exemple d'utilisation des fonctions
duree=0.5
time.sleep(2)
clignote(duree)
potar = potentiometre()
print("potar=",potar)
portCom.close()

 

Utiliser la fonction potar() pour appeler la fonction clignote()

a- Tester le programme python

b- Est-ce que duree et delai ont la même valeur ?

c- Est-ce que l'on peut utiliser directement la valeur de potar pour appeler la fonction clignote() ?

d- Quelle opération mathématique faut-il faire à la valeur de potar pour obtenir un nombre proche de 1s ?

e- Modifier le code pour :

- lire la valeur de potar

- calculer la valeur de duree

- faire clignoter la led avec cette duree

f- Tester le programme

Créer une boucle pour que le potentiomètre soit lu plusieurs fois

a- A l'aide de l'instruction while faire une boucle pour que le programme fonctionne tant que la valeur de duree est supérieure à 0.1s.

b- Tester le programme

c- Améliorer le programme pour que dans python, la valeur de potar soit affichée après l'avoir lue.

 

Afficher l'état de le led et des capteurs sur l'afficheur LCD

L'objectif est d'ajouter l'affichage de l'état de la led (on ou off) et les valeurs des capteurs sur l'afficheur LCD.

C'est donc dans le programme  arduino, qu'il faut faire les modifications. Le programme python reste donc inchangé !

Les instructions d'affichage sont à placer à l'intérieur du code qui analyse une commande.

 Par exemple, si la commande reçue est "on", il faudra afficher que la led est on.

Voici l'affichage à obtenir :

LCD afficheValeurs

 Il est préférable de s'inspirer du dernier code C++ de l'activité 1 et aussi éventuellement de la bibilothèque de l'afficheur.