Clignotement LED I2C PCF8574

Bonjour, pour un de mes projets, j’ai voulu réduire un maximum l’utilisation de PIN.

J’ai donc utilisé un PCF8574 (Documentation), c’est assez simple d’utilisation.

Voici un schéma pour relier le PCF8574 à la carte Arduino (Mega / Uno …):
Allez prenons l’example sur une Arduino Uno : il faut relier le SDA du PCF8574 sur le SDA de l’Arduino Uno (PIN A4), et le SCL sur le SCL de l’Arduino Uno (PIN A5).
Ce qui nous donne :

Maintenant branchons une LED, sur le pin P1 du PCF8574 et celles non utilisées sur le GND:
Nous aurons ceci:

Passons au code:
Importez #include <Wire.h>

Déffinissez l’adresse du PCF8574:
#define adress 0x20

dans la fonction setup, ont initialise la communicatio I2C par:
Wire.begin();

on à donc:

on va maintenant créer une fonction qui s’appellera Write

On à donc:

dans Write(), passons une variable de type byte nommée _data (donnée)
dans cette fonction, nous y mettons la “transmission”:

  Wire.beginTransmission(adress); // Commence la transmission sur l'adresse défini plus haut
  Wire.write(_data);              // On envoie la donnée
  Wire.endTransmission();         // On termine la transmission

on aura:

Passons maintenant au clignotement de la LED, dans loop() on va utiliser notre fonction Write():

alors pour le clignotement, c’est simple, c’est comme faire:

digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);

mais digitalWrite est remplacé par Write
Donc comme ceci:

  Write(B00000010);  // On passe P1 à 1 et les autre à 0 pour allumer la LED
  delay(1000);       // On attend 1s (1000ms)
  Write(B00000000);  // On passe tout à 1 pour etteindre la LED
  delay(1000);       // On attend 1s (1000ms)

Donc B pour dire que c’est du binaire. Ensuite le 1 pour passer la LED en état Haut et en avant dernier car on à P7 en début et P1 en fin, en gros on a ceci:

 Write(P7, P6, P5, P4, P3, P2, P1, P0);

Donc la fonction loop est comme ceci:

Le code final:

/*
*  Clignotement de LED en I2C avec un PCF8574
*  @author Manghao
*/
#include <Wire.h>

#define adress 0x20

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

void loop() {
  Write(B00000010);  // On passe P1 à 1 et les autre à 0 pour allumer la LED
  delay(1000);       // On attend 1s (1000ms)
  Write(B00000000);  // On passe tout à 1 pour etteindre la LED
  delay(1000);       // On attend 1s (1000ms)
}


void Write(byte _data) {
  Wire.beginTransmission(adress); // Commence la transmission sur l'adresse défini plus haut
  Wire.write(_data);              // On envoie la donnée
  Wire.endTransmission();         // On termine la transmission
}

Plus qu’a téléverser sur votre carte et tout est bon, la led devrait clignoter.

C’est mon premier tuto donc si vous n’avez pas compris quelque chose ou que je me suis mal expliqué j’en suis désolé.

Cordialement Manghao.

Bonne mise en jambe, on attend les autres :grin: :grin:

Merci, d'autres seront à venir, je pense sur l'utilisation du clavier

Bonsoir,
Sur ton schéma, il manque les résistances de pullup des liaisons SDA et SCL.

Bonsoir,
Si tu souhaites en savoir plus sur le PCF 8574, tu peux étudier la lib : GitHub - skywodd/pcf8574_arduino_library: PCF8574 / PCF8575 Arduino library (version 2.0)
Il y a beaucoup de chose à apprendre.
Il y a également une discussion avec des possibilités plus élargies ici : http://forum.arduino.cc/index.php?topic=182507.msg1398941#msg1398941
@+

Oui, oublie de ma part, je rajoute aussi les résistance sur la LED

Ce qui est de la librairie icare, je l'ai vu elle est même implantée dans mon arduino IDE

Bonjour,
Je suis en train de tester ce tutoriel, mais malheureusement je n’arrive pas à le faire fonctionner…
J’utilise un PCF8574A.
Sur le web j’ai trouvé des info disant que l’adresse n’est pas 0X20 pour ce modèle, mais 0X38.
J’ai donc réalisé cette modif, mais toujours rien…
Quelqu’un pourrait me dépanné?
Merci!

Bonjour

Commence par exécuter un programme scanner_I2C, pour relever les adresses des périphériques I2C présents sur le bus. Cela lèvera le doute sur l'adresse de ton PCF8574, et sur le fait que la communication avec l'arduino est bien établie.

La suite est toute simple : envoie un octet au PCF8574 et vérifie que ses sorties sont bien à GND ou VCC en fonction du bit associé.

un prg scanner i2c

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Super, merci beaucoup!
Je tente cela tout à l'heure!
Je vous redis.

Nickel!
Le scan confirme l'info. L'adresse du PCF8574A est bien 0x38. Et pas 0x20 comme sur l'autre version.
Il faut donc faire attention a cette lettre!
Concernant les sorties, elles sont connectées à la masse.
Il faut donc inverser le sens de la diode sur le schéma plus haut dans le cas ou on utilise cet expander.
Un grand merci les gars, ça m'a bien dépanné!

Bonjour à tous,

Alors moi j’ai bien mes LEDs qui clignotent mais très faiblement comme quand on ne définit pas le pinMode (OUTPUT) sur l’arduino.

Vous auriez une idée pour améliorer tout ça ?

EDIT : 3min plus tard…

Problème résolu !
Pour ceux qui ont le même, voici l’explication :

bricoleau:
L’intensité maximum de courant sortant sur une pin numérique est très limitée. Pas étonnant que la tension s’écroule.
L’intensité maximum de courant entrant est un peu plus élevée. Il vaut mieux brancher la led à l’envers.
PCF8574 <-> LED <-> resistance <-> 5V.
Pour l’allumer, passer la sortie à 0.