Modifications

Sauter à la navigation Sauter à la recherche
12 425 octets ajoutés ,  16 octobre 2017 à 02:24
Ligne 1 : Ligne 1 :  
{{Rasp-Hack-MCP230XX-NAV}}
 
{{Rasp-Hack-MCP230XX-NAV}}
 +
 +
== Point de départ ==
 +
{{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_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:
 +
 +
# Adafruit-Raspberry-Pi-Python-Code
 +
# Adafruit_MCP230xx
 +
# Adafruit_MCP230xx.py
 +
 +
Vous devriez alors avoir une vue ressemblant à celle-ci:}}
 +
 +
{{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:
 +
 +
<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)
 +
 +
# 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)
 +
</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
 +
 +
=== 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 ==
 +
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.
 +
 +
<nowiki>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)</nowiki>
 +
 +
=== 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 ([http://df.mchobby.be/datasheet/mcp23017.pdf fiche technique du MCP23017] ou la [http://df.mchobby.be/datasheet/mcp23008.pdf fiche technique du MCP23008].)
 +
 +
Pour le MCP23017, il s'agit des broches '''A0, A1, 02''' correspondant aux broches numéro 15, 16, 17.
 +
 +
{{ADFImage|Rasp-Hack-MCP23017-PinOut.jpg}}
 +
 +
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.<br />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.
 +
 +
[[Fichier:Rasp-Hack-MCP23017-Adresses.jpg|540px]]
 +
 +
== 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:
 +
 +
<nowiki># 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)</nowiki>
 +
 +
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 ==
 +
 +
Pour activer une broche comme une sortie ("''output''" en anglais), vous avez besoin d'utiliser deux lignes de code:
 +
 +
<nowiki># 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)</nowiki>
 +
 +
== 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
 +
}}
 +
 +
<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 ==
 +
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 918

modifications

Menu de navigation