MicroPython sur ESP8266 : Magnétomètre MAG3110 et Luxmètre/proximité LTR-501ALS

Dans la section des pilotes MicroPython, nous avons ajouter le support de deux nouveaux senseurs, le magnétomètre MAG3110 et luxmètre LTR-501ALS (et détecteur de proximité)... code porté depuis Arduino vers MicroPython.
Comme nous travaillons toujours avec MicroPython sur ESP8266 (comme dans notre ouvrage "Python, Raspberry Pi et Flask"), nous avons opté pour des module UEXT d'Olimex qui simplifie singulièrement le raccordement.

Magnétomètre MAG3110 sous MicroPython
Le MAG3110 (MOD-MAG) sur connecteur UEXT.

MOD-MAG utilise un MAG3110, un magnétomètre 3 axes. Alimenté en 1.95V à 3.6V, il communique par l'intermédiaire du bus I2C.
La gamme de valeur retournée évolue entre -30000 à +30000 pour la gamme de ±1000µT (micro Tesla).
Ce module magnétomètre 3 axes est équipé d'un connecteur standard UEXT  facilitant les branchements mais vous pouvez tout aussi bien effectuer les raccordements avec des fils Dupont.

Avec ce module, il est possible de détecter le champ magnétique terrestre, détecter du métal enterré, créer une boussole et bien plus encore.

Ce senseur permet de détecter rapidement des champs magnétiques dans le voisinage. Les données peuvent être utilisées pour créer une boussole digitale ou détecter le champ magnétique de transformateurs électriques!

L'avantage du module MOG-MAG est qu'il expose un port UEXT facilitant les raccordements.
Le MAG3110 (MOD-MAG) sur MicroPython ESP8266

Une fois la bibliothèque MicroPython mag3110.py installée (voir le tutoriel), l'utilisation du senseur est relativement élémentaire.

from time import sleep
from mag3110 import MAG3110, DR_OS_1_25_32

i2c = I2C( sda=Pin(2), scl=Pin(4) )
mag = MAG3110( i2c ) 

print( "CHIP ID: %s" % mag.who_am_i() )

# Fixer le débit de donnée à 1.25 Hz et l'oversampling à 32 fois 
mag.setDR_OS( DR_OS_1_25_32 )
# Active le senseur
mag.start()

while True:
 # Attendre qu'une donnée soit disponible
 if mag.data_ready:
  # Lecture du tuple (x,y,z)
  xyz = mag.read() 
  print( 'x,y,z = %s,%s,%s ' % xyz )

print( "That's the end folks")

Le tutoriel MOD-MAG (MAG3110) propose également un second exemple "Calibration & Orientation".
Luxmètre et senseur de proximité LTR-501ALS sous MicroPython
Le MOD-LTR501ALS offre une réponse linéaire de 2 à 64000 Lux pour une lumière dans le spectre visible. Ce senseur offre une réponse proche de l'oeil humain.
MOD-LTR-501ALS - Senseur Luminosité & Proximité
Ce senseur dispose également d'un mode haute résolution entre 0.01 Lux et 320 Lux.

La particularité de ce senseur est qu'il est immunisé contre la lumière UltraViolette (UV) et InfraRouge (IR). De sorte, le senseur de proximité infrarouge qui y est joint est capable de travailler sous de nombreuses conditions de luminosité.

Le senseur de proximité utilise une LED Infrarouge pilotée par le MTR-501ALS configurable (courant max, gestion des impulsions, temps de mesure) permettant de détecter efficacement un objet à une distance allant jusqu'à 10 cm.
La LED IR fonctionne en mode pulsé.

Ce senseur se raccorde comme le MOD-MAG (voir ci-dessus) ou à l'aide de fils Dupond.

Une fois la bibliothèque MicroPython ltr501.py installée (voir le tutoriel), l'utilisation du senseur est relativement élémentaire.
from time import sleep
from ltr501 import * 

i2c = I2C( sda=Pin(2), scl=Pin(4) ) 
ltr = LTR_501ALS( i2c ) # gamme de 2 Lux à 64000 Lux

# Utiliser le contructeur suivant pour la gamme de 0.01 à 320 Lux range
#
# ltr = LTR_501ALS( i2c, lux_range = LUX_RANGE_320 ) 

while True:
    # Y a t'il des données disponibles?
    dr = ltr.data_ready

    # Luminosité disponible? 
    if DR_LUX in dr:
        # Lecture des convertisseurs analogiques ALS_0 et ALS_1.
        l = ltr.lux  

        # ALS_0 semble être en lumière visible 
        # ALS_1 devrait être l'infrarouge.
        print( "Lux ALS_0, ALS_1 = ", l )

    # Proximité disponible ?
    if DR_PROXIMITY in dr:
        # Lecture de valeur_senseur et distance en cm
        p = ltr.proximity

        print( "Proximity value, cm =" , p )

    # Separateur et attendre
    print( '-'*40 )
    sleep( 1 )


print( "That's the end folks")

ce qui produit un résultat similaire à ceci :

Lux ALS_0, ALS_1 =  (11, 26)
Proximity value, cm = (1453, 2.90181)
----------------------------------------
Lux ALS_0, ALS_1 =  (12, 25)
Proximity value, cm = (953, 5.34441)

Où acheter
Si vous êtes intéressé par l'un ou l'autre de ces senseurs (ou encore l'ESP8266 EVB), vous pouvez vous les procurer ici: