Accueil > ESP32, Matériel, NodeMCU > Utilisation du module 8 ports d’E/S PCF8574 en MicroPython

Utilisation du module 8 ports d’E/S PCF8574 en MicroPython

J’ai commandé plusieurs modules PCF8574 afin de pouvoir ajouter des ports d’E/S supplémentaires à mes projets.

Le module commandé est de chez WaveShare et se présente comme suit :

Ce module est pilotable via le protocole i2c; l’adresse du module peut être configurée par 3 cavaliers (A0-A2) qui permet d’obtenir les adresses 0x20 à 0x27 en fonction de la position des cavaliers; ce qui permet de pouvoir chainer 8 modules et ainsi obtenir jusqu’à un maximum de 64 port d’E/S.

J’ai écrit une librairie toute simple pour l’utilisation de ce module en MicroPython; tout est téléchargeable sur ma page GITHUB qui contient la librairie avec des exemples d’utilisation.

Le contenu de la librairie pcf8574.py est la suivante :

#
# Librairie pour la gestion du module d’extension I/O PCF8574
#
# Test effectue sur ESP32 Heltec Wifi Kit 32
#
# Auteur : iTechnoFrance
#

import machine

P0 = 0x01
P1 = 0x02
P2 = 0x04
P3 = 0x08
P4 = 0x10
P5 = 0x20
P6 = 0x40
P7 = 0x80

class PCF8574():

def __init__(self, pin_scl, pin_sda, addr_i2c, pin_int=-1):

self.sda = pin_sda
self.scl = pin_scl
self.int = pin_int
self.i2c_adresse = addr_i2c
self.i2c = machine.I2C(scl=machine.Pin(self.scl), sda=machine.Pin(self.sda))
self.interrupt = False
self.writeMode = 0
self.data = bytearray(1)
if self.int != -1: # on utilise le signal d’interruption du PCF8574 pin INT
# la pin est une entree avec liaison au +3.3v via resistance interne
self.pin_interrupt = machine.Pin(self.int, machine.Pin.IN, machine.Pin.PULL_UP)
# interruption sur un front montant ou descendant
self.pin_interrupt.irq(trigger = machine.Pin.IRQ_FALLING, handler = self.traite_interruption)

def traite_interruption(self, pin):

# un changement d’etat detecte sur les ports P0-P7
self.interrupt = True

def reset_interruption(self):

self.state = machine.disable_irq()
self.interrupt = False
machine.enable_irq(self.state)
def pinwrite(self, pin, value):
self.pin = pin
self.value = value
self.data_read = self.i2c.readfrom(self.i2c_adresse, 1)[0]
if self.value == « on »:

self.data[0]= self.data_read | self.pin

if self.value == « off »:

self.data[0]= self.data_read & ~self.pin

self.i2c.writeto(self.i2c_adresse, self.data)

def pinread(self, pin):

self.pin = pin
self.data = self.i2c.readfrom(self.i2c_adresse, 1)[0]
self.data = self.data & self.pin

if self.data == 0:

return(« LOW »)

else:

return(« HIGH »)

La librairie est composée de 5 fonctions :

  • La fonction d’initialisation ainsi que la configuration du traitement d’une interruption. Il y a port INT sur le module qui change d’état dès q’un port est modifié en entrée.
  • La fonction de traitement de l’interruption.
  • La fonction de réinitialisation de l’interruption.
  • La fonction d’écriture sur un port d’E/S.
  • La fonction de lecture d’un port d’E/S.

Le premier exemple d’utilisation de la librairie permet de faire clignoter une LED sur le port P0 du module (clignotement_led.py); il suffit de brancher la LED sur le +3.3v en série avec une résistance de 220 Ohms qui est connectée sur le port en question. Voici le contenu de l’exemple :

#
# Exemple utilisation librairie PCF8574
#
# Test effectue sur ESP32 Heltec Wifi Kit 32
#
# Branchement LED :
# +3.3v –> LED –> 220 Ohms –> port P0
#
# Auteur : iTechnoFrance
#

import pcf8574, time

# Pin’s I2C sur ESP32 Heltec Wifi Kit 32
# GPIO22 –> SCL
# GPIO21 –> SDA

# Declaration PCF8574
# Adresse I2C de 0x20 a 0x27 selon cavaliers A0 a A2
module_io = pcf8574.PCF8574(22, 21, 0x20)

while True:

module_io.pinwrite(pcf8574.P0, « on ») # LED eteinte
time.sleep(1)
module_io.pinwrite(pcf8574.P0, « off ») # LED allume
time.sleep(1)

Le second exemple permet de faire un chenillard (chenillard.py) :

#
# Exemple utilisation librairie PCF8574
#
# Test effectue sur ESP32 Heltec Wifi Kit 32
#
# Branchement LED :
# +3.3v –> LED –> 220 Ohms –> port Px
#
# Auteur : iTechnoFrance
#

import pcf8574, time

# Pin’s I2C sur ESP32 Heltec Wifi Kit 32
# GPIO22 –> SCL
# GPIO21 –> SDA

# Declaration PCF8574
# Adresse I2C de 0x20 a 0x27 selon cavaliers A0 a A2
module_io = pcf8574.PCF8574(22, 21, 0x20)

# Definition de la liste des ports
gpio = [pcf8574.P0, pcf8574.P1, pcf8574.P2, pcf8574.P3, pcf8574.P4, pcf8574.P5, pcf8574.P6, pcf8574.P7]

while True:

for i in range(0, 8):

module_io.pinwrite(gpio[i], « off ») # LED allume
time.sleep_ms(100)
module_io.pinwrite(gpio[i], « on ») # LED eteinte

for i in range(6, 0, -1):

module_io.pinwrite(gpio[i], « off ») # LED allume
time.sleep_ms(100)
module_io.pinwrite(gpio[i], « on ») # LED eteinte

Le troisième exemple permet de lire l’état d’un port (lecture_port.py) :

#
# Exemple utilisation librairie PCF8574
#
# Test effectue sur ESP32 Heltec Wifi Kit 32
#
# Lecture d’une entree P0 et allume la LED interne en fonction de l’etat de P0
#
# Auteur : iTechnoFrance
#

import machine, pcf8574

# Definition de la LED interne
led_interne = machine.Pin(25, machine.Pin.OUT) # GPIO25

# Pin’s I2C sur ESP32 Heltec Wifi Kit 32
# GPIO22 –> SCL
# GPIO21 –> SDA

# Declaration PCF8574
# Adresse I2C de 0x20 a 0x27 selon cavaliers A0 a A2
module_io = pcf8574.PCF8574(22, 21, 0x20)

while True:

if module_io.pinread(pcf8574.P0) == « HIGH »:

led_interne.value(1)

else:

led_interne.value(0)

Le dernier exemple utilise la fonction d’interruption (lecture_port_int.py) :

#
# Exemple utilisation librairie PCF8574
#
# Test effectue sur ESP32 Heltec Wifi Kit 32
#
# detection interruption et affichage sur la LED interne
#
# Auteur : iTechnoFrance
#

import machine, pcf8574, time

# Definition de la LED interne
led_interne = machine.Pin(25, machine.Pin.OUT) # GPIO25
led_etat = True

# Pin’s I2C sur ESP32 Heltec Wifi Kit 32
# GPIO22 –> SCL
# GPIO21 –> SDA

# Pin utilisee pour traiter l’interruption, port INT du PCF8574 –> GPIO13

# Declaration PCF8574
# Adresse I2C de 0x20 a 0x27 selon cavaliers A0 a A2
module_io = pcf8574.PCF8574(22, 21, 0x20, 13)

while True:

if module_io.interrupt == True:

time.sleep_ms(50)
module_io.reset_interruption()
led_etat = not led_etat

if led_etat:

led_interne.value(1)

else:

led_interne.value(0)

Voilà pour l’utilisation de ce module…

Publicités
Catégories :ESP32, Matériel, NodeMCU Étiquettes : ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :