🛠 Lire un capteur BME280 en I2C sur le CM3
Objetivos
Activar y utilizar el bus I2C del CM3 (el BCM2837 expone dos en el SODIMM) para leer un sensor de temperatura/humedad/presión BME280. Aprenderás a activar el bus mediante config.txt, a escanear el bus con i2cdetect y a leer registros en Python con smbus. Atención: el CM3 no tiene ningún ADC interno (hoja de datos RP-008161-DS §2) — cualquier sensor analógico debe pasar por un convertidor externo en I2C o SPI.
Material
- CM3 sobre CMIO3, Raspberry Pi OS iniciado
- Sensor BME280 (I2C, dirección 0x76 o 0x77 según el pin SDO)
- Cables: SDA a GPIO2, SCL a GPIO3, VCC a 3,3 V, GND (lógica de 3,3 V si el banco bank0 está en VREF 3,3 V como en la CMIO3)
Código completo
# 1. Activer I2C : ajouter dans /boot/firmware/config.txt (ou via raspi-config)
# dtparam=i2c_arm=on
sudo reboot
# 2. Outils et scan du bus
sudo apt install -y i2c-tools python3-smbus
sudo i2cdetect -y 1 # doit afficher 76 (ou 77)
#!/usr/bin/env python3
# bme280.py — lecture brute des registres
import time, smbus
BUS = smbus.SMBus(1) # /dev/i2c-1 (contrôleur « arm »)
ADDR = 0x76
BUS.write_byte_data(ADDR, 0xF4, 0x2F) # ctrl_meas : temp+pression, oversampling x16
time.sleep(0.1)
hi, lo = BUS.read_i2c_block_data(ADDR, 0xFA, 2) # regs 0xFA/0xFB : température 20 bits
print('code brut température :', ((hi << 8) | lo) >> 4)
# En pratique, utiliser la couche haute niveau (paquet pip bmp280 par exemple).
Verificación esperada
sudo i2cdetect -y 1 muestra la dirección 76 (o 77) del sensor. El script imprime un código bruto que cambia cuando se calienta el sensor con el dedo. Con la biblioteca de alto nivel, la temperatura, la presión y la humedad se muestran en unidades físicas.
Errores frecuentes
- Olvidar
dtparam=i2c_arm=ony luego reiniciar:/dev/i2c-1no existe, smbus lanza un error FileNotFoundError. - Dirección 0x77 no encontrada: el pin SDO del módulo sensor está cableado al revés (algunos módulos cambian la dirección predeterminada).
- Alimentar el sensor con 5 V en un banco GPIO de 1,8 V: los pines I2C son tolerantes a la tensión de su banco, no más allá — verificar el riel VREF.
- Confundir i2c0 (GPIO0/1) e i2c_arm (GPIO2/3): el bus «arm» es el de los pines 2/3 de la CMIO3.
- Esperar un sensor analógico directo: sin ADC en el SoC, prever un MCP3008 (SPI) o un sensor digital.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash