Ajouter des GPIO à votre Raspberry avec le MCP23017

Voici la sortie d'un nouveau tutoriel... qui s'est fait désiré... mais vaut mieux tard que jamais :-)

Vous utilisez les broches GPIO de votre Pi mais vous en voudriez plus??? pas de problème, utilisez un ou plusieurs MCP23017 (ou MCP23008).



En plus de d'augmenter le nombre d'entrée/sortie digitales, ce composant peut également servir de buffer car le MCP230xx est capable de fournir 25mA par broche là ou le GPIO du Pi est limité à 17mA par broche (avec un total de 50mA pour tout le GPIO)

Si le sujet vous intéresse, je vous propose de vous attarder dans le tutoriel qui se trouve être nettement plus complet

Comment brancher
Plus de détail sur le raccordement dans notre tutoriel

Alimentation du MCP23017 en 3.3v

Dans le cadre de ce montage, le MCP est alimenté en 3.3v. Ses entrées/sorties fonctionne donc aussi en 3.3v.

Alimentation du MCP en 5V

Alimenter votre circuit intégré MCP en 5V permet d'avoir les entrées/sorties du MCP23017 en 5V :-). Il est également possible d'alimenter le MCP en 3.3V mais l'alimentation du Pi sait fournir plus de courant sur la ligne 5V (ce qui peut être plus intéressant).
Etant donné que ce composant utilise I2C pour communiquer, vous pouvez l'alimenter 5V du pi pour alimenter votre MCP même si vous connectez les lignes de données (SDA, SCL) 3.3V de votre Raspberry Pi. C'est possible parce que l'interface I2C du Pi utilise deux résistances Pull-up qui ramènent le potentiel à 3.3V pour les broches SDA et SCL.

Mais attention: vous ne pouvez brancher qu'un seul composant I2C 5V directement sur le bus I2C 3.3V de votre Pi. Si vous branchiez plusieurs composants I2V 5V directement sur le Bus I2C 3.3V, les résistances PullUp du Pi n'arriverons pas à maintenir la tension à 3.3V max côte Pi. Résultat: vous risquez d'endommager votre Bus I2C... voire votre Pi.

Si vous avez plusieurs composant I2C 5V: Vous pouvez très facilement convertir le Bus I2C de 3.3v en 5V en utilisant un "Level Shifter" compatible I2C. Derrière le level shifter, vous pouvez brancher autant de composant I2C 5v que vous voulez.

Le code
Le code de test est relativement simple... mais nécessite l'installation de la bibliothèque depuis le dépôt GitHub d'AdaFruit

#!/usr/bin/python
# -*- encoding: utf8 -*-
from Adafruit_MCP230xx import *

# ***************************************************
# Utiliser num_gpios=8 pour un MCP23008 
# ou  num_gpios=16 pour un MCP23017!
# ***************************************************
# mcp = Adafruit_MCP230XX(address = 0x20, num_gpios = 8) # MCP23008
mcp = Adafruit_MCP230XX(address = 0x20, num_gpios = 16) # MCP23017

# Déclarer les broches 0, 1 et 2 comme sortie (vous pouvez faire de même pour les broches de 0 à 15)
mcp.config(0, mcp.OUTPUT)
mcp.config(1, mcp.OUTPUT)
mcp.config(2, mcp.OUTPUT)

# Déclarer la broche 3 comme entrée (input) et activer la résistance pullup
mcp.config(3, mcp.INPUT)
mcp.pullup(3, 1)

# Lire l'état de la broche 3 et afficher le résultat
print "Pin 3 = %d" % (mcp.input(3) >> 3)

# Changer l'état de la broche 0 
print "Clignoter la broche 0 (CTRL+C pour quitter)"
while (True):
  mcp.output(0, 1) # Mettre la broche 0 à l'état HAUT/High
  time.sleep(1)
  mcp.output(0, 0) # Mettre la broche 0 à l'état BAS/Low
  time.sleep(1)

Error accessing 0x20
Je suis certains que nombre d'entre-vous on déjà eu l'occasion de rencontrer l'énigmatique série de messages

Error accessing 0x20:check your I2C address
Error accessing 0x20:check your I2C address
Error accessing 0x20:check your I2C address
Error accessing 0x20:check your I2C address
Error accessing 0x20:check your I2C address
Error accessing 0x20:check your I2C address


Ce dernier se produit lorsque la bibliothèque n'est pas capable de détecter correctement la révision de votre Pi... mais c'est un problème très facile à contourner.
Lorsque la bibliothèque ne sait pas détecter la révision du pi, elle utilise le Bus I2C sur la broche numéro 0 (correspondant au Raspberry-Pi 256Mb). Le hic, c'est que la majorité des Raspberry actuels sont des modèles 51Mb Modèle B Révision 2 utilisant le Bus I2C sur la broche numéro 1.
Par conséquent, essayer d'adresser le périphérique I2C à l'adresse 0X20 sur la mauvaise broche du bus I2C ne peut que produire une erreur.

Fixer le bus à utiliser

Pour résoudre le problème, il suffit simplement de fixer la broche du bus I2C. Editez le fichier Adafruit_I2C.py avec la commande
 
  nano Adafruit_I2C

et modifiez le paramètre busnum de la ligne suivante
 
 def __init__(self, address, busnum=-1, debug=False):

pour la fixer de la valeur -1 (auto-détection) à la valeur 1 (valeur correspondant au Raspberry 512Mb modèle B rev 2)
 
 def __init__(self, address, busnum=1, debug=False): 
 
Tutoriel
Vous trouverez de nombreuses autres informations dans notre tutoriel

Matériel