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}} |