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é smbus qui est votre clé vers le monde de l'I2C,
qu'il vous suffira ensuite de charger via la classique instruction import.
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 i2c, et toute tentative d'accès à un des bus détectés échoue. On l'ajoute donc
au groupe :
$ 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 pi est bien dans le groupe i2c :
Copyright © PoBot 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
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !