Modifications

Sauter à la navigation Sauter à la recherche
3 297 octets ajoutés ,  16 octobre 2017 à 02:24
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]. 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.
+
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.
    
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:
 
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:
Ligne 16 : Ligne 16 :  
{{ADFImage|Rasp-Hack-MCP230XX-Librairie-01.jpg}}
 
{{ADFImage|Rasp-Hack-MCP230XX-Librairie-01.jpg}}
   −
Si vous ne disposez de WebIDE, vous pouvez [https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code télécharger toute la bibliothèque directement depuis le dépôt GitHub d'AdaFruit]  
+
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]  
   −
{{ambox-stop|text='''Lisez les 4 premières lignes du code ci-dessous AVANT d'exécuter''' le programme... il faut activer la ligne adéquate pour faire fonctionner ce code sur un '''Raspberry Pi MODELE B 512Mb'''!!!}}
+
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
   −
<nowiki># Utiliser busnum = 0 pour les Raspberry plus ancien (256MB)
+
De sorte que si vous exécutez la commande...
mcp = Adafruit_MCP230XX(busnum = 0, address = 0x20, num_gpios = 16)
  −
# Activer la ligne suivante pour utiliser busnum = 1 pour les Raspberry Pi (512MB avec trou de montage)
  −
# mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 16)
     −
# Activer les broches 0, 1 et 2 en sortie (vous pouvez initialiser les broches de 0 à 15 de cette façon)
+
sudo ./Adafruit_MCP230xx.py
mcp.config(0, OUTPUT)
+
 
mcp.config(1, OUTPUT)
+
Vous exécuter aussi le programme de test.
mcp.config(2, OUTPUT)
+
 
 +
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:
 +
 
 +
<syntaxhighlight lang="python">
 +
#!/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)
   −
# initialiser la broche 3 en entrée en activant la résistance pullup sur l'entrée
+
# 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)
 +
 
# Lire l'état de la broche 3 et afficher le résultat
 
# Lire l'état de la broche 3 et afficher le résultat
print "%d: %x" % (3, mcp.input(3) >> 3)
+
print "Pin 3 = %d" % (mcp.input(3) >> 3)
   −
# Vitesse d'exécution en Python... changer
+
# Changer l'état de la broche 0  
# l'état de la sortie 0 à la vitesse maximale
+
print "Clignoter la broche 0 (CTRL+C pour quitter)"
 
while (True):
 
while (True):
   mcp.output(0, 1) # Broche 0 a l'état Haut/High
+
   mcp.output(0, 1) # Mettre la broche 0 à l'état HAUT/High
   mcp.output(0, 0) # Broche 0 a l'état Bas/Low</nowiki>
+
  time.sleep(1)
 +
   mcp.output(0, 0) # Mettre la broche 0 à l'état BAS/Low
 +
  time.sleep(1)
 +
</syntaxhighlight>
 +
 
 +
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
   −
Ce fichier contient à la fois la classe de base MCP230xx pour utiliser facilement les GPIO Extender, avec un démo très simple qui change l'état des broches aussi vite que possible. Le code d'exemple (commenté ci-dessous) montre comment assigner des broches en entrée ("''input''" en anglais) et en sortie ("''output''" en anglais).
+
=== 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 52 : 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 108 : Ligne 185 :  
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.
 
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|Rasp-Hack-MCP230XX-Librairie-PullUp.png}}
+
{{ADFImage|Button-PullUp.png}}
    
Admettons que:
 
Admettons que:
Ligne 136 : Ligne 213 :  
mcp.output(0, 0)</nowiki>
 
mcp.output(0, 0)</nowiki>
   −
C'est tout ce qu'il faut faire!  Le code d'exemple essaye de basculer la broche GPIO aussi vite que possible... et si vous y branchez un oscilloscope vous devriez voir quelquechose comme ce qui suit:
+
== Exemple en vidéo ==
 +
Voici la vidéo correspondant au programme de test ''mcp23017_test.py''.
    
{{#Widget:Iframe
 
{{#Widget:Iframe
|url=http://www.youtube.com/embed/zBuMJ-R40N0
+
|url=https://www.youtube.com/embed/TCdfEBJeh_A
 
|width=420
 
|width=420
 
|height=315
 
|height=315
 
|border=0
 
|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
 +
}}
 +
 
<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}}
29 917

modifications

Menu de navigation