🛠 Lire un capteur sur le bus I2C
Objectifs
Connecter un capteur I2C classique (par ex. BME280 ou BMP280, température/humidité/pression) sur l'ODROID-N2 et lire ses mesures en Python. Le connecteur 40 broches expose 2 bus I2C (spécifications CNX) ; le RTC interne PCF8563 occupe déjà I2C3, ce qui sert de témoin de bus fonctionnel.
Matériel
- ODROID-N2/N2+ sous Armbian
- Capteur I2C BME280 (adresse 0x76 ou 0x77) + 4 câbles Dupont
- Broches SDA/SCL du connecteur (repérer le bus I2C exposé sur le header) >
sudo apt install i2c-tools python3-smbus
Code complet
# 1. Activer I2C (Armbian : armbian-config > System > Hardware, ou overlays=
# i2c0/i2c1 dans le config). 2. Scanner le bus :
sudo i2cdetect -y 0 # bus 0 — le RTC PCF8563 doit apparaître en 51
sudo i2cdetect -y 1 # bus 1 — le capteur doit apparaître en 76 ou 77
#!/usr/bin/env python3
"""bme280.py — lecture brute des registres température/pression (bus 1)."""
import smbus, time
BUS = smbus.SMBus(1); ADDR = 0x76
BUS.write_byte_data(ADDR, 0xD0, 0x00) # soft reset
BUS.write_byte_data(ADDR, 0xF4, 0x27) # capteur forcé, x16/x1
BUS.write_byte_data(ADDR, 0xF5, 0xA0) # mode forcé
def read2(reg):
l, h = BUS.read_i2c_block_data(ADDR, reg, 2)
return (h << 8) | l
# Calibration (registres 0x88..0xA1, tronqué pour l'exemple)
t1 = read2(0x88); p1 = read2(0x8E)
while True:
BUS.write_byte_data(ADDR, 0xF4, 0x27)
time.sleep(0.1)
adc_t = int.from_bytes(BUS.read_i2c_block_data(ADDR, 0xFA, 3), 'big') >> 6
temp = adc_t / 5120.0 - 50.0 # approximation datasheet
print(f"T ≈ {temp:5.1f} °C (adc_t={adc_t}, t1={t1}, p1={p1})")
time.sleep(2)
Vérification attendue
i2cdetect -y 1 affiche 76 (ou 77) à la place du pointillés. Le script imprime une température cohérente avec la pièce (15–30 °C) toutes les 2 s. i2cdetect -y 0 montre 51 : le RTC PCF8563 embarqué, preuve que le contrôleur I2C fonctionne.
Erreurs fréquentes
- Bus I2C non activé : aucun périphérique détecté sur le bus du header ; activer l'overlay et redémarrer.
- Mauvais numéro de bus : le header n'est pas forcément sur i2c-1 ; tester
i2cdetect -lpuis chaque bus. - Adresse 0x76 vs 0x77 : selon la broche SDO du module ; lire le silkscreen du module.
- Pull-ups absentes sur un capteur nu (non module) : lignes flottantes, adresses qui sautent ; ajouter 4,7 kΩ vers 3,3 V.
- Conflit avec le RTC : ne pas confondre 0x51 (PCF8563, bus interne) avec son capteur.
- >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash