Le pcDuino : Programmer les entrées analogiques - Mon Club-Elec

publicité
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en
utilisant les instructions Arduino !
Par X. HINAULT – Juin 2013– MAJ : Juin 2013 – www.mon-club-elec.fr
Intro
•
A ce stade, nous avons vu précédemment :
◦ comment utiliser une broche numérique en sortie
◦ comment utiliser une broche numérique en entrée, notamment avec un bouton poussoir
◦ .. le tout en utilisant des instructions « Arduino-like », tout en programmant en Python.
•
A présent, nous allons voir comment réaliser des mesures avec pcDuino en utilisant les broches d'entrées analogiques.
•
Je rappelle ici les caractéristiques des broches E/S numériques et analogiques du pcDuino :
◦ GPIO : 18 E/S en 3.3V – Topographie « Arduino-like »
◦ Entrées Analogiques : 2 x 6 bits en 0-2V et 4 x 12 bits en 0-3.3V
◦ Sorties analogiques : 6 x PWM (2 broches « fast » en 520Hz – 8 bits et 4 broches « slow » en 5Hz – 20 niveaux)
◦ Comm. Sérielles : I2C, SPI, UART
•
Comme déjà dit, on retrouve la plupart des possibilités de l'Arduino à quelques adaptations...
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 1 / 13
Pré-requis
•
Je suppose ici que vous avez installé l'éditeur de code Geany et de vous connaissez les rudiments de Python, ainsi que le langage Arduino, bien sûr ! Si ce
n'est pas le cas, voir les tutos dédiés précédents.
•
Je suppose ici que vous avez enregistré également une copie de ma librairie des instructions pour Python, arduino.py que j'ai présenté précédemment, dans
le répertoire de vos scripts Python. La librairie, qui est en fait un simple fichier, est ici :
https://github.com/sensor56/pyDuino/blob/master/pcduino/arduino.py
Matériel nécessaire :
◦ une plaque d'essai (ou bread board)
◦ des straps (ou jumpers) mâles/femelles simples
◦ quelques composants de base, notamment : une résistance variable linéaire 10KOhms qui permettra de simuler un capteur analogique
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 2 / 13
Le brochage du pcDuino
•
Le brochage est vraiment semblable à celui de l'Arduino sauf pour :
◦ les E/S 14 à 17 qui sont sur bornier séparé
◦ SCL et SDA qui ne sont pas sur A4 et A5 mais séparées (peuvent être mises sur A4/A5 par soudure d'un pont, mais on doit perdre analogique dans ce
cas)
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 3 / 13
Faire des montages avec le pcDuino
•
Il suffit d'utiliser une plaque d'essai et des straps femelle (côté pcDuino) /mâle (côté plaque d'essai)
•
Utiliser le 3.3V et le 0V pour alimenter la plaque d'essai (et non le 5V..)
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 4 / 13
Programmer les broches analogiques
Où sont-elles ?
Caractéristiques électriques
•
Les broches A0 et A1 sont des entrées analogiques 6 bits : elles renvoient une valeur comprise entre 0 et 63 et mesurent sur une plage de 0-2V, (soit une
résolution de 2 / 64 soit 31,25 mv...)
•
Les broches A2 à A5 sont des entrées analogiques 12 bits : elles renvoient une valeur comprise entre 0 et 4095 et mesurent sur une plage de 0-3,3V (soit
une résolution de 3.3 / 4096 soit 0.8mv !!)
Principe d'une mesure analogique avec pcDuino
•
Les mesures sont simplement lues dans des fichiers /proc/adcx où X est le numéro de la broche analogique. Les valeurs sont lues sous forme de chaînes de
caractères.
•
Il est facile de vérifier l'existence de ces fichiers :
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 5 / 13
$ cd /proc
$ ls
ce qui donne :
Montage de test
Pour réaliser une mesure facilement, le plus simple est d'utiliser une résistance variable :
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 6 / 13
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 7 / 13
Réaliser une mesure analogique avec le pcDuino
Version « brute »
Au sein du boucle while(1) sans fin, on appelle la fonction analogRead() définie ci-dessous : au sein de cette fonction, on lit le fichier et on extrait la valeur. Rien
de très compliqué.
#!/usr/bin/python
# -*- coding: utf-8 -*import time
# -- Classe principale (lancement) -def main():
while(1):
mesure=analogRead()
print str(mesure),
time.sleep(0.1)
def analogRead():
# lecture du fichier
file=open('/proc/adc0','r')
file.seek(0)
out=file.read()
file.close()
# extraction de la valeur
out=out.split(":")
out=out[1]
return(out)
if __name__=="__main__": # pour rendre le code executable
main() # appelle la fonction main
Lancer l'exécution :
On obtient :
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 8 / 13
Tout se passe comme prévu : les valeurs varient lorsque la résistance variable varie... !
Version « Arduino-like »
Bon, vous commencez à avoir l'habitude : place à la version... « Arduino-like »... autrement dit avec l'instruction analogRead()
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 9 / 13
Rappel du programme minimal
•
Je vous rappelle le code minimum « Arduino-like » avec ma librairie arduino.py :
#!/usr/bin/python
# -*- coding: utf-8 -*# exemple pyDuino - par X. HINAULT
# code minimal
from arduino import * # importe les fonctions Arduino pour Python
# entete declarative
#--- setup --def setup():
return
# -- fin setup -# -- loop -def loop():
return
# -- fin loop -#--- obligatoire pour lancement du code -if __name__=="__main__": # pour rendre le code executable
setup() # appelle la fonction setup
while(1): loop() # appelle fonction loop sans fin
•
Remarquer la structure du code :
◦ une entête obligatoire dans un code Python
◦ la ligne d'importation du fichier arduino.py
◦ la fonction setup et la fonction loop : noter ici la présence de l'instruction return qui sert uniquement à ne pas laisser la fonction vide...
◦ une section finale obligatoire dans tout code Python exécutable et ici complétée pour l'exécution des fonctions setup() et loop() à la façon Arduino.
Gardez ce code sous le coude : vous pourrez démarrer tous vos nouveaux codes avec. Il est ici :
https://github.com/sensor56/pyDuino/blob/master/pcduino/exemples/1.Basics/BareMinimum.py
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 10 / 13
•
Du coup, notre programme devient :
#!/usr/bin/python
# -*- coding: utf-8 -*# exemple pyDuino - par X. HINAULT - www.mon-club-elec.fr
# Juin 2013 - Tous droits réservés - GPLv3
# voir : https://github.com/sensor56/pyDuino
# test analogRead
from arduino import * # importe les fonctions Arduino pour Python
# entete declarative
#--- setup --def setup():
return # si vide
# -- fin setup -# -- loop -def loop():
#voie A0
mesure=analogRead(A0) # mesure la voie A0
tension = mesure*2000.0/63.0 # voie A0 et A1 = 6 bits (0-63) sur plage 0-2V
Serial.println (" Voie A0 = " + str(mesure) + " soit " + str("%.2f" % tension) + " mV." )
#voie A2
mesure=analogRead(A2) # mesure la voie A2
tension = mesure*3300.0/4095.0 # voie A2 à A5 = 12 bits (0-4095) sur plage 0-3.3V
Serial.println (" Voie A2 = " + str(mesure) + " soit " + str("%.2f" % tension) + " mV." )
delay(1000)# entre 2 mesures
# -- fin loop -#--- obligatoire pour lancement du code -if __name__=="__main__": # pour rendre le code executable
setup() # appelle la fonction main
while(1): loop() # appelle fonction loop sans fin
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 11 / 13
Ce code est disponible ici : https://github.com/sensor56/pyDuino/blob/master/pcduino/exemples/1.Basics/AnalogRead.py
En ligne de commande, on fera :
$ wget https://raw.github.com/sensor56/pyDuino/master/pcduino/exemples/1.Basics/AnalogRead.py
Lancer l'exécution :
On obtient :
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 12 / 13
•
Remarquer dans ce code une différence notable d'avec le langage Arduino natif : la fonction Serial.println() supporte le formatage natif du langage Python,
utilisé notamment avec la fonction native Python print() : au final une très grande souplesse d'écriture du code.
•
Remarquer également comment on pose les déclarations de variables sans avoir à préciser le type... : c'est çà la souplesse (et aussi simplicité) du langage
Python. Une fois qu'on y a goûté, on en redemande... !
Conclusion
•
Cool non ? çà marche plutôt bien au final. Et çà va vite et c'est réactif... Très bonne impression... Cette fonctionnalité du pcDuino est un élément
important qui le différencie clairement du raspberryPi : avoir les mesures analogiques sur le même système que tout le reste, cela constitue une
plateforme « universelle » !!
•
Et çà donne plein d'idées, en vrac :
◦ serveur de données via réseau,
◦ interface oscilloscope basse fréquence,
◦ etc... que du bon, du très bon... !!
•
Il sera également possible d'enregistrer facilement les données des mesures dans un fichier, soit directement en mémoire NAND, soit sur une carte SD... On
pourra aussi par exemple réaliser une capture d'image et incruster dessus le résultat d'une mesure concommittante, etc... Enfin bref, on fera ce qu'on veut... !
•
A présent, voyons un dernier point concernant les broches E/S : la génération d'impulsions à largeur modulable ou PWM... C'est dans le prochain tuto...
Le pcDuino : Programmer les entrées analogiques du pcDuino avec Python tout en utilisant les instructions Arduino ! - Par X. HINAULT – Juin 2013 – www.mon-club-elec.fr – p. 13 / 13
Téléchargement