Multiplexage afficheurs 7 segments

Bonjour à tous, comme vous pouvez en douter, je n'arrive pas à résoudre un petit problème qui concerne le multiplexage d'afficheurs 7 segments. Je travaille actuellement sur un projet qui nécessite le contrôle de 8 afficheurs 7 segments et pour les piloter, j'ai choisis d'utiliser un PCF8575 en me basant sur le schéma de skywodd :


D'ailleur @skywodd si tu m'entends... :slight_smile:

Mon câblage est correcte mais j'ai l'impression que je n'arrive pas à piloter mes transistors à l'aide du PCF8575. Voici mon code (j'essaye avec 2 afficheurs pour le moment en comptant les secondes) :

// Inclusion de la librairie I2C
#include <Wire.h>

// Adresse I2C du PCF8575
int PCF8575_ADDRESS = 0x20;
 
// Tableau de correspondance chiffre -> 7-segments
byte digits[10] = {
  B11000000 ,
  B11110011 ,
  B10100100 ,
  B10100001 ,
  B10010011 ,
  B10001001 ,
  B10001000 ,
  B11100011 ,
  B10000000 ,
  B10000001 
};

// Tableau de correspondance transistor -> chiffres
byte transistor[2] = {
  B01111111 ,
  B10111111 
};

 long unsigned tmpspresent = 0;
 long unsigned temps = 0;
 int intervalle = 1000;
 byte seconde = 0;
 
void setup()
{
  pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
  Serial.begin(9600);
  Wire.begin(); // Configuration du bus I2C
}
 
void loop() {

  tmpspresent = millis();
  
    if (tmpspresent - temps >= intervalle) {
    temps = tmpspresent;
    seconde ++;
      if (seconde >= 60) {
       seconde = 0;
    }
}
  decoupageNombre(seconde);
  Serial.println (seconde);
  delay(1);
}

void decoupageNombre(int seconde)
{
        byte dizaine = seconde %10;
        byte unite = seconde /10;

        byte transistor = 1;
        afficherChiffre(dizaine, transistor);
        delay(10);
        transistor = 2;
        afficherChiffre(unite, transistor);
        delay(10);
          
}

void afficherChiffre(byte chiffre, byte numero)
{
        byte x = chiffre;
        byte y = numero;
        Wire.beginTransmission(PCF8575_ADDRESS); // Engage la communication
        Wire.write(digits[x]); // Envoie le 1er octet (bits 0 ~ 8 )             
        Wire.write(transistor[y]); // Envoie le 2eme octet (bits 9 ~ 16)
        Wire.endTransmission(); // Termine la communication 

}

Alors que quand je gère mes transistors directement avec l'arduino comme ceci... :

void decoupageNombre(int seconde)
{
        byte dizaine = seconde %10;
        byte unite = seconde /10;

        digitalWrite(2,HIGH);
        digitalWrite(3,LOW);
        afficherChiffre(dizaine, transistor);
        delay(10);

        digitalWrite(2,LOW);
        digitalWrite(3,HIGH);
        afficherChiffre(unite, transistor);
        delay(10);
          
}

...mes afficheurs fonctionnent correctement.

Quelqu'un peut-il m'éclairer svp ?

Bonjour

Que veux tu dire par "j'ai l'impression que je n'arrive pas à piloter mes transistors à l'aide du PCF8575"

Sur les afficheurs 8 segments 4 digits les broches ne sont pas toujours dans le même ordre. Peut-être que c'est un problème du même type ?

  byte dizaine = seconde %10;
        byte unite = seconde /10;

serait plus classique et moins deroutant avec

  byte unite  = seconde %10;
        byte dizaine = seconde /10;

Est ce que votre PCF8575 fonctionne (on trouve des dizaines de scanneurs I2C pour arduino sur le ouaibe A I2C Scanner for Arduino · GitHub par exemple) ?
estce que votre PCF8575 a deux resistances de tirage vers le haut?

Ou est le schéma de câblage qui a été réellement réalisé ?
Les segments sont-il actifs quand les sorties du PCF sont à l'état haut ou à l'état bas ?
Les afficheurs sont-il à cathode commune ou à anode commune ?

La datasheet du PCF8575 indique :

IOH : – 1mA
IOL : 25 mA

IOH est le courant maximal qu'une sortie peut fournir quand elle est à l'état haut (mode source)
IOL est le courant maximal qu'une sortie peut absorber quand elle est à l'tat bas (mode sink)

Le câblage réalisé est exactement le même que celui de skywodd (mise à part que j'ai juste 2 transistors et 2 afficheurs).
Mes afficheurs sont à anode commune et d'après mes recherches et ce que j'ai compris, le PCF8575 possède des entrées à drain ouvert, de sorte qu'il ne peut tirer que ses sorties vers le bas et ne peut pas fournir le courant d'entrée requis par mes transistors. En gros il peut absorber du courant (ce qu'il fait pour allumer mes afficheurs puisqu'ils sont à anodes commune) mais il ne peut pas en fournir assez pour alimenter mon transistor. Tout cela est-il correcte ?
Et donc si je place une résistance pull up à la base de chaque transistors, elle fournira le courant necessaire lorsque le Pcf8575 n'activera pas sa sortie basse.
Qu'en pensez-vous ?

Le câblage réalisé est exactement le même que celui de skywodd (mise à part que

C'est le "mise à part" qui me gène.
Je n'ai pas le temps de suite, j'essaye de te proposer (rapidement) le schéma tel que je le vois.

le PCF8575 possède des entrées à drain ouvert,

Seule les sorties peuvent être opendrain, une entrée est à haute impédance.

"PCF" indique un CI d'origine Philips, je recherche les datasheet Philips (ou NXP qui a repris les CI Philips)..

Extrait de la datasheet

1 FEATURES
• Operating supply voltage 2.5 to 5.5 V
• Low standby current consumption of 10 μA maximum
• I2C-bus to parallel port expander
• 400 kbits/s FAST I2C-bus
• Open-drain interrupt output
• 16-bit remote I/O port for the I2C-bus
• Compatible with most microcontrollers
• Latched outputs with high current drive capability for
directly driving LEDs
• Address by 3 hardware address pins for use of up to
8 devices
• SSOP24 package.

A l’exception de la sortie "alarm" le circuit n'a pas de sortie réellement opendrain

Schéma simplifié des sorties extrait de la datasheet :


C'est un montage hybride plus complexe qu'un montage à drain ouvert même s'il s'en rapproche car il peut quand même fournir un léger courant (1 mA) et sans ajouter de composants externes (résistances par exemple) il est capable de délivrer des états logiques haut et bas.

La suite un peu plus tard le temps que je trouve le temps de faire un schéma.

Je reprends.
Le PCF8575 doit fournir les courants de base du BC547.
Je vais vérifier que le PCF8575 peut les fournir (le schéma provenant de Skywood je ne suis pas inquiet).

Les BC547 fonctionnent en montage collecteur commun.
Ce qui veut dire que les afficheurs ne verront pas une tension Vcc mais Vcc moins le seuil de la diode base/émetteur soit Vafficheur = 5V - 0,7V = 4,3V

Calcul du courant Ic dans les BC547.
Pour 1 segment nous avons :
Si Vcc = 5 V et Vdel = 1,8V (je dis que les segments sont rouges) et R = 330 ohms
I = (5V -07V - 1.8V) / 330 = 7,5 mA
Pour 8 segments on a 60 mA.

La datasheet du BC547 donne :
IC max (absolut maximum rating) 100 mA
un gain en courant minimum (HFE) égal à 110

Le montage collecteur commun fonctionne toujours en mode linéaire, le courant de base ne peut pas être forcé comme dans le montage en émetteur commun classique. Seul le courant nécessaire est prélevé dans la base, il n'est pas utile de placer des résistances de limitation de courant en série avec l'entrée base.
D'où Ib = 60mA/110 = 0,55 mA.

Normalement si le câblage est bon il ne devrait pas y avoir de problème de courant de sortie à l'état haut trop important puisque le PCF8575 est donné pour délivrer jusqu'à 1 mA, néanmoins c'est quand même rik rak, mais c'est le pire cas on peut espérer avoir un courant divisé par 2.

Les PCF8574 et 8575 font partie de ces CI antiques comme le DS1307, ils continuent à figurer dans les tutos et exemples pour débutants alors qu'il existe des circuit plus modernes et bien plus puissants et vendus au même prix comme le MCP23017 qui est un vrai bidirectionnel (le PCF8575 n'est qu'un quasi bidirectionnel) et qui est capable de fournir ou d'absorber jusqu'à 25 mA.

Schéma :

D'abord merci 68tjs pour le temps que tu consacres à ce projet. J'ai fais des essais avec les résistances pull-up de 1K dont je parlais précédemment et ça fonctionne parfaitement (ça ne fonctionne pas sans pull-up, même en inversant l'état logique de la broche). Mais tu as bien fait de faire ton mode ronchon mdr, je vais me procurer le MCP23017 car il me permettera sûrement de me débarrasser des pull-up.
Mon circuit fonctionnant parfaitement, j'ai fais un essai avec mes 8 afficheurs mais l'arduino n'assume pas niveau calculs xD.
Tu as égalemant parlé du DS1307. Quel est son équivalent le plus récent ? Il va falloir que je récupère l'heure, et si il a un mode "chronomètre" ça serait le top.
A propos des afficheurs, je compte, à terme, les fabriquer moi même à base de plusieurs led, peut-être une vingtaine par segments (oui, ce sera des grands afficheurs). Admettons que chaque segments sera alimenté en 12v et consommera 0.2A, que me conseilles-tu de prendre pour les transitors ? Et pour la consommation globale qui serai environ de 11.2A (0.2 x 56segements), faut-il prendre une alim capable de fournir 12A (même plus), ou une 5A fera l'affaire ?(Puisque apres tout, les digits seront affichés un par un).