Différences entre versions de « Rasp-Hack-MCP230XX-Librairie »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(29 versions intermédiaires par le même utilisateur non affichées)
Ligne 4 : Ligne 4 :
 
{{bloc-etroit|text=Nous vous avons montré comment brancher le MCP23017... nous n'allons pas vous laisser là avec le circuit et un "bonne chance".
 
{{bloc-etroit|text=Nous vous avons montré comment brancher le MCP23017... nous n'allons pas vous laisser là avec le circuit et un "bonne chance".
  
Nous allons maintenant nous pencher sur la bibliothèque pour le MCP23008 et MCP23017 disponible sur le [https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code dépôt GitHub Python pour Raspberry produit par d'AdaFruit]. The easiest way to use it is with our convenient [http://wiki.mchobby.be/index.php?title=Pi-WebIde WebIDE], which will automatically point to the Adafruit github repository.
+
Nous allons maintenant nous pencher sur la bibliothèque pour le MCP23008 et MCP23017 disponible sur le [https://github.com/adafruit/Adafruit_Python_GPIO dépôt GitHub Python pour Raspberry produit par d'AdaFruit]. Le plus facile, c'est d'utiliser [http://wiki.mchobby.be/index.php?title=Pi-WebIde WebIDE], l'environnement super pratique d'AdaFruit, qui pointe déjà automatiquement sur le dépôt GitHub d'AdaFruit.
  
Once you've opened up the WebIDE in the browser, you simply need to click in the left-hand navigation on the following folders and filenames:
+
Une fois que vous avez ouvert WebIDE dans votre Navigateur, vous pouvez simplement cliquer sur les répertoires et noms suivants dans la barre de navigation à gauche:
  
* Adafruit-Raspberry-Pi-Python-Code
+
# Adafruit-Raspberry-Pi-Python-Code
* Adafruit_MCP230xx
+
# Adafruit_MCP230xx
* Adafruit_MCP230xx.py
+
# Adafruit_MCP230xx.py
  
This should give you something similar to the following:}}
+
Vous devriez alors avoir une vue ressemblant à celle-ci:}}
  
This should give you something similar to the following:
+
{{ADFImage|Rasp-Hack-MCP230XX-Librairie-01.jpg}}
 +
 
 +
Si vous ne disposez de WebIDE, vous pouvez [https://github.com/adafruit/Adafruit_Python_GPIO télécharger toute la bibliothèque directement depuis le dépôt GitHub d'AdaFruit]
 +
 
 +
Le fichier Adafruit_MCP230xx.py contient à la fois:
 +
* La définition de classes "wrapper" permettant de communiquer facilement avec le MCP23008 et MCP23017
 +
* Le programme de test
 +
 
 +
De sorte que si vous exécutez la commande...
 +
 
 +
sudo ./Adafruit_MCP230xx.py
 +
 
 +
Vous exécuter aussi le programme de test.
 +
 
 +
Si cette approche coule de source pour les codeurs Python expérimentés, ce n'est pas forcement une approche aisée pour les nouveaux venus... ainsi, je vous propose de créer le programme mcp23017_test.py pour faciliter votre expérimentation.
 +
 
 +
== mcp23017_test.py ==
 +
 
 +
=== Créer mcp23017_test.py ===
 +
Après avoir téléchargé et décompressé la bibliothèque Python depuis GitHub, ouvrez un terminal (ou session XTerm) et rendez vous dans le répertoire ''Adafruit-Raspberry-Pi-Python-Code/Adafruit_MCP230xx''.
 +
 
 +
Vous devez y voir le fichier ''Adafruit_MCP230xx.py''.
 +
 
 +
Depuis cet emplacement, taper la commande suivante pour commencer l'édition du fichier mcp23017_test.py
 +
 
 +
nano mcp23017_test.py
 +
 
 +
=== Le code ===
 +
Une fois dans l'éditeur nano, encodez le code suivant:
  
{{ADFImage|Rasp-Hack-MCP230XX-Librairie-01.jpg}}
+
<syntaxhighlight lang="python">
 +
#!/usr/bin/python
 +
# -*- encoding: utf8 -*-
 +
from Adafruit_MCP230xx import *
  
  <nowiki># Use busnum = 0 for older Raspberry Pi's (256MB)
+
# ***************************************************
mcp = Adafruit_MCP230XX(busnum = 0, address = 0x20, num_gpios = 16)
+
# Utiliser num_gpios=8 pour un MCP23008
# Use busnum = 1 for new Raspberry Pi's (512MB with mounting holes)
+
# ou num_gpios=16 pour un MCP23017!
# mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 16)
+
# ***************************************************
 +
# mcp = Adafruit_MCP230XX(address = 0x20, num_gpios = 8) # MCP23008
 +
mcp = Adafruit_MCP230XX(address = 0x20, num_gpios = 16) # MCP23017
  
# Set pins 0, 1 and 2 to output (you can set pins 0..15 this way)
+
# 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, OUTPUT)
+
mcp.config(0, mcp.OUTPUT)
mcp.config(1, OUTPUT)
+
mcp.config(1, mcp.OUTPUT)
mcp.config(2, OUTPUT)
+
mcp.config(2, mcp.OUTPUT)
  
# Set pin 3 to input with the pullup resistor enabled
+
# Déclarer la broche 3 comme entrée (input) et activer la résistance pullup
 +
mcp.config(3, mcp.INPUT)
 
mcp.pullup(3, 1)
 
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
+
# 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):
 
while (True):
   mcp.output(0, 1) # Pin 0 High
+
   mcp.output(0, 1) # Mettre la broche 0 à l'état HAUT/High
   mcp.output(0, 0) # Pin 1 Low</nowiki>
+
  time.sleep(1)
 +
   mcp.output(0, 0) # Mettre la broche 0 à l'état BAS/Low
 +
  time.sleep(1)
 +
</syntaxhighlight>
  
This file contains both the base MCP230xx class that makes it easy to use the chip, along with a very simple demo that will toggle a single pin as fast as possibleThe example code shows how you can set pins to both input and output:
+
Sauvez le code et quitter nano
 +
 
 +
=== Rendre exécutable ===
 +
Avant d'exécuter le programme de test, il faut rendre le fichier exécutable
 +
 
 +
sudo chmod +x mcp23017_test.py
 +
 
 +
=== Exécuter ===
 +
Vous pouvez finalement exécuter le programme à l'aide de la commande suivant. Attention: Il faut utiliser un sudo pour permettre au programme d'accéder au GPIO.
 +
   
 +
sudo ./mcp23017_test.py
 +
 
 +
 
 +
== Error accessing 0x20 ==
 +
Lors de nos tests, avons obtenu le message d'erreur suivant:
 +
<nowiki>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</nowiki>
 +
 
 +
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.
 +
 
 +
=== Fixons 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):
 +
 
 +
Voila, il ne reste qu'à sauver et retester votre programme ''mcp23017_test.py''
  
 
== Créer une instance de Adafruit_MCP230xx ==
 
== Créer une instance de Adafruit_MCP230xx ==
Pour créer une instance de la classe "wrapper"  qui permet d'accéder au MCP230xx, vous devez retirer le commentaire d'une des deux se trouvant au début du code ci dessous. Il y deux lignes d'initialisation possible parce qu'il y a deux versions du Raspberry Pi. La première version (avant la révision Modèle B et 512MB SDRAM) utilisait la ligne I2C0, tandis que le dernier modèle B (avec 512MB SDRAM) utilise la ligne I2C1.
+
Pour créer une instance de la classe "wrapper"  qui permet d'accéder au MCP230xx, vous devez retirer le commentaire d'une des deux se trouvant au début du code ci dessous.  
  
C'est la raison de l'existence du premier paramètre '''busnum'''.  
+
La bibliothèque détecte automatiquement la révision du Raspberry Pi et utilise la ligne I2C adéquate. En effet, la première version (avant la révision Modèle B et 512MB SDRAM) utilisait la ligne I2C0, tandis que le dernier modèle B (avec 512MB SDRAM) utilise la ligne I2C1.
  
 
Le paramètre '''address''' permet d'indiquer l'adresse du MCP23017 en notation hexadécimal. En partant du principe que les 3 lignes d'adresses du MCP23017 sont branchées à la masse/GND, l'adresse du MCP23017 est 0x20 (qui est l'adresse de base).  
 
Le paramètre '''address''' permet d'indiquer l'adresse du MCP23017 en notation hexadécimal. En partant du principe que les 3 lignes d'adresses du MCP23017 sont branchées à la masse/GND, l'adresse du MCP23017 est 0x20 (qui est l'adresse de base).  
Ligne 49 : Ligne 131 :
 
Le paramètre '''num_gpios''' indique le nombre de broches d'entrée/sortie (GPIO) disponible sur le module MCP230xx. Puisqu'il s'agit d'un MCP23017, nous avons donc 16 broches.
 
Le paramètre '''num_gpios''' indique le nombre de broches d'entrée/sortie (GPIO) disponible sur le module MCP230xx. Puisqu'il s'agit d'un MCP23017, nous avons donc 16 broches.
  
  <nowiki># Utiliser busnum = 0 pour les Raspberry plus ancien (avant la version 512MB)
+
  <nowiki>mcp = Adafruit_MCP230XX(address = 0x20, num_gpios = 16)
#mcp = Adafruit_MCP230XX(busnum = 0, address = 0x20, num_gpios = 16)
+
# Si vous utilisez un MCP23008, vous devez utiliser la ligne suivante
 
+
# mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 8)</nowiki>
# Utiliser busnum = 1 pour les nouveaux Raspberry (avec 512MB de RAM)
 
mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 16)</nowiki>
 
  
=== Addresse du MCP230xx ===
+
=== Les adresses du MCP230xx ===
 
Comme indiqué ci-dessus, l'adresse par défaut d'un MCP23017 est 0X20 si toutes les lignes d'adresses sont raccordées à la masse.
 
Comme indiqué ci-dessus, l'adresse par défaut d'un MCP23017 est 0X20 si toutes les lignes d'adresses sont raccordées à la masse.
  
Ligne 82 : Ligne 162 :
 
Le MCP23017 à 16 broches d'entrée/sortie - de A0 à  A7 + B0 à B7.
 
Le MCP23017 à 16 broches d'entrée/sortie - de A0 à  A7 + B0 à B7.
  
'''A0''' is called '''0''' in the library, and '''A7''' is called '''7''', then '''B0''' continues from there as is called '''8''' and finally '''B7''' is pin '''15'''
+
'''A0''' est appelé '''0''' dans la bibliothèque/librairie, et la broche '''A7''' est appelée '''7'''.
 +
 
 +
La numérotation continue ensuite pour la broche '''B0''' qui s'appelle '''8''' et pour finir, la broche '''B7''' s'appelle la broche '''15'''
  
 
== Activer une broche en entrée ==
 
== Activer une broche en entrée ==
You can enable or disable the internal pullup resistor and set the pins as input with the following lines of code:
+
Vous activer une broche en entrée, il faut activer/désactiver la résistance pullup interne et et initialiser la broche en entrée à l'aide du code suivant:
  
  <nowiki># Set pin 3 to input with the pullup resistor enabled
+
  <nowiki># Initialise la broche 3 en entrée ("''input''" comme disent les anglophones)
 +
# et activation de la résistance pullup
 
mcp.pullup(3, 1)
 
mcp.pullup(3, 1)
  
# Read pin 3 and display the results
+
# Lecture de la broche 3 et affichage du résultat
 
print "%d: %x" % (3, mcp.input(3) >> 3)</nowiki>
 
print "%d: %x" % (3, mcp.input(3) >> 3)</nowiki>
  
The second line reads pin 3, and shifts the value left 3 bits so that it will equal 0 or 1 depending on whether the pin is high or low when it is sampled. This will results in output similar to the following: "3: 0" or "3: 1" (depending on the pin state).
+
Le seconde ligne lit la broche 3, et décale la valeur de 3 bits sur la gauche (''shift left'') nous aurons donc  une valeur égale à 0 ou 1 en fonction de l'état de la broche d'entrée (si elle est à l'état logique haut/high ou bas/low).  
 +
 
 +
Le résultat affiché sera donc quelque-chose comme "3: 0" ou "3: 1" (en fonction de l'état de la broche).
 +
 
 +
=== Résistance PullUp? ===
 +
Qu'est-ce donc qu'une résitance PullUp?
 +
 
 +
Le schéma ci-dessous présente le principe d'un montage Pull-Up (avec une alimentation de 5V). Ce n'est pas celui utilisé dans le MCP23017 mais le principe est le même.
 +
 
 +
{{ADFImage|Button-PullUp.png}}
 +
 
 +
Admettons que:
 +
# Le Switch soit un bouton poussoir que vous ayez raccordé sur l'entrée 3 de votre MCP23017.
 +
# La résistance Pull-Up est la résistance de 10Ko mentionné sur le graphique
 +
# ... et l'état de l'entrée 3 est lue (de façon interne) à l'emplacement P2.
 +
 
 +
Pull-up signifie "tirer vers le haut"... ce qui est le comportement de ce montage.
 +
 
 +
* Si personne ne pousse sur le bouton, le potentiel de l'emplacement P2 est tiré vers +5V (P2 étant raccordé sur +5V via la résistance Pull-up de 10Ko).<br />L'entrée du MCP est donc à l'état Haut/High.
 +
* Si le bouton Switch est pressé, alors le potentiel est P2 est attiré à la masse/GND (par ''le chemin le plus court'')...<br />L'entrée du MCP est donc à l'état bas... et comme il y a une résistance de 10Ko entre +5V et la masse, nous n'avons pas de court-circuit :-) 
 +
 
 +
Pour en savoir plus sur les résistance pullup et pulldown, vous pouvez consulter notre article [http://arduino103.blogspot.be/2011/05/entree-bouton-resistance-pull-up-pull.html Entrée Bouton - Résistance pull-up, pull-down et déparasitage] sur le Blog de MCHobby. Cette article est écrit pour Arduino (en 5.0V) mais s'applique tout aussi bien aux techniques 3.3v.
  
 
== Activer une broche comme sortie ==
 
== Activer une broche comme sortie ==
  
To set  a pin as output, you also need two lines of code:  
+
Pour activer une broche comme une sortie ("''output''" en anglais), vous avez besoin d'utiliser deux lignes de code:  
  
  <nowiki># Set pin 0 to output (you can set pins 0..15 this way)
+
  <nowiki># Activer la broche 0 comme sortie/output
 +
# (vous pouvez initialiser les broches de 0 à 15 de cette facon)
 
mcp.config(0, OUTPUT)
 
mcp.config(0, OUTPUT)
  
# Set pin 0 High
+
# assigner la sortie 0 - état haut/High
 
mcp.output(0, 1)   
 
mcp.output(0, 1)   
  
# Set pin 0 Low
+
# Assigner la sortie 0 - état bas/Low
 
mcp.output(0, 0)</nowiki>
 
mcp.output(0, 0)</nowiki>
  
That's all there is to it!  The default sample code will toggle the GPIO pin as fast as possible, and if you hooked it up to an oscilloscope you'd end up with something similar to the following:  
+
== Exemple en vidéo ==
 +
Voici la vidéo correspondant au programme de test ''mcp23017_test.py''.
 +
 
 +
{{#Widget:Iframe
 +
|url=https://www.youtube.com/embed/TCdfEBJeh_A
 +
|width=420
 +
|height=315
 +
|border=0
 +
}}
 +
 
 +
Dans l'exemple suivant, le code d'exemple essaye de basculer la broche GPIO aussi vite que possible... et si vous y branchez un oscilloscope vous devriez voir quelque-chose comme ce qui suit:  
  
 
{{#Widget:Iframe
 
{{#Widget:Iframe
|url=http://www.youtube.com/embed/zBuMJ-R40N0
+
|url=https://www.youtube.com/embed/zBuMJ-R40N0
 
|width=420
 
|width=420
 
|height=315
 
|height=315
 
|border=0
 
|border=0
 
}}
 
}}
 +
 
<small>Source: [http://www.adafruit.com AdaFruit Industries], liens direct: [https://www.youtube.com/watch?v=zBuMJ-R40N0 sur YouTube]</small>
 
<small>Source: [http://www.adafruit.com AdaFruit Industries], liens direct: [https://www.youtube.com/watch?v=zBuMJ-R40N0 sur YouTube]</small>
 +
 +
=== Vitesse Max ===
 +
Sur base du code d'exemple, nous apprenons qu'il est possible de basculer une seule broche du GPIO à 300 Hertz  (un changement d'état toutes les 0.00333 secondes).
 +
 +
Cette fréquence maximum dépend:
 +
# de la charge de votre système d'exploitation,
 +
# de l'optimisation du programme
 +
# mais aussi du nombre de composants et ordres qui passent sur le bus I2C.
  
 
== Interruption et Callback ==
 
== Interruption et Callback ==
As it currently stands, the library does not support any sort of interrupt or call back functionality (there is a hardware interrupt pin on the MCP but we don't use it in this code). Only polling is currently supported!
+
Dans l'état actuel, la bibliothèque ne supporte aucun type de d'interruption matériel (puisque le MCP est capable d'émettre un signal d'interruption) ou fonctionnalité de type callback (Callback = rappel de fonction sur base d'un événement). La bibliothèque supporte uniquement la méthode de polling (Polling = opération d'interrogration pour lire l'état des broches, voir aussi [http://fr.wiktionary.org/wiki/polling cet article sur Wikipedia])!
  
 
{{Rasp-Hack-MCP230XX-TRAILER}}
 
{{Rasp-Hack-MCP230XX-TRAILER}}

Version actuelle datée du 16 octobre 2017 à 02:24


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Point de départ

Nous vous avons montré comment brancher le MCP23017... nous n'allons pas vous laisser là avec le circuit et un "bonne chance".

Nous allons maintenant nous pencher sur la bibliothèque pour le MCP23008 et MCP23017 disponible sur le dépôt GitHub Python pour Raspberry produit par d'AdaFruit. Le plus facile, c'est d'utiliser WebIDE, l'environnement super pratique d'AdaFruit, qui pointe déjà automatiquement sur le dépôt GitHub d'AdaFruit.

Une fois que vous avez ouvert WebIDE dans votre Navigateur, vous pouvez simplement cliquer sur les répertoires et noms suivants dans la barre de navigation à gauche:

  1. Adafruit-Raspberry-Pi-Python-Code
  2. Adafruit_MCP230xx
  3. Adafruit_MCP230xx.py

Vous devriez alors avoir une vue ressemblant à celle-ci:

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Si vous ne disposez de WebIDE, vous pouvez télécharger toute la bibliothèque directement depuis le dépôt GitHub d'AdaFruit

Le fichier Adafruit_MCP230xx.py contient à la fois:

  • La définition de classes "wrapper" permettant de communiquer facilement avec le MCP23008 et MCP23017
  • Le programme de test

De sorte que si vous exécutez la commande...

sudo ./Adafruit_MCP230xx.py 

Vous exécuter aussi le programme de test.

Si cette approche coule de source pour les codeurs Python expérimentés, ce n'est pas forcement une approche aisée pour les nouveaux venus... ainsi, je vous propose de créer le programme mcp23017_test.py pour faciliter votre expérimentation.

mcp23017_test.py

Créer mcp23017_test.py

Après avoir téléchargé et décompressé la bibliothèque Python depuis GitHub, ouvrez un terminal (ou session XTerm) et rendez vous dans le répertoire Adafruit-Raspberry-Pi-Python-Code/Adafruit_MCP230xx.

Vous devez y voir le fichier Adafruit_MCP230xx.py.

Depuis cet emplacement, taper la commande suivante pour commencer l'édition du fichier mcp23017_test.py

nano mcp23017_test.py

Le code

Une fois dans l'éditeur nano, encodez le code suivant:

#!/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)

Sauvez le code et quitter nano

Rendre exécutable

Avant d'exécuter le programme de test, il faut rendre le fichier exécutable

sudo chmod +x mcp23017_test.py 

Exécuter

Vous pouvez finalement exécuter le programme à l'aide de la commande suivant. Attention: Il faut utiliser un sudo pour permettre au programme d'accéder au GPIO.

sudo ./mcp23017_test.py


Error accessing 0x20

Lors de nos tests, avons obtenu le message d'erreur suivant:

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.

Fixons 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):

Voila, il ne reste qu'à sauver et retester votre programme mcp23017_test.py

Créer une instance de Adafruit_MCP230xx

Pour créer une instance de la classe "wrapper" qui permet d'accéder au MCP230xx, vous devez retirer le commentaire d'une des deux se trouvant au début du code ci dessous.

La bibliothèque détecte automatiquement la révision du Raspberry Pi et utilise la ligne I2C adéquate. En effet, la première version (avant la révision Modèle B et 512MB SDRAM) utilisait la ligne I2C0, tandis que le dernier modèle B (avec 512MB SDRAM) utilise la ligne I2C1.

Le paramètre address permet d'indiquer l'adresse du MCP23017 en notation hexadécimal. En partant du principe que les 3 lignes d'adresses du MCP23017 sont branchées à la masse/GND, l'adresse du MCP23017 est 0x20 (qui est l'adresse de base).

Le paramètre num_gpios indique le nombre de broches d'entrée/sortie (GPIO) disponible sur le module MCP230xx. Puisqu'il s'agit d'un MCP23017, nous avons donc 16 broches.

mcp = Adafruit_MCP230XX(address = 0x20, num_gpios = 16)
# Si vous utilisez un MCP23008, vous devez utiliser la ligne suivante
# mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 8)

Les adresses du MCP230xx

Comme indiqué ci-dessus, l'adresse par défaut d'un MCP23017 est 0X20 si toutes les lignes d'adresses sont raccordées à la masse.

Si vous voulez utiliser une configuration des broches d'adresse différente, vous pouvez ouvrir la fiche technique pour voir comment fonctionne le schéma d'adressage (fiche technique du MCP23017 ou la fiche technique du MCP23008.)

Pour le MCP23017, il s'agit des broches A0, A1, 02 correspondant aux broches numéro 15, 16, 17.

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Les broches d'adresses peuvent être soit:

  • Activé: dont la broche est placée à l'état HAUT, dit HIGH en raccordant la broche sur la tension d'alimentation du MCP23017.
    Si votre MCP est alimenté en +5V, ce sera +5V. S'il est alimenté en 3.3v, ce sera 3.3v.
  • Désactivé: dont la broche est placée à l'état BAS, dit LOW en raccordant la broche sur la masse/GND.

En fonction de la combinaison de raccordement du MCP23017, vous obtiendrez une nouvelle adresse sur le BUS I2C.

Rasp-Hack-MCP23017-Adresses.jpg

Numéro des broches

MCP23008

Le MCP23008 à 8 broches d'entrée/sorties - A0 à A7.

A0 est appelé 0 dans la bibliothèque/librairie, et A7 est appelé 7 (les autres broches suivent le même schéma).

MCP23017

Le MCP23017 à 16 broches d'entrée/sortie - de A0 à A7 + B0 à B7.

A0 est appelé 0 dans la bibliothèque/librairie, et la broche A7 est appelée 7.

La numérotation continue ensuite pour la broche B0 qui s'appelle 8 et pour finir, la broche B7 s'appelle la broche 15

Activer une broche en entrée

Vous activer une broche en entrée, il faut activer/désactiver la résistance pullup interne et et initialiser la broche en entrée à l'aide du code suivant:

# Initialise la broche 3 en entrée ("''input''" comme disent les anglophones)
# et activation de la résistance pullup
mcp.pullup(3, 1)

# Lecture de la broche 3 et affichage du résultat
print "%d: %x" % (3, mcp.input(3) >> 3)

Le seconde ligne lit la broche 3, et décale la valeur de 3 bits sur la gauche (shift left) nous aurons donc une valeur égale à 0 ou 1 en fonction de l'état de la broche d'entrée (si elle est à l'état logique haut/high ou bas/low).

Le résultat affiché sera donc quelque-chose comme "3: 0" ou "3: 1" (en fonction de l'état de la broche).

Résistance PullUp?

Qu'est-ce donc qu'une résitance PullUp?

Le schéma ci-dessous présente le principe d'un montage Pull-Up (avec une alimentation de 5V). Ce n'est pas celui utilisé dans le MCP23017 mais le principe est le même.

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

Admettons que:

  1. Le Switch soit un bouton poussoir que vous ayez raccordé sur l'entrée 3 de votre MCP23017.
  2. La résistance Pull-Up est la résistance de 10Ko mentionné sur le graphique
  3. ... et l'état de l'entrée 3 est lue (de façon interne) à l'emplacement P2.

Pull-up signifie "tirer vers le haut"... ce qui est le comportement de ce montage.

  • Si personne ne pousse sur le bouton, le potentiel de l'emplacement P2 est tiré vers +5V (P2 étant raccordé sur +5V via la résistance Pull-up de 10Ko).
    L'entrée du MCP est donc à l'état Haut/High.
  • Si le bouton Switch est pressé, alors le potentiel est P2 est attiré à la masse/GND (par le chemin le plus court)...
    L'entrée du MCP est donc à l'état bas... et comme il y a une résistance de 10Ko entre +5V et la masse, nous n'avons pas de court-circuit :-)

Pour en savoir plus sur les résistance pullup et pulldown, vous pouvez consulter notre article Entrée Bouton - Résistance pull-up, pull-down et déparasitage sur le Blog de MCHobby. Cette article est écrit pour Arduino (en 5.0V) mais s'applique tout aussi bien aux techniques 3.3v.

Activer une broche comme sortie

Pour activer une broche comme une sortie ("output" en anglais), vous avez besoin d'utiliser deux lignes de code:

# Activer la broche 0 comme sortie/output
# (vous pouvez initialiser les broches de 0 à 15 de cette facon)
mcp.config(0, OUTPUT)

# assigner la sortie 0 - état haut/High
mcp.output(0, 1)  

# Assigner la sortie 0 - état bas/Low
mcp.output(0, 0)

Exemple en vidéo

Voici la vidéo correspondant au programme de test mcp23017_test.py.

{{#Widget:Iframe |url=https://www.youtube.com/embed/TCdfEBJeh_A |width=420 |height=315 |border=0 }}

Dans l'exemple suivant, le code d'exemple essaye de basculer la broche GPIO aussi vite que possible... et si vous y branchez un oscilloscope vous devriez voir quelque-chose comme ce qui suit:

{{#Widget:Iframe |url=https://www.youtube.com/embed/zBuMJ-R40N0 |width=420 |height=315 |border=0 }}

Source: AdaFruit Industries, liens direct: sur YouTube

Vitesse Max

Sur base du code d'exemple, nous apprenons qu'il est possible de basculer une seule broche du GPIO à 300 Hertz (un changement d'état toutes les 0.00333 secondes).

Cette fréquence maximum dépend:

  1. de la charge de votre système d'exploitation,
  2. de l'optimisation du programme
  3. mais aussi du nombre de composants et ordres qui passent sur le bus I2C.

Interruption et Callback

Dans l'état actuel, la bibliothèque ne supporte aucun type de d'interruption matériel (puisque le MCP est capable d'émettre un signal d'interruption) ou fonctionnalité de type callback (Callback = rappel de fonction sur base d'un événement). La bibliothèque supporte uniquement la méthode de polling (Polling = opération d'interrogration pour lire l'état des broches, voir aussi cet article sur Wikipedia)!


Source: MCP230xx GPIO Expander on the Raspberry Pi créé par Kevin Townsend pour www.adafruit.com

Traduit , corrigé et augmenté par Meurisse D. pour MCHobby.be Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com