ESP8266 sous MicroPython : Utilisation des cartes MOD-IO2 (connecteur UEXT)

Il y a une quinzaine de jours, nous publions l'article "MicroPython sur ESP8266-EVB d'Olimex" suivit d'un autre article sur l "extension MOD-IO" qui expliquait comment exploiter ses relais, entrées optocoupleurs (24v) et entrées analogiques (3.3v).
Nous allons continuer à exploiter le connecteur UEXT avec la carte MO-IO2.
ESP8266-EVB d'Olimex
Le connecteur UEXT et carte d'extension
L'intérêt de la carte ESP8266-EVB c'est justement son port UEXT, un connecteur IDC 10 broches, qui transporte le bus I2C, bus SPI et interface série (connexion asynchrone).
Mapping UEXT sur ESP8266
Grâce à ce mapping entre port UEXT et ESP8266, nous pouvons envisager de contrôler des cartes d'extension UEXT sous MicroPyhton sans avoir a réaliser un quelconque raccordement :-)

Le code est compatible avec toutes les plateformes MicroPython sous 3.3V. Il suffit de connecter le bus I2C sur les bonnes broches du connecteur UEXT.

Carte MOD-IO2

Carte MOD-IO2
MOD-IO2 est une carte de développement permettant d'ajouter des relais, entrées analogiques et digitales, PWM sur n'importe quelles cartes disposant d'un connecteur UEXT ou Bus I2C. Si vous avez besoin de plus d'entrée/sortie (ou entrée analogiques 3.3v) sur votre projet alors cette carte est le produit qu'il vous faut.

Carte MOD-IO2
Les cartes MOD-IO2 sont chaînables et adressables. Cela signifie que vous pouvez connecter plusieurs cartes MOD-IO2 ensembles!
Grâce à la connexion UEXT, le raccordement est enfantin!
Très pratique pour un apprentissage scolaire.
Brancher la carte MOD-IO2, UEXT Splitter et ESP8266-EVB ensembles
Bibliothèque MOD-IO2
Pour commander facilement cette carte depuis MicroPython, nous avons écrit une bibliothèque nommée modio2.
Celle-ci est disponible sur la page GitHub dédiée au MODIO-2 sous MicroPython.

Téléchargez simplement le fichier modio2.py sur votre MicroContrôleur MicroPython.

Tester la carte MOD-IO2 sous MicroPython
# Utilisation du MOD-IO2 d'Olimex avec un ESP8266 sous MicroPython
#
# Shop: [UEXT Expandable Input/Output board (MOD-IO2)](http://shop.mchobby.be/product.php?id_product=1409)
# GitHub: https://github.com/mchobby/esp8266-upy/tree/master/modio2

from machine import I2C, Pin
from time import sleep_ms
from modio2 import MODIO2

i2c = I2C( sda=Pin(2), scl=Pin(4) )
brd = MODIO2( i2c ) # Adresse par défaut=0x21

# === Manipuler les GPIOs =============================
print( "Afficher le mode des broches")
print( brd.gpios.pin_modes )
# Devrait retourner: ['IN', 'IN', 'IN', 'IN', 'IN', 'IN', 'IN']

print( "GPIO 5 - Lecture analogique")
brd.gpios.pin_mode( 5, Pin.IN )
for i in range(10):
    volt = brd.gpios.analog(5)
    print( "GPIO 5 (AN7) = %s v" % volt )
    val  = brd.gpios.analog(5, raw=True )
    print( "GPIO 5 (AN7) = %s / 1023" % val )
    sleep_ms( 1000 )

print( "GPIO 0 - en sortie OUT (allumé puis éteind)" )
brd.gpios.pin_mode( 0, Pin.OUT )
brd.gpios[0] = True
sleep_ms( 2000 )
brd.gpios[0] = False

print( "GPIO 1,2,3 - en entrée IN" )
brd.gpios.pin_mode( 1, Pin.IN )
brd.gpios.pin_mode( 2, Pin.IN )
brd.gpios.pin_mode( 3, Pin.IN, Pin.PULL_UP ) # la pull up est obligatoire sur pin 3
print( "Afficher le mode des broches")
print( brd.gpios.pin_modes )
# Doit afficher ['OUT', 'IN', 'IN', 'IN', 'IN', 'IN', 'IN']

print( "Afficher l'état de toutes les I/O (1/0)" )
print( brd.gpios.states )
# doit afficher [False, False, True, False, False, True, False]

