Ressource proposée par : JF. AMIOTTE-SUCHET
Il est également possible de piloter la carte à microcontrôleur ArduinoTM en langage Python. On évite ainsi l’apprentissage d’un nouveau langage de programmation mais les fonctionnalités offertes sont réduites aux capacités proposées par la bibliothèque python.
Etape n°1
Copier le code ci-dessous dans un nouveau programme Python et nommer-le « microcontroleurs.py« . Ce programme doit être enregistré soit dans le répertoire de travail, soit dans le répertoire contenant les bibliothèques de la distribution Python utilisée (Ex : « lib » pour Edupython). Vous trouverez quelques explications sur les fonctions dans ce document.
#! encoding: utf-8
import serial
class arduino():
def __init__(self,port):
self.serie = serial.Serial(port,baudrate=9600)
synchro = ord(self.serie.read())
while synchro != 0:
synchro = ord(self.serie.read())
def sortie_numerique(self,pin,etat):
self.serie.write(chr(1).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
self.serie.write(chr(etat).encode('latin-1'))
def entree_numerique(self,pin):
self.serie.write(chr(2).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
val=ord(self.serie.read())
return val
def sortie_analogique(self,pin,val):
self.serie.write(chr(3).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
self.serie.write(chr(val).encode('latin-1'))
def entree_analogique(self,pin):
self.serie.write(chr(4).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
val1=ord(self.serie.read())
val2=ord(self.serie.read())
return val1*256 + val2
def son(self,pin,freq,duree=0):
self.serie.write(chr(5).encode('latin-1'))
self.serie.write(chr(pin).encode('latin-1'))
self.serie.write(chr(freq>>8 & 255).encode('latin-1'))
self.serie.write(chr(freq & 255).encode('latin-1'))
self.serie.write(chr(int(duree*1000)>>8 & 255).encode('latin-1'))
self.serie.write(chr(int(duree*1000) & 255).encode('latin-1'))
def module_us(self,echo,trig):
self.serie.write(chr(6).encode('latin-1'))
self.serie.write(chr(echo).encode('latin-1'))
self.serie.write(chr(trig).encode('latin-1'))
val1=ord(self.serie.read())
val2=ord(self.serie.read())
return val1*256 + val2
def resistance_pt100(self,cs,di,do,clk):
self.serie.write(chr(7).encode('latin-1'))
self.serie.write(chr(cs).encode('latin-1'))
self.serie.write(chr(di).encode('latin-1'))
self.serie.write(chr(do).encode('latin-1'))
self.serie.write(chr(clk).encode('latin-1'))
val1=ord(self.serie.read())
val2=ord(self.serie.read())
return 430*(val1*256 + val2)/32768
def fermer(self):
self.serie.close()
Étape n°2
Copier le programme ci-dessous dans une nouveau programme Arduino, nommer le fichier « microcontroleur.ino ».
Une fois la bibliothèque installée (à faire la première fois), téléverser le programme « microcontroleur.ino » dans la carte avec le logiciel ArduinoTM IDE.
#include <Adafruit_MAX31865.h>
void sortie_numerique() {
while (Serial.available() < 2) {
}
int pin = Serial.read();
int etat = Serial.read();
pinMode(pin, OUTPUT);
if (etat == 1) {
digitalWrite(pin, HIGH);
} else {
digitalWrite(pin, LOW);
}
}
void entree_numerique() {
while (Serial.available() < 1) {
}
int pin = Serial.read();
pinMode(pin, INPUT);
Serial.write(digitalRead(pin));
}
void sortie_analogique() {
while (Serial.available() < 2) {
}
int pin = Serial.read();
int val = Serial.read();
pinMode(pin, OUTPUT);
analogWrite(pin, val);
}
void entree_analogique() {
while (Serial.available() < 1) {
}
int pin = Serial.read();
int val = analogRead(pin);
Serial.write((val>>8)&0xFF);
Serial.write(val & 0xFF);
}
void son() {
while (Serial.available() < 5) {
}
int pin = Serial.read();
int freq1 = Serial.read();
int freq2 = Serial.read();
int duree1 = Serial.read();
int duree2 = Serial.read();
unsigned int freq = 256*freq1 + freq2;
unsigned int duree = 256*duree1 + duree2;
if (freq == 0) {noTone(pin);}
else if (duree == 0) {tone(pin,freq);}
else {tone(pin,freq,duree);}
}
void module_us() {
while (Serial.available() < 2) {
}
int echo = Serial.read();
int trig = Serial.read();
// envoie une impulsion
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(5);
digitalWrite(trig, LOW);
// écoute de l'écho
pinMode(echo, INPUT);
unsigned int duree = pulseIn(echo, HIGH);
Serial.write((duree>>8)&0xFF);
Serial.write(duree & 0xFF);
}
void pt100() {
while (Serial.available() < 4) {
}
int cs = Serial.read();
int di = Serial.read();
int doo = Serial.read();
int clk = Serial.read();
Adafruit_MAX31865 max = Adafruit_MAX31865(cs,di,doo,clk);
max.begin(MAX31865_2WIRE);
unsigned int rtd = max.readRTD();
Serial.write((rtd>>8)&0xFF);
Serial.write(rtd & 0xFF);
}
void setup() {
Serial.begin(9600);
Serial.flush();
Serial.write(0);
}
void loop() {
if (Serial.available()) {
int index = Serial.read();
if (index == 1) {
sortie_numerique();
}
else if (index == 2) {
entree_numerique();
}
else if (index == 3) {
sortie_analogique();
}
else if (index == 4) {
entree_analogique();
}
else if (index == 5) {
son();
}
else if (index == 6) {
module_us();
}
else if (index == 7) {
pt100();
}
}
}
Étape n°3 :
Au début du programme Python, il faut importer la bibliothèque « microcontroleurs » : from microcontroleurs import arduino
Puis il faut indiquer le port COM (le format dépend du système d’exploitation) sur lequel est reliée la carte à microcontrôleur ArduinoTM. Ce port est accéssible depuis l’IDE Arduino ou le gestionnaire de périphérique.
Exemples :
macarte = arduino("COM3"),
macarte = arduino("/dev/ttyACM1")
macarte = arduino("/dev/cu.usbmodem1421")



