Différences entre versions de « FEATHER-MICROPYTHON-MCP23017 »
(18 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
== Introduction == | == Introduction == | ||
− | + | Bien que le MCP23017 soit souvent utilisé sous 5V, il est fonctionne aussi lorsqu'il est alimenter en 3.3V. | |
+ | |||
+ | Les niveaux logiques SDA et SCL seront également compatible avec l'ESP8266 puisqu'ils utiliseront également une logique 3.3V . | ||
+ | |||
+ | '''Il faut avouer que l'ESP8266 manque cruellement de GPIO''', le MCP23017 sera le bienvenu pour ajouter facilement des GPIO à votre ESP8266. | ||
+ | |||
+ | Grâce au MCP23017 et au bus I2C, il ne faudra sacrifier que deux GPIOs sur votre ESP8266 pour en gagner 16 autres GPIOs. | ||
+ | |||
+ | [[Fichier:FEATHER-MICROPYTHON-MCP23017-brochages.png|480px]] | ||
+ | |||
+ | Les GPIOs, numérotés de 0 à 15, correspondent aux broches GPA0->GPA7 (0 à 7) puis GPB0->GPB7 (8 à 15). | ||
+ | |||
=== Adresses I2C === | === Adresses I2C === | ||
− | + | L'adresse par défaut du MCP23017 est 0x20 (lorsque les 3 broches d'adresses A0, A1, A2 sont raccordés à la masse). | |
+ | |||
+ | L'appel du constructeur utilisera l'adresse par défaut (0x20) mais celle-ci peut être modifiée à l'aide du paramètre {{fname|address}} passé au constructeur. | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | MPC23017( i2c, address=0x26 ) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | En combinant les bit d'adresse A0, A1 et A2, il est possible d'avoir différentes adresses. Et donc d'avoir plusieurs MCP23017 présents sur le bus. | ||
+ | |||
+ | [[Fichier:FEATHER-MICROPYTHON-MCP23017-I2C-Address.png|320px]] | ||
== Installer la bibliothèque == | == Installer la bibliothèque == | ||
− | + | La bibliothèque contient un pilote pour le MCP23017 et MCP23008 destiné à être utilisé avec MicroPython sur les cartes ESP8266. | |
Ce pilote utilise le bus I2C. Son utilisation requière l'installation d'une bibliothèque spécifique. Vous trouvez celle-ci ici: | Ce pilote utilise le bus I2C. Son utilisation requière l'installation d'une bibliothèque spécifique. Vous trouvez celle-ci ici: | ||
− | {{download-box|Téléchargez la bibliothèque | + | {{download-box|Téléchargez la bibliothèque MCP230xx|https://github.com/mchobby/esp8266-upy/blob/master/mcp230xx/mcp230xx.py}} |
Vous devrez copier les fichiers suivant sur votre carte MicroPython | Vous devrez copier les fichiers suivant sur votre carte MicroPython | ||
− | * {{fname| | + | * {{fname|mcp230xx.py}} dans le répertoire racine. |
Pour savoir comment copier vos fichiers sur votre carte MicroPython Feather ESP8266 Huzza, vous pouvez vous référer aux ressources suivantes: | Pour savoir comment copier vos fichiers sur votre carte MicroPython Feather ESP8266 Huzza, vous pouvez vous référer aux ressources suivantes: | ||
Ligne 37 : | Ligne 58 : | ||
== Brancher == | == Brancher == | ||
− | [[Fichier:FEATHER-MICROPYTHON-MCP23017-brancher.jpg| | + | [[Fichier:FEATHER-MICROPYTHON-MCP23017-brancher.jpg|800px]] |
+ | |||
+ | Branchement du MCP23017 | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | | align="center" | Broche du MCP23017 | ||
+ | | align="center" | Connecté sur | ||
+ | |- style="font-size: 90%" | ||
+ | | align="left" | 9 | ||
+ | | align="left" | 3.3V | ||
+ | |- style="font-size: 90%" | ||
+ | | align="left" | 10 | ||
+ | | align="left" | GND | ||
+ | |- style="font-size: 90%" | ||
+ | | align="left" | 12 | ||
+ | | align="left" | ESP8266 GPIO5 [I2C SCL] | ||
+ | |- style="font-size: 90%" | ||
+ | | align="left" | 13 | ||
+ | | align="left" | ESP8266 GPIO4 [I2C SDA] | ||
+ | |- style="font-size: 90%" | ||
+ | | align="left" | 18 | ||
+ | | align="left" | 3.3V (activation du module) | ||
+ | |} | ||
+ | |||
+ | Il faut également ajouter des résistances pull-up sur le bus | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | | align="center" | Broche ESP8266 | ||
+ | | align="center" | destination | ||
+ | |- style="font-size: 90%" | ||
+ | | align="left" | GPIO5 [I2C SCL] | ||
+ | | align="left" | --( R 10kOhms )--> 3.3V | ||
+ | |- style="font-size: 90%" | ||
+ | | align="left" | GPIO4 [I2C SDA] | ||
+ | | align="left" | --( R 10kOhms )--> 3.3V | ||
+ | |} | ||
+ | |||
+ | Les 3 broches d'adresses du MCP23017 (broches 15, 16, 17) sont placées à la masse. | ||
== Utiliser == | == Utiliser == | ||
+ | Dans l'exemple suivant, les LEDs branchées sur les sorties 0 et 1 du MCP23017 clignoterons en alternance. | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
− | + | from time import sleep | |
+ | from machine import I2C, Pin | ||
+ | from mcp230xx import MCP23017 | ||
+ | |||
+ | # Création bus I2C et MCP23017 | ||
+ | i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 ) | ||
+ | mcp = MCP23017( i2c=i2c ) | ||
+ | |||
+ | # Configurer les broches 0 et 1 en sortie | ||
+ | mcp.setup( 0, Pin.OUT ) | ||
+ | mcp.setup( 1, Pin.OUT ) | ||
+ | |||
+ | for i in range( 10 ): | ||
+ | # Activer sortie 0 | ||
+ | mcp.output( 0, True ) | ||
+ | sleep( 0.5 ) | ||
+ | mcp.output( 1, True ) | ||
+ | sleep( 0.5 ) | ||
+ | # Désactiver sortie 1 | ||
+ | mcp.output( 0, False ) | ||
+ | sleep( 0.5 ) | ||
+ | mcp.output( 1, False ) | ||
+ | sleep( 0.5 ) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | L'exemple suivant affiche le message "Press!" lorsque le bouton branché sur l'entrée 3 est pressé. | ||
+ | |||
+ | Comme la résistance Pull-Up sur l'entrée 3 est activée : | ||
+ | * L'entrée 3 est au niveau BAS lorsque le bouton est pressé! | ||
+ | * L'entrée 3 est au niveau HAUT lorsque l'on ne touche pas le bouton. | ||
+ | |||
+ | Pour lire l'état de l'entrée 3, il faut utiliser {{fname|mcp.input(3)}} . | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | from time import sleep,time | ||
+ | from machine import I2C, Pin | ||
+ | from mcp230xx import MCP23017 | ||
+ | |||
+ | # Création bus I2C et MCP23017 | ||
+ | i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 ) | ||
+ | mcp = MCP23017( i2c=i2c ) | ||
+ | |||
+ | mcp.setup( 3, Pin.IN ) # broche 3 en entrée | ||
+ | mcp.pullup( 3, True ) # Activer la résistance pull-up sur entrée 3 | ||
+ | |||
+ | Print( "Appuyer sur bouton" ) | ||
+ | start = time() | ||
+ | while (time()-start) < 20: # pendant 20 sec max | ||
+ | # mcp.input(3) retourne état de la broche | ||
+ | print( '%s : etat = %s' % (time(), '...' if mcp.input(3) else 'Press!') ) | ||
+ | sleep( 0.5 ) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Il est également possible de modifier l'état de plusieurs broches en une seule opération en utilisant un dictionnaire {{fname| { 0 : True, 1 : False } }} | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | from machine import I2C, Pin | ||
+ | from mcp230xx import MCP23017 | ||
+ | |||
+ | # Création bus I2C et MCP23017 | ||
+ | i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 ) | ||
+ | mcp = MCP23017( i2c=i2c ) | ||
+ | |||
+ | # controle de quelques broches en sortie | ||
+ | pins = [10, 11, 12, 13, 14, 15] | ||
+ | valeurs = {} | ||
+ | for pin_num in pins: | ||
+ | mcp.setup( pin_num, Pin.OUT ) | ||
+ | valeurs[pin_num] = True | ||
+ | # activer toutes les broches en une seule opération | ||
+ | mcp.output_pins( valeurs ) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | De même, il est possible de lire l'état de plusieurs broches avec un seul appel | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | from time import sleep | ||
+ | from machine import I2C, Pin | ||
+ | from mcp230xx import MCP23017 | ||
+ | |||
+ | # Création bus I2C et MCP23017 | ||
+ | i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 ) | ||
+ | mcp = MCP23017( i2c=i2c ) | ||
+ | |||
+ | # Surveille plusieurs broches d'entrée et affiche les différentes valeurs grâce à {{fname|mcp.input_pins(pins_list)}} | ||
+ | pins = [3,4,5,6] | ||
+ | for pin_num in pins: | ||
+ | mcp.setup(pin_num, Pin.IN) | ||
+ | mcp.pullup(pin_num, True) | ||
+ | while True: | ||
+ | print( mcp.input_pins(pins) ) | ||
+ | sleep( 1 ) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Durant l'exécution du script, les messages suivants apparaissent dans la console. Chaque broche mentionnée lors de l'appel de {{fname|mcp.input_pins()}} retourne une valeur {{fname|True}} ou {{fname|False}} en fonction de l'état de la broche. | ||
+ | |||
+ | <nowiki>[True, True, True, True] | ||
+ | [True, True, True, True] | ||
+ | [True, True, True, True] | ||
+ | [False, True, True, True] | ||
+ | [False, True, True, True] | ||
+ | [False, True, True, True] | ||
+ | [False, True, True, True] | ||
+ | [True, True, True, True]</nowiki> | ||
+ | |||
+ | == Crédit == | ||
+ | Travail dérivé de Adafruit_MCP230xx.py disponible sur [https://github.com/adafruit/Adafruit_Python_GPIO https://github.com/adafruit/Adafruit_Python_GPIO] | ||
+ | |||
+ | Le port MicroPython réalisé par ShrimpingIt sur son GitHub [https://github.com/ShrimpingIt/micropython-mcp230xx https://github.com/ShrimpingIt/micropython-mcp230xx] (merci à ShrimpingIt pour son magnifique travail) | ||
+ | |||
+ | Modifié Meurisse D. (MC Hobby) pour: | ||
+ | * Recevoir le bus I2C en paramètre (compatibilité avec les autres bibliothèques dans ce dépôt). | ||
+ | * Epuration (éliminer les constantes non utilisée, compacter le code, réduction des commentaires). | ||
+ | * Schéma de raccordement Feather ESP8266 | ||
+ | * Exemples | ||
== Où acheter == | == Où acheter == |
Version actuelle datée du 16 mars 2019 à 22:38
Introduction
Bien que le MCP23017 soit souvent utilisé sous 5V, il est fonctionne aussi lorsqu'il est alimenter en 3.3V.
Les niveaux logiques SDA et SCL seront également compatible avec l'ESP8266 puisqu'ils utiliseront également une logique 3.3V .
Il faut avouer que l'ESP8266 manque cruellement de GPIO, le MCP23017 sera le bienvenu pour ajouter facilement des GPIO à votre ESP8266.
Grâce au MCP23017 et au bus I2C, il ne faudra sacrifier que deux GPIOs sur votre ESP8266 pour en gagner 16 autres GPIOs.
Les GPIOs, numérotés de 0 à 15, correspondent aux broches GPA0->GPA7 (0 à 7) puis GPB0->GPB7 (8 à 15).
Adresses I2C
L'adresse par défaut du MCP23017 est 0x20 (lorsque les 3 broches d'adresses A0, A1, A2 sont raccordés à la masse).
L'appel du constructeur utilisera l'adresse par défaut (0x20) mais celle-ci peut être modifiée à l'aide du paramètre address passé au constructeur.
MPC23017( i2c, address=0x26 )
En combinant les bit d'adresse A0, A1 et A2, il est possible d'avoir différentes adresses. Et donc d'avoir plusieurs MCP23017 présents sur le bus.
Installer la bibliothèque
La bibliothèque contient un pilote pour le MCP23017 et MCP23008 destiné à être utilisé avec MicroPython sur les cartes ESP8266.
Ce pilote utilise le bus I2C. Son utilisation requière l'installation d'une bibliothèque spécifique. Vous trouvez celle-ci ici:
Vous devrez copier les fichiers suivant sur votre carte MicroPython
- mcp230xx.py dans le répertoire racine.
Pour savoir comment copier vos fichiers sur votre carte MicroPython Feather ESP8266 Huzza, vous pouvez vous référer aux ressources suivantes:
Outil simplifié de transfert de fichiers et de contrôlez de carte depuis une connexion série. ESP8266 compatible.
Transférez des fichiers et contrôlez votre carte depuis une simple connexion série. ESP8266 compatible.
Puis utiliser le code suivant pour faire fonctionner votre senseur. Tester le code dans une session REPL ou WebREPL.
Brancher
Branchement du MCP23017
Broche du MCP23017 | Connecté sur |
9 | 3.3V |
10 | GND |
12 | ESP8266 GPIO5 [I2C SCL] |
13 | ESP8266 GPIO4 [I2C SDA] |
18 | 3.3V (activation du module) |
Il faut également ajouter des résistances pull-up sur le bus
Broche ESP8266 | destination |
GPIO5 [I2C SCL] | --( R 10kOhms )--> 3.3V |
GPIO4 [I2C SDA] | --( R 10kOhms )--> 3.3V |
Les 3 broches d'adresses du MCP23017 (broches 15, 16, 17) sont placées à la masse.
Utiliser
Dans l'exemple suivant, les LEDs branchées sur les sorties 0 et 1 du MCP23017 clignoterons en alternance.
from time import sleep
from machine import I2C, Pin
from mcp230xx import MCP23017
# Création bus I2C et MCP23017
i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 )
mcp = MCP23017( i2c=i2c )
# Configurer les broches 0 et 1 en sortie
mcp.setup( 0, Pin.OUT )
mcp.setup( 1, Pin.OUT )
for i in range( 10 ):
# Activer sortie 0
mcp.output( 0, True )
sleep( 0.5 )
mcp.output( 1, True )
sleep( 0.5 )
# Désactiver sortie 1
mcp.output( 0, False )
sleep( 0.5 )
mcp.output( 1, False )
sleep( 0.5 )
L'exemple suivant affiche le message "Press!" lorsque le bouton branché sur l'entrée 3 est pressé.
Comme la résistance Pull-Up sur l'entrée 3 est activée :
- L'entrée 3 est au niveau BAS lorsque le bouton est pressé!
- L'entrée 3 est au niveau HAUT lorsque l'on ne touche pas le bouton.
Pour lire l'état de l'entrée 3, il faut utiliser mcp.input(3) .
from time import sleep,time
from machine import I2C, Pin
from mcp230xx import MCP23017
# Création bus I2C et MCP23017
i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 )
mcp = MCP23017( i2c=i2c )
mcp.setup( 3, Pin.IN ) # broche 3 en entrée
mcp.pullup( 3, True ) # Activer la résistance pull-up sur entrée 3
Print( "Appuyer sur bouton" )
start = time()
while (time()-start) < 20: # pendant 20 sec max
# mcp.input(3) retourne état de la broche
print( '%s : etat = %s' % (time(), '...' if mcp.input(3) else 'Press!') )
sleep( 0.5 )
Il est également possible de modifier l'état de plusieurs broches en une seule opération en utilisant un dictionnaire { 0 : True, 1 : False }
from machine import I2C, Pin
from mcp230xx import MCP23017
# Création bus I2C et MCP23017
i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 )
mcp = MCP23017( i2c=i2c )
# controle de quelques broches en sortie
pins = [10, 11, 12, 13, 14, 15]
valeurs = {}
for pin_num in pins:
mcp.setup( pin_num, Pin.OUT )
valeurs[pin_num] = True
# activer toutes les broches en une seule opération
mcp.output_pins( valeurs )
De même, il est possible de lire l'état de plusieurs broches avec un seul appel
from time import sleep
from machine import I2C, Pin
from mcp230xx import MCP23017
# Création bus I2C et MCP23017
i2c = I2C( sda=Pin(4), scl=Pin(5), freq=20000 )
mcp = MCP23017( i2c=i2c )
# Surveille plusieurs broches d'entrée et affiche les différentes valeurs grâce à {{fname|mcp.input_pins(pins_list)}}
pins = [3,4,5,6]
for pin_num in pins:
mcp.setup(pin_num, Pin.IN)
mcp.pullup(pin_num, True)
while True:
print( mcp.input_pins(pins) )
sleep( 1 )
Durant l'exécution du script, les messages suivants apparaissent dans la console. Chaque broche mentionnée lors de l'appel de mcp.input_pins() retourne une valeur True ou False en fonction de l'état de la broche.
[True, True, True, True] [True, True, True, True] [True, True, True, True] [False, True, True, True] [False, True, True, True] [False, True, True, True] [False, True, True, True] [True, True, True, True]
Crédit
Travail dérivé de Adafruit_MCP230xx.py disponible sur https://github.com/adafruit/Adafruit_Python_GPIO
Le port MicroPython réalisé par ShrimpingIt sur son GitHub https://github.com/ShrimpingIt/micropython-mcp230xx (merci à ShrimpingIt pour son magnifique travail)
Modifié Meurisse D. (MC Hobby) pour:
- Recevoir le bus I2C en paramètre (compatibilité avec les autres bibliothèques dans ce dépôt).
- Epuration (éliminer les constantes non utilisée, compacter le code, réduction des commentaires).
- Schéma de raccordement Feather ESP8266
- Exemples
Où acheter
- MCP23017 disponible chez MCHobby
- Feather HUZZAH avec ESP8266 disponible chez MCHobby
- La gamme MicroPython
Tutoriel réaliser par Meurisse D. pour MC Hobby SPRL
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.