🛠 Brancher un capteur BME280 sur l'I2C1 du carrier (GPIOX_17/18)
Objectifs
Monter un capteur température/humidité/pression BME280 sur le bus I2C1 du carrier, câblé sur GPIOX_17 (SDA, broche 3) et GPIOX_18 (SCL, broche 5) d'après la table de brochage du BPI-CM4IO. Vous allez activer le contrôleur (tuto overlays), résoudre le numéro réel du bus (le contrôleur &i2c2 mainline n'a pas d'alias), scanner le bus, vérifier l'identifiant de puce (0x60) puis lire la température brute en Python via i2c-dev — méthode identique sur le BSP 4.9 et sur Armbian.
Matériel
- BPI-CM4 + carrier sous Armbian (bus activé, voir le tuto overlays) ou image vendor avec overlays="i2c2"
- Module BME280 en mode I2C (adresse 0x76 par défaut, 0x77 si la broche ADDR est au niveau haut)
- 4 fils Dupont mâle-femelle ; alimenter le module en 3,3 V
Code complet
sudo apt install -y i2c-tools
# Résoudre le numéro du bus du header (contrôleur &i2c2, non aliasé)
for d in /sys/class/i2c-dev/i2c-*; do
echo "$(basename $d) -> $(cat $d/of_node/name 2>/dev/null)"
done
i2cdetect -y 2 # adapter N ; la case 76 doit apparaître
#!/usr/bin/env python3
"""bme280_cm4.py — lecture BME280 sur le BPI-CM4 (BUS = numéro trouvé plus haut)."""
import fcntl, time
BUS, ADDR = 2, 0x76 # à ajuster selon i2cdetect -l
I2C_SLAVE = 0x0703
def read_regs(reg, n=1):
with open(f"/dev/i2c-{BUS}", "rb+", buffering=0) as f:
fcntl.ioctl(f, I2C_SLAVE, ADDR)
f.write(bytes([reg]))
return f.read(n)
chip_id = read_regs(0xD0)[0]
print(f"chip ID 0x{chip_id:02X} (attendu 0x60 pour un BME280)")
# Reset doux puis mesure forcée T+x1, P+x1
with open(f"/dev/i2c-{BUS}", "wb+", buffering=0) as f:
fcntl.ioctl(f, I2C_SLAVE, ADDR)
f.write(bytes([0xE0, 0xB6])); time.sleep(0.05)
f.write(bytes([0xF4, 0x27]))
time.sleep(0.1)
raw = read_regs(0xFA, 3) # MSB..XLSB température (20 bits)
temp = ((raw[0] << 16) | (raw[1] << 8) | raw[2]) >> 4
print(f"température brute (registre 20 bits) : {temp}")
Vérification attendue
i2cdetect affiche 76 sur le bus du header ; le script imprime chip ID 0x60 ; en soufflant sur le capteur, la valeur brute du registre 20 bits baisse régulièrement. Pour une valeur physique complète, lire les coefficients de calibration (blocs 0x88-0xA1 et 0xE1-0xE7) et appliquer la compensation du datasheet Bosch, ou utiliser une bibliothèque BME280 existante.
Erreurs fréquentes
- Utiliser /dev/i2c-2 « parce que c'est i2c2 » : sur mainline le numéro d'énumération ne correspond pas forcément au contrôleur du header — vérifier via /sys/class/i2c-dev/.
- Oublier l'overlay : i2cdetect -l ne montre alors aucun contrôleur de header.
- Module en 0x77 (ADDR câblé haut) alors que le script lit 0x76.
- Alimenter en 5 V un module dont le niveau logique suit la banque GPIOX (1,8/3,3 V) : préférer 3,3 V.
- Confondre avec le bus caméra (alias i2c0 du carrier) : le scan y sera vide.
Autres tutoriels pour cette carte
- Monter le module BPI-CM4 sur son carrier et réussir le premier boot
- Apprivoiser les LED et la touche ADC du carrier CM4IO
- Mesurer le stockage du BPI-CM4 : eMMC, microSD et le palier NVMe
- Activer I2C, SPI et UART sur le BPI-CM4 : env.txt ou armbianEnv.txt
- Déplacer le rootfs sur un SSD NVMe via le port mini-PCIe
- Exploiter le NPU 5 TOPS de l'A311D pour l'inférence embarquée
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash