Contrôler un microcontrôleur grâce à Python.

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”. Téléverser le programme sur 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")