Ce que l'élève n'a pas à faire...
Complément : Programme pour l'Arduino
Les micro-contrôleurs Arduino sont déjà programmés. Dans le cadre de l'enseignement de physique-chimie, on peut se satisfaire d'un programme standard permettant la communication entre l'ordinateur et la carte Arduino via le port série.
Sur le site de Frédéric Legrand[1], professeur d'informatique appliquée aux sciences physiques en cpge, on peut lire :
Le protocole Firmata permet de commander un Arduino depuis un programme tournant sur un ordinateur (en langage Python, Java, etc). Le programme tournant sur l'arduino reçoit des ordres correspondant aux commandes standard (par exemple digitalWrite) de la part du programme de l'ordinateur.
Ce type d'interface est intéressant pour effectuer des tâches simples ne nécessitant pas de réaction en temps réel de la part de l'Arduino. Il peut aussi servir pour vérifier le fonctionnement d'un circuit électronique relié à l'Arduino, avant de mettre en place une solution en temps réel complète.
Le programme en C++ à téléverser au micro-contrôleur est disponible dans l'archive loi_ohm.zip [zip].
void setup() {
char c;
Serial.begin(500000);
Serial.flush();
c = 0;
Serial.write(c);
c = 255;
Serial.write(c);
c = 0;
Serial.write(c);
}
void loop() {
char commande;
if (Serial.available()>0) {
commande = Serial.read();
if (commande==PIN_MODE) commande_pin_mode();
else if (commande==DIGITAL_WRITE) commande_digital_write();
else if (commande==DIGITAL_READ) commande_digital_read();
else if (commande==ANALOG_WRITE) commande_analog_write();
else if (commande==ANALOG_READ) commande_analog_read();
}
// autres actions à placer ici
}
void commande_pin_mode() {
char pin,mode;
while (Serial.available()<2);
pin = Serial.read(); // pin number
mode = Serial.read(); // 0 = INPUT, 1 = OUTPUT
pinMode(pin,mode);
}
void commande_digital_write() {
char pin,output;
while (Serial.available()<2);
pin = Serial.read(); // pin number
output = Serial.read(); // 0 = LOW, 1 = HIGH
digitalWrite(pin,output);
}
void commande_digital_read() {
char pin,input;
while (Serial.available()<1);
pin = Serial.read(); // pin number
input = digitalRead(pin);
Serial.write(input);
}
void commande_analog_write() {
char pin,output;
while (Serial.available()<2);
pin = Serial.read(); // pin number
output = Serial.read(); // PWM value between 0 and 255
analogWrite(pin,output);
}
void commande_analog_read() {
char pin;
int value;
while (Serial.available()<1);
pin = Serial.read(); // pin number
value = analogRead(pin);
Serial.write((value>>8)&0xFF); // 8 bits de poids fort
Serial.write(value & 0xFF); // 8 bits de poids faible
}
Complément : Programmer la lecture d'une entrée analogique
Les fonctions, comme analogRead(pin), sont toutes incluses dans une classe appelée Arduino. Le programme Python utilise le module pyserial (librairie serial).
Le programme Python est donné ci-dessous :
# -*- coding: utf-8 -*-
import serial
class Arduino():
def __init__(self,port):
self.ser = serial.Serial(port, baudrate=500000)
c_recu = self.ser.read(1)
while ord(c_recu)!=0:
c_recu = self.ser.read(1)
c_recu = self.ser.read(1)
while ord(c_recu)!=255:
c_recu = self.ser.read(1)
c_recu = self.ser.read(1)
while ord(c_recu)!=0:
c_recu = self.ser.read(1)
self.PIN_MODE = 100
self.DIGITAL_WRITE = 101
self.DIGITAL_READ = 102
self.ANALOG_WRITE = 103
self.ANALOG_READ = 104
self.INPUT = 0
self.OUTPUT = 1
self.LOW = 0
self.HIGH = 1
def close(self):
self.ser.close()
def pinMode(self,pin,mode):
self.ser.write(bytes(chr(self.PIN_MODE), "utf8"))
self.ser.write(bytes(chr(pin), "utf8"))
self.ser.write(bytes(chr(mode), "utf8"))
def digitalWrite(self,pin,output):
self.ser.write(bytes(chr(self.DIGITAL_WRITE), "utf8"))
self.ser.write(bytes(chr(pin), "utf8"))
self.ser.write(bytes(chr(output), "utf8"))
def digitalRead(self,pin):
self.ser.write(bytes(chr(self.DIGITAL_READ), "utf8"))
self.ser.write(bytes(chr(pin), "utf8"))
x = self.ser.read(1)
return ord(x)
def analogWrite(self,pin,output):
self.ser.write(bytes(chr(self.ANALOG_WRITE), "utf8"))
self.ser.write(bytes(chr(pin), "utf8"))
self.ser.write(bytes(chr(output), "utf8"))
def analogRead(self,pin):
self.ser.write(bytes(chr(self.ANALOG_READ), "utf8"))
self.ser.write(bytes(chr(pin), "utf8"))
c1 = ord(self.ser.read(1))
c2 = ord(self.ser.read(1))
return c1*0x100+c2