Utilisation d'un PCF8574 sur bus I2C

Bonjour,

Dans le but d'ajouter plus de sortie a mon arduino, j'ai acheté un CI PCF8574, qui permet d'ajouter 8 ports d'entrées/sorties grâce au bus I2C, mais je n'arrive pas à l'utiliser...

Voici la connexion des pins du PCF8574:
A0 1 address input 0 ==> +5V
A1 2 address input 1 ==> +5V
A2 3 address input 2 ==> +5V
P0 4 quasi-bidirectional I/O 0 ==> ULN2803
P1 5 quasi-bidirectional I/O 1 ==> ULN2803
P2 6 quasi-bidirectional I/O 2 ==> ULN2803
P3 7 quasi-bidirectional I/O 3 ==> ULN2803
VSS 8 supply ground ==> GND
P4 9 quasi-bidirectional I/O 4 ==> ULN2803
P5 10 quasi-bidirectional I/O 5 ==> ULN2803
P6 11 quasi-bidirectional I/O 6 ==> ULN2803
P7 12 quasi-bidirectional I/O 7 ==> ULN2803
INT 13 interrupt output (active LOW) ==> RIen
SCL 14 serial clock line ==> D5 Arduino + Résistance de 10K vers +5V (pull-up)
SDA 15 serial data line ==> D4 Arduino + Résistance de 10K vers +5V (pull-up)
VDD 16 supply voltage ==> +5V

Chaque sortie du PCF8574 sont connectées à une entrée d'un ULN2803 qui n'est relié à rien.

Voici le code que j'utilise

#include <Wire.h>

void setup() 
{
  Wire.begin();  
  Serial.begin(9600);
}

void loop()
{ 
  Wire.beginTransmission(B0100111);
  Wire.send(B00000000);
  int code = Wire.endTransmission();

  Serial.println(code, DEC);  

  Serial.println("Fin !!!");  
  
}

Sur le port série j’obtiens ceci

2
Fin !!!

D'après la doc arduino, la valeur de retour "2" pour "Wire.endTransmission();" signifie que l’esclave I2C n'a pas répondu à son adressage.

Je suis nouveau dans le monde de l'éléctronique et je ne sais pas ce qui ne va pas ici. Pouvez vous m'aider ?

Merci d'avance !

salut

regardes cette page : Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino
vers le bas de page tu as : I2C Scanner
tu l'essaies.
bonne lecture

chabot380

ps : autre site http://automatepc.fr/?page=I2cPcf8574

Bonjour,

Faut bien vérifié que c'est un PCF8574 et non un PCF8574A les adresses I2C sont différentes.
Avec le PCF8574 => 0x20 et avec le PCF8574A => 0x38.

Ensuite je peut te conseiller une super librairie pour le PCF8574 ici (c'est moi qui l'est fait donc bon :grin:).

Merci de vos réponse !
Donc en effet, il s'agit d'un PCF8574A, donc son adresse est B0111xxx, avec xxx=111 ici.
De plus, j'avais connecté mes broches SDA et SCL aux broches digitale, alors qu'il faut les brancher sur les broches 4 et 5 analogiques.

Donc maintenant le PCF8574A reçoit bien mes commandes mais j'ai un autre problème : les sorties sont à 0V à l'état bas mais seulement à 1.36V a l'état haut (alors que Vin = 4.5V) ! Du coup, les sorties de l'ULN2803 restent à l'état bas.

congelli501:
Donc en effet, il s'agit d'un PCF8574A, donc son adresse est B0111xxx, avec xxx=111 ici.
De plus, j'avais connecté mes broches SDA et SCL aux broches digitale, alors qu'il faut les brancher sur les broches 4 et 5 analogiques.

Effectivement ça ne pouvais pas marcher comme ça :grin:.

congelli501:
Donc maintenant le PCF8574A reçoit bien mes commandes mais j'ai un autre problème : les sorties sont à 0V à l'état bas mais seulement à 1.36V a l'état haut (alors que Vin = 4.5V) ! Du coup, les sorties de l'ULN2803 restent à l'état bas.