# === RELAIS ======================================
# Modifier les états des relais REL1 et REL2.
# Les relais sont indexés à partir de 0
print( 'Modif. relais par index' )
brd.relais[0] = True
brd.relais[1] = False
print( 'Etat Relais[0..1] : %s' % brd.relais.states )
# Doit afficher Relais[0..1] states : [True, False]  
sleep_ms( 2000 )

# Eteindre tous les relais
brd.relais.states = False 

print( 'Manipuler 1 relais à la fois')
for irelay in range( 2 ):
    print( '   relais %s' % (irelay+1) )
    brd.relais[irelay] = True # Allumer
    sleep_ms( 1000 )
    brd.relais[irelay] = False # Eteindre
    sleep_ms( 500 )

print( 'Manipuler plusieurs relais' )
brd.relais.states = [False, True]
sleep_ms( 2000 )
print( 'Activer tous les relais' )
brd.relais.states = True
sleep_ms( 2000 )
print( 'Eteindre tous les relais' )
brd.relais.states = False

print( "That's the end folks")

Générer un signal PWM sur MOD-IO2
Il est possible de générer un signal PWM sur les GPIO 5 et 6 de la carte MOD-IO2. L'exemple suivant lit l'entrée analogique sur le GPIO 5 et en utilise la valeur pour fixer le cycle utile de la sortie PWM du GPIO 6.

# Test PWM sur le MOD-IO2 d'Olimex avec un ESP8266 sous MicroPython
#
# Shop: http://shop.mchobby.be/product.php?id_product=1409
# GitHub: https://github.com/mchobby/esp8266-upy/tree/master/modio2

from machine import I2C, Pin
from time import sleep_ms
from modio2 import MODIO2

i2c = I2C( sda=Pin(2), scl=Pin(4) )
brd = MODIO2( i2c ) # Adresse par défaut=0x21

print( "GPIO 5 - IN")
brd.gpios.pin_mode( 5, Pin.IN )

print( "GPIO 6 - PWM" )
brd.gpios.pwm( gpio=6, cycle=0 )

cycle=0
while cycle<255:
    val = brd.gpios.analog( 5, raw = True )
    cycle = val // 4   # de 0..1023 a 0..254
    if cycle >= 254:   # Assure 100% du cycle utile
        cycle = 255
    brd.gpios.pwm( 6, cycle )
    print( "val=%s -> cycle=%s" %(val,cycle) )
    sleep_ms( 1000 )

print( "That's the end folks")

Ce qui produit le résultat suivant:

MicroPython v1.9.4-8-ga9a3caad0 on 2018-05-11; ESP module with ESP8266
Type "help()" for more information.
>>> 
>>> import test2pwm
GPIO 5 - IN
GPIO 6 - PWM
val=698 -> cycle=174
val=698 -> cycle=174
val=620 -> cycle=155
val=614 -> cycle=153
val=597 -> cycle=149
val=496 -> cycle=124
val=494 -> cycle=123
val=701 -> cycle=175
val=880 -> cycle=220
val=978 -> cycle=244
val=979 -> cycle=244
val=982 -> cycle=245
val=1023 -> cycle=255
That's the end folks

Connecter plusieurs MOD-IO2

Il est possible de connecter plusieurs carte MOD-IO2 ensembles. Il faut cependant changer l'adresse de chaque carte pour qu'elle ne rentre pas en conflit avec les autres cartes. La carte MOD-IO2 retient son adresse I2C dans l'EEPROM. Cette adresse est donc configurable à l'aide d'une fonction. L'exemple suivant montre comment passer de l'adresse 0x21 à 0x22.

# Modifier l'adresse de MOD-IO2 d'Olimex vers 0x22
#
# Shop: http://shop.mchobby.be/product.php?id_product=1408
# GitHub: https://github.com/mchobby/esp8266-upy/tree/master/modio2

from machine import I2C, Pin
from modio2 import MODIO2

i2c = I2C( sda=Pin(2), scl=Pin(4) )
brd = MODIO2( i2c, addr=0x21 )
brd.change_address( 0x22 )

A noter que le changement est immédiat, si bien que la carte ne renvoi pas de ACK sous l'adresse 0x21 mais 0x22 (ce qui se traduit par une erreur de transmission... mais l'adresse est belle et bien changée).

Tutoriels et GitHub
Vous trouverez de nombreuses autres informations dans le tutoriel et dans les fiches produits ci-dessous.
Où acheter