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 :
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 :
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.