RasPi, I2C, Python et LCD

publicité
RasPi, I2C, Python et LCD
Extrait du PoBot
http://www.pobot.org
RasPi, I2C, Python et LCD
- Composants - Les contrôleurs - La carte Raspberry PI - Projets complets avec la Raspberry Pi -
Date de mise en ligne : lundi 31 décembre 2012
Description :
où il est question de connecter un LCD I2C à une RasPi, et de lui parler en Python
PoBot
Copyright © PoBot
Page 1/7
RasPi, I2C, Python et LCD
Sommaire
• Le support I2C pour commencer
• Tout ton bazar connecter (...)
• Les bons droits d'accès (...)
• Et maintenant
• Et ça donne quoi
J'avoue, l'I2C j'aime bien. Pourquoi ? Je n'en sais rien. Peut-être parce c'est ce qui m'a donné le moins de fil à
retordre lors de mes expérimentations passées.
Toujours est-il qu'ayant un LCD I2C de chez Robot Electronics
[http://www.robot-electronics.co.uk/acatalog/LCD_Displays.html] associé à un petit clavier (keypad) d'un côté, et une
Raspberry Pi fraîchement déballée de l'autre, je me suis dit que c'était un bon exercice pratique.
Ah oui, dernier détail : Python, j'aime bien aussi. Je suis tombé dedans tout récemment, et je me suis laissé séduire.
Encore une histoire de serpent, mais ce coup-ci avec une framboise et pas une pomme. Faut bien changer un peu
de temps en temps.
On a donc résumé la mission du jour : Accéder au LCD I2C et à son keypad depuis la planète Rhas-Pih tu devras.
Du Python, la Force t'y conduira.
Le support I2C pour commencer tu installeras
Afin de bien camper le décor, sachez que j'utilise la distribution Occidentalis 0.2
[http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/occidentalis-v0-dot-2] de chez Adafruit déjà
présentée dans nos pages. Elle a l'avantage d'avoir déjà fait une partie du boulot en incluant le support de diverses
interfaces hardware, dont l'I2C. Alors pourquoi se casser la tête, car pour avoir essayé de dépanner rapidement en
réunion un POBOTien en perdition avec sa Raspbian, même si ce n'est pas la mer à boire, ça peut vite vous coûter
quelques heures de recherche d'information et d'essais-erreurs.
Bon, ça c'est bien, mais ça ne fait pas tout. Il nous manque quelques outils et bibliothèques pour pouvoir l'utiliser.
Cet article de chez nous en parle déjà, mais je vais en extraire ici ce qui nous concerne directement, car il développe
un cas de figure basé sur d'autres distribs. Le point important est la toolbox i2c-tools fournie par lm-sensors
[http://www.lm-sensors.org/wiki/I2CTools]. En date de rédaction, il s'agit de la version 3.1.0.
Commencez par en récupérer l'archive :
$ wget http://dl.lm-sensors.org/i2c-tools/releases/i2c-tools-3.1.0.tar.bz2
Puis décompactez-là quelque part dans votre home dir sur la RasPi :
$ tar xf i2c-tools-3.1.0.tar.bz2
Copyright © PoBot
Page 2/7
RasPi, I2C, Python et LCD
et propulsez-vous dans le répertoire ainsi créé :
$ cd i2c-tools-3.1.0
Lisez le README, et construisez les outils et la lib en utilisant la commande indiquée, à savoir :
$ make EXTRA="py-smbus"
En fait si vous omettez le EXTRA, eh bien ça ne nous servira pas à grand chose (en tout cas relativement à Python),
puisque c'est précisément le binding Python qui nous intéresse ici.
Un sudo make install EXTRA="py-smbus" installera le tout là où il faut. A noter qu'il est possible de le faire
directement sans passer par la case précédente, install déclenchant le build au préalable s'il n'est pas déjà
disponible.
Vous disposer maintenant dans les libs Python d'un module dénommé
qu'il vous suffira ensuite de charger via la classique instruction import.
smbus
qui est votre clé vers le monde de l'I2C,
A noter qu'il est question de SMBus et non pas d'I2C ici. De ce que j'en ai compris ça se vaut plus ou moins pour
ce qui nous concerne. J'ai lu çà et là des discussions enflammées sur le fait que l'un est un "subset" de l'autre, et
réciproquement, mais je n'en ai rien retenu de très constructif. Donc en première approximation et jusqu'à preuve du
contraire, pour nous c'est bonnet blanc et blanc bonnet.
Tout ton bazar connecter tu devras
Je sens que les gouttes de sueur commencent à perler sur votre front, car vous n'avez pas manqué de lire de partout
que les GPIO de la RasPi ne sont absolument pas protégées ni même 5V tolérantes. Or notre LCD fonctionne en 5V.
Arghhh....
Avant de sortir un arsenal de level shifters, qui certes marcheront, penchons-nous un coup sur les signaux de l'I2C.
Pour mémoire, il s'agit de deux lignes tirées à Vcc par des pull-ups. Lorsque quelqu'un veut produire un signal, il le
fait en reliant la ligne à la masse via un driver qui n'est rien d'autre qu'un transistor en collecteur ouvert ou équivalent.
Le reste du temps le driver est dit en haute impédance (Hi-Z), c'est à dire qu'il se comporte comme un interrupteur
ouvert. C'est la solution utilisée pour permettre un fonctionnement en bus multi-drop, avec plusieurs devices dessus.
Or la RasPi intègre deux pull-up de 1k8 sur les lignes SDA et SCL du GPIO, et donc c'est elle qui va maintenir le
niveau haut avec une tension qui lui convient parfaitement. Le driver I2C du LCD ne va faire que relier ces lignes à la
masse lorsqu'il voudra générer des signaux. Il ne les force jamais à son 5V à lui. Du coup, pas de prise de tête : il
suffit de relier les signaux directement sur le GPIO.
D'ailleurs cela est confirmé sur le site même du fabricant, qui nous indique gentiment ici
[http://www.robot-electronics.co.uk/htm/raspberry_pi_examples.htm] le câblage de quelques-uns de ses produits
lorsqu'on veut les connecter sur la RasPi.
Attention : Ne me rendez pas responsable si vous avez grillé votre framboise en y connectant tout et n'importe quoi
: ce qui est expliqué ici n'est valable que parce que notre LCD ne fonctionne qu'en tant que slave. Si vous connectez
Copyright © PoBot
Page 3/7
RasPi, I2C, Python et LCD
un équipement fonctionnant en master, il y a de fortes chances que ce soit lui qui drive les lignes à l'état haut. Et s'il
est en logique 5V, adios amigos :(
Les bons droits d'accès avoir il te faudra
On peut lire çà et là des articles qui indiquent de lancer les applications en tant qur root (via sudo) faute de quoi ça
ne marche pas. D'autres solutions en passe par des bibliothèques qui se chargent de fournir l'accès root à un
programme lancé par un user standard. Je n'ai rien fait de tout cela (à ma connaissance en tout cas), et me suis
contenté d'ajouter le user pi (qui est celui avec lequel je travaille sur la RasPi comme la plupart d'entre vous très
certainement) dans le groupe i2c via la commande :
$ sudo adduser pi i2c
J'ai vérifié cela par la procédure suivante :
$ groups
pi adm dialout cdrom sudo audio video plugdev games users input
$ python
Python 2.7.3rc2 (default, May
6 2012, 20:02:25)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from smbus import SMBus
>>> bus = SMBus()
>>> bus.open(1)
Traceback (most recent call last):
File "", line 1, in
IOError: [Errno 13] Permission denied
>>> exit()
Le user pi n'appartient pas au groupe
au groupe :
i2c,
et toute tentative d'accès à un des bus détectés échoue. On l'ajoute donc
$ sudo adduser pi i2c
Adding user `pi' to group `i2c' ...
Adding user pi to group i2c
Done.
--- logout / login ---
$ groups
pi adm dialout cdrom sudo audio video plugdev games users i2c input
Et on refait le test maintenant que
Copyright © PoBot
pi
est bien dans le groupe
i2c
:
Page 4/7
RasPi, I2C, Python et LCD
$ python
Python 2.7.3rc2 (default, May
6 2012, 20:02:25)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from smbus import SMBus
>>> bus = SMBus()
>>> bus.open(1)
>>> bus.read_byte_data(0x63, 3)
6
>>>
Copyright © PoBot
Page 5/7
RasPi, I2C, Python et LCD
Point d'erreur cette fois-ci et tout va bien, la lecture du registre 3 du LCD à l'adresse 0x63 retournant la version de
son firmware, soit 6 ici, ce qu'on peut vérifier par le message qu'il affiche à la mise sous tension :
LCD03 REVISION6
I2CMODE @ 0xC6
On notera que l'adresse affichée ici est en mode 8 bits, c'est à dire bit de R/W inclus. On retrouve 0x63 tout
simplement en divisant 0xC6 par 2, ce qui équivaut à un décalage d'un bit vers la droite.
Pour clôturer ce paragraphe sur les droits d'accès, la confirmation de l'approche est donnée tout simplement en
observant les caractéristiques des pseudo-fichiers correspondant aux bus I2C :
$ ls -l /dev/i2c*
crw-rw---T 1 root i2c 89, 0 Dec 31 18:07 /dev/i2c-0
crw-rw---T 1 root i2c 89, 1 Dec 31 18:07 /dev/i2c-1
On y voit que le owner est root, qu'il appartiennent au groupe i2c pour lequel les droits d'accès en lecture/écriture
sont octroyés, aucun droit n'étant octroyé aux autres utilisateurs. CQFD.
Petit rappel :
Je me permets de souligner ici un élément important, déjà annoncé en début d'article : cette facilité de mise en
oeuvre est en grande partie le résultat de l'utilisation de la distribution Occidentalis au lieu de la Raspbian de base.
Sur cette dernière il y un certain nombre de choses à faire en plus, et à moins d'y tenir vraiment, c'est plus
chronophage que passionnant. Certes c'est peut-être formateur, mais mon objectif premier étant de tester la mise en
oeuvre de l'I2C tout en conservant un minimum d'heure de sommeil par nuit, c'est tout vu. Maintenant, c'est vous qui
voyez.
Et maintenant ?
Passés les premiers tests de bon fonctionnement en mode interactif, le plus propre est d'écrire un petit module qui
va encapsuler cela bien proprement dans une classe baptisée LCD03. Je confesse avoir manqué d'imagination, mais
pourquoi se torturer les méninges.
Ce module, qui intègre un petit programme de démo lorsqu'il est lancé en direct, vous est généreusement offert par
votre serviteur. Il fait partie d'un package Python récemment démarré et qui a pour vocation de fournir une boite à
outils simple pour interfacer ce qui nous passe entre les mains. Je sais qu'il y en a déjà des légions, mais comme
cela vous aurez le choix.
Il est disponible sous GitHub via l'URL :
git://github.com/Pobot/RasPy.git
Copyright © PoBot
Page 6/7
RasPi, I2C, Python et LCD
Plutôt que d'en faire des tartines ici, le mieux est de lire le code : je l'ai abondamment commenté.
Et si vous vous demandez à quel anglophone j'ai piqué le source : à personne. Il se trouve que par déformation
professionnelle, je rédige tout en anglais dès lors que j'écris du code, même si c'est pour moi. Et comme l'anglais est
beaucoup plus concis que le français, ça évite des commentaires à rallonge pour dire la même chose.
Et ça donne quoi ?
J'ai failli oublier... Ci-dessous une petite photo de la manip :
Une RasPi, un LCD, de l'I2C et un serpent
On y voit la connexion avec le GPIO, le LCD avec son pote le keypad et un serpent qui surveille tout ce petit monde.
Je sais que le design du boîtier n'est pas au top, car j'avais packagé le LCD dans un modèle façon Traban de
l'ancienne RDA. On fait avec ce qu'on a...
Have fun ;)
Copyright © PoBot
Page 7/7
Téléchargement