Qu'est ce que l'i2c ? Comment le mettre en place sur la Raspberry Pi ?

Introduction

L’Inter-Integrated Circuit (I2C) est un protocole de communication série utilisé pour connecter des composants électroniques sur un même circuit imprimé ou entre différents périphériques. Sur la Raspberry Pi, le bus I2C est une méthode populaire pour permettre à la carte de communiquer avec divers capteurs, modules et autres composants externes. L’I2C utilise deux fils : SDA qui permet la transmission de donnée et le SCL qui transmet l’horloge entre la carte raspberry pi et votre composant .

La Raspberry Pi dispose de broches dédiées pour l’I2C, facilitant la connexion à des périphériques externes. Ce bus permet une communication bidirectionnelle entre le maître (Raspberry Pi) et plusieurs esclaves (périphériques). Chaque périphérique I2C possède une adresse unique permettant au maître de sélectionner spécifiquement le périphérique avec lequel il souhaite communiquer.

Voici ou se situe les pins de l’i2C sur la raspberry pi :

Installation

On a besoin d’installer le package i2c-toolfs pour utiliser l’i2c de la carte Raspberry pi :

sudo apt install -y i2c-tools 

On a besoin d’installer le package i2c-toolfs pour utiliser l’i2c de la carte Raspberry pi :

sudo raspi-config

Voici le menu de raspi-config. Vous devez cliquer sur Interface Options  :

Une fois dans interface options on clique sur I2C :

On clique sur yes pour activer l’i2C sur la raspberry Pi :

On a ensuite une fenêtre pour co

Test

On va maintenant voir comment envoyer des données sur l’i2c à un périphérique connecté à la raspberry pi ou bien recevoir des données de celui-ci.

Tout d’abord en utilisant la fonciton i2cdetect présent dans le package i2c-tools, on peut voir les composants et leurs adresses qui sont connectées à l’i2c de la raspberry pi :

Ici on peut voir notre module RTC connecté avec l’adresse 0x68. Vous pouvez l’adresse de votre périphérique dans sa fiche technique.

Lecture du périphérique

Voici un programme qui permet de lire les valeurs sur l’adresse 0x68. Celui-ci permet de lire les minutes, heures et secondes d’un module RTC mais qui peut être facilement adapté à vos besoins :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUF 256

void readDS1307(int reg) {
    char command[MAX_BUF];
    FILE *fp;

    snprintf(command, sizeof(command), "sudo i2cget -y 1 0x68 %d", reg);
    fp = popen(command, "r");
    if (fp == NULL) {
        printf("Erreur lors de l'exécution de la commande.\n");
        exit(1);
    }

    char output[MAX_BUF];
    while (fgets(output, sizeof(output), fp) != NULL) {
        printf("Valeur du registre 0x%02X : %d\n", reg, (int)strtol(output, NULL, 16));
    }
    pclose(fp);
}

int main() {
    printf("Lecture de l'heure depuis le DS1307...\n");

    readDS1307(0x00); // Lecture des secondes (0x00)
    readDS1307(0x01); // Lecture des minutes (0x01)
    readDS1307(0x02); // Lecture des heures (0x02)

    return 0;
}

Envoie vers le périphérique

Voici un deuxième programme qui permet d’envoyer des valeurs à travers l’i2c à l’adresse 0x10 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define SLAVE_ADDRESS "0x10" // Adresse I2C du périphérique esclave

void sendValue(const char *value) {
    char command[64];
    FILE *fp;
    snprintf(command, sizeof(command), "i2cset -y 1 %s %s", SLAVE_ADDRESS, value);
    fp = popen(command, "r");
    if (fp == NULL) {
        printf("Erreur lors de l'exécution de la commande.\n");
        exit(1);
    }
    pclose(fp);
}

int main() {
    printf("Envoi de valeurs via le bus I2C...\n");
    while (1) {
        // Envoi de la valeur 24 (0x18 en hexadécimal)
        sendValue("0x18");
        printf("Envoi de la valeur 24 via I2C\n");
        sleep(1);

        // Envoi de la valeur 126 (0x7E en hexadécimal)
        sendValue("0x7E");
        printf("Envoi de la valeur 126 via I2C\n");
        sleep(1);
    }
    return 0;
}

Voici le résultat du SDA et SCL sur l’oscilloscope :