Normal ! Les PCF8574 et PCF8574A ne "génère" pas de courant mais en absorbe (il faut que le courant rentre dedans), place des résistances de 4k7 (ou 10k) sur les broches d'entré de ton ULN2803.

skywodd:

congelli501:
Donc maintenant le PCF8574A reçoit bien mes commandes mais j'ai un autre problème : les sorties sont à 0V à l'état bas mais seulement à 1.36V a l'état haut (alors que Vin = 4.5V) ! Du coup, les sorties de l'ULN2803 restent à l'état bas.

Normal ! Les PCF8574 et PCF8574A ne "génère" pas de courant mais en absorbe (il faut que le courant rentre dedans), place des résistances de 4k7 (ou 10k) sur les broches d'entré de ton ULN2803.

Je ne suis pas sûr d'avoir compris le branchement des résistances... Il faut que je mette des résistances entre chaque entrée de l'ULN2803 et le +5V c'est bien cela ?

congelli501:
Je ne suis pas sûr d'avoir compris le branchement des résistances... Il faut que je mette des résistances entre chaque entrée de l'ULN2803 et le +5V c'est bien cela ?

Dans le uln2803 il y a des transistor en darlington, pour saturer ces transistors il faut du courant.
Comme le pcf8574 ne "fourni" pas de courant (~100µA) il faut mettre des résistances (10k c'est bien) entre le +5v et les entrées du uln2803 comme ça la résistance fourni le courant et le pcf8574 vient forcer la patte de ton choix à 0v et c'est alors lui qui absorbe le courant (max 15mA).

en gros +5v --10K -+- patte uln2803
pcf8574 --|

fait le test avec une seul résistance sur un seul patte pour tester mais normalement ça devrait fonctionner.

Ok, je vois !
Dans la doc de l'ULN2803 ils disent qu'il faut 0.93mA pour mettre une broche a l'état haut. Il ne vaut mieux donc pas utiliser une résistance de 4.7K pour être sûr ? (à 5V ça fait 1.06 mA).

Si tu veux être sur tu peut mettre des 4k7 effectivement, perso je met des 10k donc bon si ça ce trouve j'ai eu de la chance que ça marche ^^""

J'ai fait un test avec une résistance de 5.3K, 3.3K puis 1K mais ce n'était pas suffisant. Avec la résistance de 1K, la sortie du PCF8574 est à 3,6V et la sortie de l'ULN2803 est l'état bas... Je ne sais pas ce qui ne va pas et je n'ose pas utiliser des résistances plus faible.

J'avais soudé l'ULN2803 sur ma plaque de test sans support pour circuit intégré en dessous, est-il possible qu'il ait "grillé" à cause de la soudure ?

congelli501:
J'ai fait un test avec une résistance de 5.3K, 3.3K puis 1K mais ce n'était pas suffisant. Avec la résistance de 1K, la sortie du PCF8574 est à 3,6V et la sortie de l'ULN2803 est l'état bas... Je ne sais pas ce qui ne va pas et je n'ose pas utiliser des résistances plus faible.

J'avais soudé l'ULN2803 sur ma plaque de test sans support pour circuit intégré en dessous, est-il possible qu'il ait "grillé" à cause de la soudure ?

Un transistor qui grille pendant la soudure c'est assez rare mais pas impossible.
je viens de tester avec un PCF8574 de mes tiroirs sur 2 ULN2803, les deux marchent avec des résistances de 4k7.
Regarde combien de volt il y a sans rien après le PCF8574 (en gros lui tout seul avec l'arduino) cette histoire de 3,...v c'est pas nette.

J'ai en débranchant l'ULN2803, j'ai bien 0V et 4.5V (Vcc) aux sorties du pcf8574.
Ensuite j'ai mis les sorties du pcf8574 à l'état haut (pour ne pas le griller) et j'ai brancher directement l'entré de l'ULN2803 à Vcc (en court-circuitant la résistance) et je n'ai obtenu que 0.6V a la sortie de l'ULN2803, donc je pense que c'est ce composant qui pose problème.

J'ai essayé de faire des tests avec un autre ULN2803 que j'avais. J'ai branché la patte COM sur +4.5V, GND sur la masse, I1 sur +4.5V et j'ai encore obtenu 0.6V a la sortie correspondante (O1) de l'ULN2803. Lorsque I0 est débranché, j'ai 0V sur la sortie 01 (normal).

je viens de regarder le datasheet du ULN2803, la résistance de limitation de courant doit surement faire pont diviseur d'où le 0.6v,
j'avoue n'avoir pas fait gaffe :blush: et je réalise que je doit vraiment avoir de la chance que ça marche dans mes circuits :blush: .

Donc tu dis qu'en directe PCF8574 -> ULN2803 ça ne marche pas jusque la rien d'étonnant, il faut 1mA pour saturé le darlington et le PCF8574 n'en fourni que 100µA.
Une possibilité serait de prendre des portes OU ou ET et de les monter en porte "oui" vu qu'une porte logique peut fournir 10mA.

J'ai testé mon ULN2803 seul, en connectant simplement la broche COM au +5V, GND à la masse et une entrée directement connectée au +5V. La sortie correspondante était encore à 0.6V alors qu'elle aurait du être à 5V aussi ! Je ne comprend pas. Est ce que mes branchements sont mauvais ?

Bonjour

J'ai testé mon ULN2803 seul, en connectant simplement la broche COM au +5V, GND à la masse et une entrée directement connectée au +5V. La sortie correspondante était encore à 0.6V

Tout va bien !
Le ci ULN2008 contient des inverseurs : état haut en entrée -> état bas en sortie
Entrée à la masse (pas de courant de base, transistors bloqués) -> 5V en sortie
Entrée à +5 -> courant de 1,3mA dans la base du darlington -> saturation -> faible tension entre collecteur et emetteur.

ULN2008.jpg

Bonjour,
Je ne savais pas pour l'inversion.
Je viens de tester, et avec l'entrée connectée à la masse, j'ai 0V à la sortie.

Qu'est-ce que tu mets entre 5V et la sortie du ULN2803 ?

Je mesurais la tension à vide (juste le multimètre) entre la sortie et ... la masse.
En mesurant la tension entre la sortie et le +5V avec 3 led entre les deux j’obtiens 3.75V, donc avec une chute de tension que je suppose normale, et 0V lorsque les sorties du PCF8574A sont a 0V, donc a priori tout marche :).

De plus, même les sortie sans les résistances que m'a demandé de mettre skywodd marchent, donc est-il nécessaire que je les ajoutes malgré tout ?

A l'état haut une sortie de PCF8574 fournit 100µA. C'est peu !!
On est loin du compte pour garantir la saturation du darlington des ULN2803 dans la majorité des cas.
Il faut donc ajouter, comme skywodd l'a écrit, une résistance de 'tirage' ou de 'pull-up" (R sur mes schémas joints).
-Le calcul précis de la valeur maximale cette résistance ne peut se faire qu'en fonction du courant dans la charge (relais, moteur......)
-La valeur minimale de R par contre est fixée par ce que peut encaisser la sortie du PCF8574 à l'état bas (50mA pour éviter la destruction mais il est préférable de ne pas dépasser 25mA) Disons Rmini 200 Ohm

->> 1k 2,2k 3,3k 4,7k sont sans doute des valeurs convenables dans la plupart des cas

Merci pour le schémas. Si j'ai bien compris, l'ULN2803 met ses sorties à la masse lorsque ses entrés sont à l'état haut. C'est donc l'inverse de ce que je pensais.
J'avais prévu de mettre des transistors NPN TIP31C après l'ULN2803 pour contrôler des bobines d'environ 1A, mais maintenant je ne vois pas comment les câbler sur l'ULN2803.