Programmer l’Arduino avec python (ICN)

L’objectif est de piloter une carte arduino, à partir d’un programme en python s’exécutant dans l’ordinateur.
La carte arduino est programmée de manière à dialoguer avec une librairie python:

  • dans la carte arduino, le programme arduinoPy.ino est préalablement installé. Si ce n’est pas le cas, il s’installe simplement avec l’IDE «Arduino»
  • dans votre répertoire de travail, vous disposez de la librairie pyduino.py

Carte d'extensionPlan de la carte

Librairie python

pyduino.py

Ce fichier est à copier dans le même dossier que votre programme.
Vous ne devez pas le modifier, sauf si vous modifiez également le fichier « arduinoPy.ino » fourni plus bas.

Utilisation de la librairie

Exemple

from pyduino import *
import time

a = Arduino('/dev/ttyACM1')
time.sleep(3)
pos = 100
for i in range(0,1000):
   if i%2 == 0:    
        a.S0(1)
        a.S1(0)
   else:
        a.S0(0)
        a.S1(1)
   if i%3 == 0:
        a.S2(1)
        a.S3(0)
   else:
        pos = 100 - pos
        a.M2(pos)
        a.S2(0)
        a.S3(1)
   v  = a.E0() + 2*a.E1()
   print(' '+ repr(v) + '; A1 = ' + repr(a.A(1)) + '; A6 = '
            + repr(a.A(6)))
   a.M1(60*v)
   a.M0(60*v)
   time.sleep(0.1)

TP de mise en œuvre de la carte d’extension avec python

Firmware Arduino

arduinoPy.ino

Pour être pris en compte par le logiciel arduino, ce fichier est à placer dans un dossier arduinoPy.

Arduino / python : documentation

Introduction

 

La carte, associée à la librairie python, permet de gérer:

  • 2 entrées digitales E0 et E1 reliées à des boutons poussoirs
  • 4 sorties digitales S0 à S3 connectées à des LEDS
  • 6 entrées analogiques de A1 à A6
  • 3 PWM pour servomoteurs, M0, M1 et M2

Pour utiliser la carte, il suffit de déclarer une variable de type Arduino, puis d’utiliser cette variable comme dans les exemples qui suivent.

Initialisation de la carte

Pour être connecté à la carte, il faut exécuter

a = Arduino()

Le constructeur prend un paramètre optionnel pour s’adapter au système.

Exemple sous linux

from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

Exemple sous Windows

from pyduino import *
import time

a = Arduino('COM10')
time.sleep(3)

La valeur par défaut est ‘/dev/ttyACM0’.
Vous pouvez modifier cette valeur par défaut dans votre fichier pyduino.py, elle
est facile à repérer.

Remarque : sous linux, cela peut être /dev/ttyACM1 , /dev/ttyUSB0
et soux windows COM11 , COM12

La connexion à la carte arduino par le port série  redémarre la carte.
Les 3 secondes sont là pour attendre que l’initialisation soit complète.

Les sorties digitales

Elles sont au nombre de 4, accessibles par les méthodes :
 a.S0(<valeur>),  a.S1(<valeur>), a.S3(<valeur>),  a.S4(<valeur>)

ou <valeur> vaut 0 ou 1 pour éteindre ou allumer la sortie correspondante

Exemple

from pyduino import *
import time

a = Arduino('/dev/ttyACM0') # à adapter
time.sleep(3)

i = 0
while True:
    if i%2 == 0:
       a.S0(1)
       a.S1(0)
    else:
       a.S0(0)
       a.S1(1)
    if i%3 == 0:
       a.S2(1)
       a.S3(0)
    else:
       a.S2(0)
       a.S3(1)
    i = i+1

.

Les entrées digitales

On peut en utiliser 2 à partir des boutons placés sur la carte:

v0 = a.E0()
v1 = a.E1()

v0 vaut 1 si le bouton E0 est enfoncé, et 0 sinon
v1 vaut 1 si le bouton E1 est enfoncé, et 0 sinon

Exemple


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)
while True:
   v0 = a.E0()
   v1 = a.E1()
   print(' v0 = '+ v0 + ' et v1 = ' + v1)

Les entrées analogiques

On peut en utiliser 6 (numérotées de 1 à 6).

val = a.A1() renvoie une valeur entière (entre 0 et 400), qui est une valeur numérisée proportionnelle à la tension renvoyée par le capteur.
On peut aussi écrire val = a.A(1) ce qui permet de traiter plusieurs entrées de capteurs dans une boucle.

Exemple


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

while True:
    print(' A1 = ' + repr(a.A(1)))

Les sorties PWM pour les moteurs

Installez un moteur sur la sortie M0 (voyez le plan)


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

while True:
    a.M0(0)
    time.sleep(1)
    a.M0(180)
    time.sleep(1)
    a.M0(90)
    time.sleep(1)

Arduino : carte d’extension

Entrées sorties disponibles

La vocation de cette carte est d’être une ressource pour le prototypage rapide d’applications exécutées sur une arduino ATMEGA-2560 communément répandue.
La plupart des IO de l’arduino restent accessibles. Cependant la carte privilégie:

  • 4 sorties digitales (sorties 10, 11, 12 et 13)
  • 2 entrées digitales : les 2 et 3, qui sont aussi utilisables pour les IRQ
  • 6 entrées analogiques : A1 à A6, avec pour chacune une masse et un Vcc disponible pour faciliter
    le branchement de capteurs
  • 4 sorties PWM : les 4, 7 et 8, pour connecter directement 3 servo-moteurs

Initialisation

Pour utiliser la carte, il convient de faire les initialisations en cohérence avec le câblage:


#include <Servo.h>
Servo M0;
Servo M1;
Servo M2;

void setup() {
    pinMode(10, OUTPUT); digitalWrite(10, LOW);
    pinMode(11, OUTPUT); digitalWrite(11, LOW);
    pinMode(12, OUTPUT); digitalWrite(12, LOW);
    pinMode(13, OUTPUT); digitalWrite(13, LOW);

    pinMode(2, INPUT);
    pinMode(3, INPUT);

    M0.attach(4); M0.write(0);
    M1.attach(7); M1.write(0);
    M2.attach(8); M2.write(pos2);      
}

void loop() { ... }

Fichiers EAGLE