p1-imu-i2c-read-7.ino

Module d'IA AIWorld P1 pour BPI-M2 Ultra et Berry · Fichier : p1-imu-i2c-read-7.ino · Langage : c · Usage : Lire les données d'accélération et de gyroscopie du capteur inertielle ICM20602 via le bus I2C.

Exemple C bas niveau pour lire les registres bruts du capteur ICM20602 connecté en I2C sur l'Allwinner V40.

Le code utilise les interfaces Linux I2C standard. Vérifiez que le bus I2C-2 est activé dans le fichier de configuration du noyau (device tree). Le bus physique correspond au port GPIO de la BPI-M2 Ultra. Compilez avec gcc -O2 -o imu_read imu_read.c.

p1-imu-i2c-read-7.ino

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdint.h>

#define I2C_BUS "/dev/i2c-2"
#define ICM_ADDR 0x68

int main() {
    int file;
    uint8_t buf[14];
    
    if ((file = open(I2C_BUS, O_RDWR)) < 0) {
        perror("Failed to open I2C bus");
        return 1;
    }
    if (ioctl(file, I2C_SLAVE, ICM_ADDR) < 0) {
        perror("Failed to acquire bus access and/or talk to slave");
        return 1;
    }
    
    // Lecture registre ACC_X_H (0x3B) à GYRO_Z_L (0x44)
    if (read(file, &buf[0], 14) != 14) {
        perror("Failed to read from I2C");
        close(file);
        return 1;
    }
    
    int16_t acc_x = (int16_t)((buf[0] << 8) | buf[1]);
    int16_t gyro_x = (int16_t)((buf[8] << 8) | buf[9]);
    
    printf("Accel X: %d, Gyro X: %d\n", acc_x, gyro_x);
    close(file);
    return 0;
}

← Retour à la fiche