🛠 Lire un capteur BME280 en I2C sur le CM3
Objectifs
Activer et utiliser le bus I2C du CM3 (le BCM2837 en expose deux sur le SODIMM) pour lire un capteur de température/humidité/pression BME280. Vous apprendrez à activer le bus via config.txt, à scanner le bus avec i2cdetect, et à lire des registres en Python avec smbus. Attention : le CM3 n'a aucun ADC interne (datasheet RP-008161-DS §2) — tout capteur analogique passe par un convertisseur externe en I2C ou SPI.
Matériel
- CM3 sur CMIO3, Raspberry Pi OS démarré
- Capteur BME280 (I2C, adresse 0x76 ou 0x77 selon la broche SDO)
- Câbles : SDA vers GPIO2, SCL vers GPIO3, VCC vers 3,3 V, GND (logique 3,3 V si la banque bank0 est en VREF 3,3 V comme sur la CMIO3)
Code complet
# 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).
Vérification attendue
sudo i2cdetect -y 1 affiche l'adresse 76 (ou 77) du capteur. Le script imprime un code brut qui évolue quand on réchauffe le capteur du doigt. Avec la bibliothèque haute niveau, température, pression et humidité s'affichent en unités physiques.
Erreurs fréquentes
- Oublier
dtparam=i2c_arm=onpuis redémarrer :/dev/i2c-1n'existe pas, smbus lève une erreur FileNotFoundError. - Adresse 0x77 non trouvée : la broche SDO du module capteur est câblée à l'envers (certains modules changent l'adresse par défaut).
- Nourrir le capteur en 5 V sur une banque GPIO en 1,8 V : les broches I2C sont tolérantes à la tension de leur banque, pas au-delà — vérifier le rail VREF.
- Confondre i2c0 (GPIO0/1) et i2c_arm (GPIO2/3) : le bus « arm » est celui des broches 2/3 de la CMIO3.
- Attendre un capteur analogique direct : sans ADC sur le SoC, prévoir un MCP3008 (SPI) ou un capteur numérique.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash