Raspio32, un module d’extension de GPIOs OpenSource pour Raspberry Pi
Publié le 17 mars 2014

Lorsque j’ai bidouillé mon clavier de minitel, et que j’ai notamment essayé de l’interfacer avec un Raspberry Pi (acheté chez Farnell, rappelez-vous), je me suis rendu compte que les GPIOs de ce dernier étaient vraiment limitées. Pour interfacer correctement le clavier, j’avais besoin de 17 GPIOs, alors que le RaspPi ne m’en offrait que 10 maximum. J’ai donc décidé de créer un module d’extension pour pouvoir prototyper sur Raspberry Pi, fournissant 32 GPIOs.

Raspberry Pi et son bus I²C

Après avoir passé un peu de temps à chercher sur Internet les solutions techniques connues pour Raspberry Pi, j’ai opté pour la solution la plus évidente : l’emploi du bus I²C (« Inter Integrated Circuit »). Ce bus permet d’interfacer des composants électroniques, et notamment des convertisseurs série vers parallèle, comme le MCP23017. La communication avec ce composant est réalisé via deux fils (un signal d’horloge et un signal de donnée, ce qui correspond à une communication série) et permet d’utiliser 16 entrées/sorties (aussi appelées GPIOs pour « General Purpose Input/Output »).

Ces modules sont adressables, avec un codage d’adresse sur 3 bits. Cela signifie que l’on peut en chaîner au maximum 8, et potentiellement adresser 8*16 = 128 GPIOs. 32 seront suffisantes pour ce que je veux faire, et de plus il faudrait que le PCB soit à peu près de la taille du Raspberry Pi, pour que l’on puisse l’enficher un peu comme un shield Arduino. Plus intéressant, Lady Ada (une ingénieure en électronique/informatique qui a créé le site AdaFruit — une référence — a écrit une série d’articles sur la manière d’interfacer le Raspberry Pi avec un ou plusieurs MCP23017.

Plusieurs modules d’extension de ce type existent déjà sur Internet (comme celui-ci, ou encore celui-la), mais il faut débourser d’une dizaine d’euros (sans les frais de port) à une trentaine d’euros. Pis, aucun PCB n’est disponible, et les schémas jalousement gardés. Qu’à cela ne tienne, j’ai alors opté pour la conception d’une version 100% OpenSource, et peu onéreuse.

Prototypage

La phase de prototypage a été rapide, une fois les composants reçus de mon fournisseur préféré. Quelques fils, un MCP23017 et le clavier de mon minitel m’ont servi à tester cette solution. Bien sûr, quelques réglages sont à effectuer sur le Raspberry Pi, notamment pour activer le support de l’I²C, mais au final c’est quand même relativement simple. Voici une photo montrant le montage :

Et le schéma électronique du prototype :

Et pour finir, le module en place sur le Raspberry Pi :

La bibliothèque Python de Lady Ada

AdaFruit fournit sur son Github un ensemble de bibliothèques Python permettant de manipuler l’I²C, et en particulier le MCP23017. Seulement voilà, bien que tout à fait fonctionnelle, cette bibliothèque n’est pas forcément utilisable en l’état vu que j’ai mis en place deux de ces composants et que j’en ai profité pour renommer les GPIOs. C’est pour cela que j’ai implémenté un dérivé de cette bibliothèque, dont le code source est libre et réutilisable, disponible sur Github.

Voici un exemple de configuration du module en Python, qui permet d’allumer une LED connectée entre la broche A0 et A1 du module (avec une résistance de 330ohms bien sûr) :

  1. from raspio import Raspio
  2.  
  3.  
  4. board = Raspio()
  5. board.config(board.A0, board.OUT)
  6. board.config(board.A1, board.OUT)
  7. board.output(board.A0, 0)
  8. board.output(board.A1, 1)

Télécharger

Toute amélioration et/ou critique est la bienvenue, n’hésitez pas à faire des Pull Requests ;).

Une récompense aux soutiens OpenIt

Je possède actuellement deux de ces modules, dont un reste à monter, et me propose de les envoyer à deux personnes ayant soutenu le projet. Si d’autres personnes ayant soutenu le projet OpenIt sont intéressées, je peux éventuellement en produire à nouveau et les envoyer.

Pour les personnes n’ayant pas soutenu le projet, vous pouvez commander la board (pcb) nue sur OSHPark, en suivant ce lien.