cm3588-gpio-i2c-control-7.ino

FriendlyElec CM3588 SOM (Rockchip RK3588) · File : cm3588-gpio-i2c-control-7.ino · Language : Python · Use case : Lire un capteur environnemental I2C (ex: BMP280) en utilisant les bibliothèques GPIO natives de RK3588.

Python example using smbus2 to query an I2C sensor (e.g., BMP280) via RK3588 hardware buses, including device ID verification.

The CM3588 includes multiple I2C controllers. Enable I2C1 in the Device Tree (dts) or via system config tools. Install 'smbus2' and 'gpiod'. GPIO pins must be mapped correctly according to the specific carrier board used.

cm3588-gpio-i2c-control-7.ino

import time
import smbus2
import gpiod

# Configuration matérielle CM3588
# Bus I2C1 est généralement disponible sur les pins 3-5 (SDA1/SCL1) via le connecteur 100 broche
# Vérifiez avec 'i2cdetect -y 1' pour voir l'adresse du capteur (ex: 0x76)

I2C_BUS_NUM = 1
SENSOR_ADDRESS = 0x76 # Exemple BMP280
CHIP = "/dev/gpiochip0" # Chip GPIO principal du RK3588
PIN_SDA = 44 # Correspondance physique vers GPIO logique (dépend du pinout exact du carrier board)

try:
    # Initialisation du bus I2C
    bus = smbus2.SMBus(I2C_BUS_NUM)
    
    # Vérification de la présence du capteur
    try:
        device_id = bus.read_byte_data(SENSOR_ADDRESS, 0xD0)
        if device_id != 0x58:
            print(f"Erreur : Device ID inattendu {device_id} (attendu 0x58)")
            exit()
        print("Capteur BMP280 détecté.")
    except OSError:
        print("Erreur : Impossible de communiquer avec le capteur. Vérifiez le câblage et i2cdetect.")
        exit()

    # Lecture simplifiée de la pression (nécessite lecture des coefficients de calibration pour précision réelle)
    print("Lecture en cours...")
    while True:
        try:
            # Lecture des bits de données brutes (simplifié)
            msb = bus.read_byte_data(SENSOR_ADDRESS, 0xF7)
            lsb = bus.read_byte_data(SENSOR_ADDRESS, 0xF8)
            xlsb = bus.read_byte_data(SENSOR_ADDRESS, 0xF9)
            
            adc_p = ((msb << 12) | (lsb << 4) | (xlsb >> 4))
            print(f"Valeur brute pression ADC: {adc_p}")
            time.sleep(1)
        except KeyboardInterrupt:
            break
        except Exception as e:
            print(f"Erreur de lecture: {e}")
            break

finally:
    bus.close()
    print("Bus I2C fermé.")

← Back to the board