Ajouter des Entrée / sortie (GPIO) grâce au i2c

Ajouter des Entrée / sortie (GPIO) grâce au i2c

I2C (signifie : Inter-Integrated Circuit, en anglais) est un bus informatique qui a émergé de la « guerre des standards » lancée par les acteurs du monde électronique. Conçu par Philips pour les applications de domotique et d’électronique domestique, il permet de relier facilement un microprocesseur et différents circuits, notamment ceux d’une télévision moderne : récepteur de la télécommande, réglages des amplificateurs basses fréquences, tuner, horloge, gestion de la prise péritel, etc.

Il existe d’innombrables périphériques exploitant ce bus, il est même implémentable par logiciel dans n’importe quel microcontrôleur. Le poids de l’industrie de l’électronique grand public a permis des prix très bas grâce à ces nombreux composants.

Les expander

Perso j'utilise le PCA9555 – Texas Instruments

la bibliothèque Arduino https://github.com/sumotoy/gpio_expander

En gros on gagne 17 GPIO !!!

Un exemple

Ajouter des Entrée / sortie (GPIO) grâce au i2c
Ajouter des Entrée / sortie (GPIO) grâce au i2c

Un petit plan dans notre brave Proteus

 

Un exemple en vrai avec le code

Ajouter des Entrée / sortie (GPIO) grâce au i2c
#include <Wire.h> //  Address            0 1 0 0   A2 A1 A0 #define LED_ADDRESS 0x27 // Address for this PCA9555, you can cascade 8 PCA9555 on one I2C bus, which has diffrent address #define REGISTER_OUTPUT 0x02 //P0 output register 0 #define REGISTER_CONFIG 0x06 //register 6 set P0 status.  0xffff for input,  0x0000 for output /* //if you use P1 for output, please use following configuration. #define REGISTER_OUTPUT 0x03 //P1 output register 1 #define REGISTER_CONFIG 0x07 //register 7 set P1 status.  0xffff for input,  0x0000 for output. */ void setup() {  Wire.begin();  Serial.begin(9600);  gpio_dir(LED_ADDRESS, 0x0000);//set P0  IO output } int bits=0;   void loop() {  bits %=8;  Serial.println(bits);  gpio_write(LED_ADDRESS,bits); //write data  bits++;  delay(1000); } void gpio_dir(int address,int dir) {    Wire.beginTransmission(address);  Wire.send(REGISTER_CONFIG);  //  send 2 bytes data  Wire.send(0xff & dir);  //  write 8bits data to P0 register  Wire.send(dir >> 8);    //   write 8bits data to P1 register  Wire.endTransmission(); } void gpio_write(int address,int data) {  Wire.beginTransmission(address);  Wire.send(REGISTER_OUTPUT);  //  send 2 bytes data  Wire.send(0xff & data);  //  write 8bits data to P0 register  Wire.send(data >> 8);    //  write 8bits data to P1 register  Wire.endTransmission(); } 

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *