🛠 Lire un capteur sur le bus I2C
Objetivos
Conectar un sensor I2C clásico (por ejemplo, BME280 o BMP280, temperatura/humedad/presión) al ODROID-N2 y leer sus medidas en Python. El conector de 40 pines expone 2 buses I2C (especificaciones CNX); el RTC interno PCF8563 ya ocupa I2C3, lo que sirve como indicador de un bus funcional.
Material
- ODROID-N2/N2+ con Armbian
- Sensor I2C BME280 (dirección 0x76 o 0x77) + 4 cables Dupont
- Pines SDA/SCL del conector (identificar el bus I2C expuesto en el header) >
sudo apt install i2c-tools python3-smbus
Código completo
# 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)
Verificación esperada
i2cdetect -y 1 muestra 76 (o 77) en lugar de puntos suspensivos. El script imprime una temperatura coherente con la habitación (15–30 °C) cada 2 s. i2cdetect -y 0 muestra 51: el RTC PCF8563 integrado, prueba de que el controlador I2C funciona.
Errores frecuentes
- Bus I2C no activado: no se detecta ningún dispositivo en el bus del header; activar el overlay y reiniciar.
- Número de bus incorrecto: el header no está necesariamente en i2c-1; probar
i2cdetect -ly luego cada bus. - Dirección 0x76 vs 0x77: según el pin SDO del módulo; leer la serigrafía del módulo.
- Ausencia de resistencias de pull-up en un sensor desnudo (no módulo): líneas flotantes, direcciones que saltan; añadir 4,7 kΩ hacia 3,3 V.
- Conflicto con el RTC: no confundir 0x51 (PCF8563, bus interno) con su sensor.
- >
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