🛠 Brancher un capteur BME280 sur l'I2C1 du carrier (GPIOX_17/18)
Objetivos
Montar un sensor de temperatura/humedad/presión BME280 en el bus I2C1 del carrier, cableado en GPIOX_17 (SDA, pin 3) y GPIOX_18 (SCL, pin 5) según la tabla de pines del BPI-CM4IO. Activarás el controlador (tuto overlays), resolverás el número real del bus (el controlador &i2c2 mainline no tiene alias), escanearás el bus, verificarás el identificador del chip (0x60) y luego leerás la temperatura bruta en Python mediante i2c-dev — método idéntico en el BSP 4.9 y en Armbian.
Material
- BPI-CM4 + carrier bajo Armbian (bus activado, ver el tuto overlays) o imagen del fabricante con overlays="i2c2"
- Módulo BME280 en modo I2C (dirección 0x76 por defecto, 0x77 si el pin ADDR está en nivel alto)
- 4 cables Dupont macho-hembra; alimentar el módulo a 3,3 V
Código completo
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}")
Verificación esperada
i2cdetect muestra 76 en el bus del header; el script imprime chip ID 0x60; al soplar sobre el sensor, el valor bruto del registro de 20 bits baja regularmente. Para obtener un valor físico completo, lee los coeficientes de calibración (bloques 0x88-0xA1 y 0xE1-0xE7) y aplica la compensación del datasheet de Bosch, o utiliza una biblioteca BME280 existente.
Errores frecuentes
- Usar /dev/i2c-2 «porque es i2c2»: en mainline, el número de enumeración no necesariamente corresponde al controlador del header — verifica mediante /sys/class/i2c-dev/.
- Olvidar el overlay: i2cdetect -l no mostrará entonces ningún controlador del header.
- Módulo en 0x77 (ADDR cableado en alto) mientras que el script lee 0x76.
- Alimentar a 5 V un módulo cuyo nivel lógico sigue la banca GPIOX (1,8/3,3 V): prefiere 3,3 V.
- Confundirlo con el bus de la cámara (alias i2c0 del carrier): el escaneo allí estará vacío.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash