Un détecteur d’ouverture de portes, de mouvements, une sonde température, humidité, un moteur pas à pas, et voilà, il ne reste plus de GPIO de libre. Et si je veux ajouter un LCD, je fais comment?
Si comme moi, le nombre de GPIO disponibles sur le Raspberry Pi ne vous convient pas, il est possible d’en rajouter.
La puce MCP23017 permet d’ajouter 16 GPIO. Quant à la puce MCP23008, elle permet d’en rajouter 8.
Ces puces se connectent au Raspberry Pi en utilisant des GPIO “spéciaux”, dédiés au protocole I²C.
Ces deux puces coûtent $1.95 pour le MCP23008, et $2.95 pour le MCP23017 (chez Adafruit, mais on peut trouver encore moins cher). Seule différence, le MCP23008 se présente sous forme d’une puce à 16 broches, en 2*8, alors que le MCP23017 est une puce à 28 broches, en 2*14. Donc je vous conseillerais le MCP23017.
Coté câblage, c’est assez simple. J’ai utilisé le tutoriel d’Adafruit sur l’utilisation du MCP23017.
Le MCP23017 est alimenté par du 3.3V : VDD (9) sur la puce et 3V3 sur le RaspBerry
La masse du Raspberry : VSS (10) sur la puce et GND sur le RaspBerry
Le GPIO SDA : SDA (13) sur la puce et SDA0 sur le RaspBerry
Et pour finir, le GPIO SCL : : SCL (12) sur la puce et SCL0 sur le RaspBerry
Le MCP23017 a donc 16 pins, de A0 jusqu’à A7 et de B0 jusqu’à B7.
A0 est nommé 0 dans la librairie, et A7 est appellé 7. Ainsi, B0 sera le GPIO 8 et, de la même manière, B7 sera la pin 15
Coté code, il faudra récuperer la librairie de Adafruit. Quant au code python pour utiliser ce chip, il pourra être le suivant ( pareil, cela provient de Adafruit, je n’invente rien) :
# Use busnum = 0 for older Raspberry Pi's (256MB) mcp = Adafruit_MCP230XX(busnum = 0, address = 0x20, num_gpios = 16) # Use busnum = 1 for new Raspberry Pi's (512MB with mounting holes) # mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 16) # Set pins 0, 1 and 2 to output (you can set pins 0..15 this way) mcp.config(0, OUTPUT) mcp.config(1, OUTPUT) mcp.config(2, OUTPUT) # Set pin 3 to input with the pullup resistor enabled mcp.pullup(3, 1) # Read pin 3 and display the results print "%d: %x" % (3, mcp.input(3) >> 3) # Python speed test on output 0 toggling at max speed while (True): mcp.output(0, 1) # Pin 0 High mcp.output(0, 0) # Pin 1 Low