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")