🛠 Lire un capteur I2C (BMP280) depuis le bus du connecteur
Objectifs
Activer et explorer un bus I2C de l'Orange Pi 5 Plus, balayer le bus avec i2cdetect, puis lire un capteur BMP280 (température + pression, adresse 0x76 ou 0x77) en Python avec smbus2. Le connecteur 40 broches multiplexe l'I2C parmi UART/SPI/CAN/PWM ; en interne, le PMIC RK806-1 est sur SPI et les régulateurs RK8602/RK8603 sont déjà sur I2C — le contrôleur relié au connecteur doit être vérifié sur votre image.
Matériel
- Orange Pi 5 Plus (Armbian ou image Orange Pi OS)
- Capteur BMP280 (module I2C, adresse 0x76 par défaut)
- 4 jumpers : SDA, SCL, 3,3 V, GND — jamais 5 V sur un capteur 3,3 V non tolérant
sudo apt install -y i2c-tools python3-smbus2(paquet python3-smbus selon la distribution)
Code complet
# 1. Lister les contrôleurs I2C puis balayer le bus du connecteur
i2cdetect -l
i2cdetect -y 1 # adapter N ; le BMP280 apparaît à 76 (ou 77)
# Lecture brute en shell :
sudo i2cget -y 1 0x76 0xd0 # doit répondre 0x58 (ID du BMP280)
#!/usr/bin/env python3
"""Lecture BMP280 sur i2c-1 (adapter le numéro de bus)."""
import smbus2, struct, time
BUS, ADDR = 1, 0x76
bus = smbus2.SMBus(BUS)
assert bus.read_byte_data(ADDR, 0xD0) == 0x58, "BMP280 introuvable"
# Calibration (registres 0x88..0xA1)
cal = bus.read_i2c_block_data(ADDR, 0x88, 24)
dig_T1, dig_T2, dig_T3 = struct.unpack("<Hhh", bytes(cal[0:6]))
bus.write_byte_data(ADDR, 0xF4, 0x27) # mode forcé, oversampling x16/x1
bus.write_byte_data(ADDR, 0xF5, 0xA0) # standby 1000 ms, filtre x16
time.sleep(0.1)
raw = bus.read_i2c_block_data(ADDR, 0xF7, 6)
adc_p, adc_t = struct.unpack(">HH", bytes(raw[0:4]))
# Compensation température simplifiée du datasheet
var1 = (adc_t / 16384.0 - dig_T1 / 1024.0) * dig_T2
var2 = ((adc_t / 131072.0 - dig_T1 / 8192.0) ** 2) * dig_T3
t_fine = var1 + var2
temp = (t_fine * 5.12) / 100.0
print(f"Température : {temp:.1f} °C (ADC pression brut : {adc_p})")
Vérification attendue
i2cdetect -y N affiche « 76 » dans la grille ; i2cget ... 0xd0 renvoie 0x58 ; le script Python imprime une température cohérente avec la pièce (15 à 30 °C). Pour la pression, préférez la bibliothèque Adafruit_BMP280 (pip) qui implémente la compensation complète.
Erreurs fréquentes
- Bus non activé dans le device-tree :
i2cdetect -lne montre pas de bus relié au connecteur ; sur image Orange Pi, activer le contrôleur viasudo orangepi-config(System → Hardware) puis redémarrer. - Mauvais numéro de bus entre brochage physique et /dev/i2c-N : balayer chaque bus listé par i2cdetect -l.
- Capteur alimenté en 5 V sur des lignes 3,3 V ou SDA/SCL inversés : aucune adresse ne répond.
- >
Autres tutoriels pour cette carte
- Allumer une LED via le GPIO 40 broches (libgpiod)
- Lire un bouton poussoir et afficher dans la console
- Premier script Python : fiche signalétique de la carte et LED
- Variation d'intensité d'une LED avec PWM (sysfs pwm)
- Exploiter le double Ethernet 2,5 GbE et sécuriser le SSH
- Booter sur NVMe (M.2 PCIe 3.0 x4) et récupérer une carte brique via MaskROM
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash