Le PCF8575 est un extender 16 bits inout output pour l'ESP32

Introduction

Dans le monde de l'électronique embarquée, nous nous retrouvons souvent limités par le nombre de broches d'entrée/sortie disponibles sur nos microcontrôleurs. C'est là qu'interviennent les extenseurs d'E/S comme le PCF8575. Ce composant polyvalent vous permet d'ajouter 16 broches d'E/S supplémentaires à votre projet MicroPython via une simple interface I2C. Dans cet article, nous explorons comment implémenter cette solution et résoudre les problèmes courants d'intégration.

Qu'est-ce que le PCF8575 ?

Le PCF8575 est un extenseur d'entrées/sorties 16 bits qui communique via le protocole I2C. Fabriqué principalement par Texas Instruments et NXP, ce composant permet d'ajouter 16 broches GPIO supplémentaires à votre microcontrôleur en n'utilisant que deux broches (SDA et SCL) pour la communication I2C.

Caractéristiques principales :

  • 16 broches d'E/S bidirectionnelles
  • Interface I2C (jusqu'à 400 kHz)
  • Tension d'alimentation de 2,5V à 5,5V
  • Courant de sortie jusqu'à 25mA par broche
  • Adresse I2C configurable (généralement 0x20-0x27)

Mise en œuvre avec MicroPython

Le Code de Base

Pour interagir avec le PCF8575 en MicroPython, nous avons développé cette classe qui offre toutes les fonctionnalités nécessaires :

from machine import I2C, Pin
import time

class PCF8575:
    def __init__(self, i2c, address=0x20):
        """
        Initialise le PCF8575
        
        Args:
            i2c: objet I2C MicroPython
            address: adresse I2C du PCF8575 (défaut: 0x20)
        """
        self.i2c = i2c
        self.address = address
        self.buffer = bytearray(2)
        
        # Initialiser toutes les broches comme entrées (1 = entrée, 0 = sortie)
        self.write_all(0xFFFF)
    
    def write_all(self, value):
        """
        Écrit une valeur 16 bits sur toutes les broches
        
        Args:
            value: valeur 16 bits (0-65535)
        """
        self.buffer[0] = value & 0xFF
        self.buffer[1] = (value >> 8) & 0xFF
        self.i2c.writeto(self.address, self.buffer)
    
    def read_all(self):
        """
        Lit l'état de toutes les broches
        
        Returns:
            Valeur 16 bits représentant l'état des 16 broches
        """
        data = self.i2c.readfrom(self.address, 2)
        return data[0] | (data[1] << 8)
    
    def read_pin(self, pin):
        """
        Lit l'état d'une broche spécifique
        
        Args:
            pin: numéro de la broche (0-15)
            
        Returns:
            État de la broche (0 ou 1)
        """
        if not 0 <= pin <= 15:
            raise ValueError("Le numéro de broche doit être entre 0 et 15")
        
        value = self.read_all()
        return 1 if value & (1 << pin) else 0

 

https://www.amazon.fr/dp/B08SJY1YLW?&linkCode=ll1&tag=sciencesapp-21&linkId=a34c35c1489374fd9b165b21bff78fc8&language=fr_FR&ref_=as_li_ss_tl

 

Utilisation Typique

Voici comment utiliser cette classe dans un projet concret :

# Initialiser I2C
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000)

# Créer une instance PCF8575
pcf = PCF8575(i2c, address=0x20)

# Lire l'état de toutes les broches
pins_state = pcf.read_all()
print(f"État de toutes les broches: 0x{pins_state:04X} (binaire: {pins_state:016b})")

# Lire une broche spécifique
pin5_state = pcf.read_pin(5)
print(f"État de la broche 5: {pin5_state}")

Diagnostiquer les Problèmes Courants

L'un des défis fréquents lors de l'intégration du PCF8575 est l'erreur OSError: [Errno 19] ENODEV qui indique que le périphérique n'est pas détecté. Pour résoudre ce problème, suivez ces étapes :

1. Scanner le Bus I2C

Avant toute chose, vérifiez quels périphériques sont présents sur votre bus I2C :

i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=10000)
devices = i2c.scan()
print("Périphériques I2C trouvés:", [hex(device) for device in devices])

2. Vérifier les Connexions Physiques

  • Alimentation : Assurez-vous que le PCF8575 est correctement alimenté (Vcc et GND)
  • Lignes I2C : Vérifiez les connexions SDA et SCL
  • Résistances pull-up : Les lignes SDA et SCL nécessitent des résistances de pull-up (typiquement 4,7kΩ)

3. Adresse I2C Correcte

L'adresse par défaut du PCF8575 est généralement 0x20, mais elle peut varier en fonction de la configuration des broches d'adressage A0, A1 et A2. Les adresses possibles vont de 0x20 à 0x27.

4. Diminuer la Fréquence I2C

Si les connexions sont longues ou si vous avez des problèmes de communication, essayez de réduire la fréquence I2C :

i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=10000)  # 10kHz au lieu de 100kHz

Applications Pratiques

Le PCF8575 peut être utilisé dans de nombreux projets :

  1. Extension de clavier matriciel - Connectez un grand clavier avec un minimum de broches
  2. Contrôle de multiples LED - Pilotez jusqu'à 16 LED avec seulement deux broches du microcontrôleur
  3. Lecture de capteurs multiples - Connectez plusieurs capteurs numériques comme des interrupteurs ou des détecteurs
  4. Interface pour écrans LCD - Utilisez-le pour contrôler les broches de données d'un écran LCD

Conclusion

L'intégration du PCF8575 avec MicroPython ouvre de nombreuses possibilités pour vos projets IoT et d'électronique. En suivant les conseils de dépannage présentés dans cet article, vous pourrez surmonter les défis d'intégration et tirer pleinement parti de cet extenseur d'E/S polyvalent.

N'hésitez pas à partager vos projets utilisant le PCF8575 dans les commentaires ci-dessous !

Ressources Supplémentaires

En poursuivant votre navigation sur mon site, vous acceptez l’utilisation des Cookies et autres traceurs  pour réaliser des statistiques de visites et enregistrer sur votre machine vos activités pédagogiques. En savoir plus.