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

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