🛠 Lire un capteur sur le bus I2C
Objetivos
Activar el bus I2C0 de la Raspberry Pi 2, escanear el bus para encontrar la dirección de un sensor y luego leer sus mediciones desde Python. I2C solo requiere dos hilos (SDA, SCL) compartidos entre varios dispositivos, cada uno con una dirección; esta es la base de la mayoría de los sensores comerciales.
Material
- Raspberry Pi 2 Model B con Raspberry Pi OS de 32 bits
- 1 sensor I2C (por ejemplo, BME280 o BMP280: temperatura/presión)
- 4 cables jumper: 3,3 V, GND, SDA (GPIO2, pin 3), SCL (GPIO3, pin 5)
- Paquetes: sudo apt install i2c-tools python3-smbus
Código completo
# 1. Activer I2C : sudo raspi-config -> Interface -> I2C, ou :
sudo sed -i 's/^#*dtparam=i2c_arm=.*/dtparam=i2c_arm=on/' /boot/config.txt
sudo reboot
# 2. Scanner le bus : le capteur doit apparaitre (ex. 0x76 ou 0x77)
i2cdetect -y 1
#!/usr/bin/env python3
"""lire_capteur.py — lecture brute d'un registre I2C."""
import smbus
import time
BUS = smbus.SMBus(1)
ADRESSE = 0x76 # adresse renvoyee par i2cdetect
REG_ID = 0xD0 # registre « chip id » (BMP/BME280)
chip_id = BUS.read_byte_data(ADRESSE, REG_ID)
print(f"Chip ID lu a 0x{ADRESSE:02X} : 0x{chip_id:02X}")
for _ in range(5):
t = BUS.read_byte_data(ADRESSE, 0xFA) # octet haut de temperature
print(f"Brut temperature (octet haut) : {t}")
time.sleep(1)
Verificación esperada
i2cdetect -y 1 muestra una cuadrícula; la dirección del sensor aparece claramente (nunca 0x03 ni 0x70, reservadas). El script de Python muestra un chip id distinto de cero (0x60 para BME280, 0x50/0x51 para BMP280) y luego cinco lecturas separadas por un segundo. Un 0x00 en todas partes indica un cableado o una dirección incorrectos.
Errores frecuentes
- I2C no activado: sin
dtparam=i2c_arm=ony reinicio,/dev/i2c-1no existe. - Bus incorrecto: es el bus 1 (
i2cdetect -y 1), no el bus 0. - Sensor alimentado a 5 V en un módulo sin regulador: la lógica I2C del Pi es de 3,3 V; la mayoría de los módulos breakout lo aceptan, otros no.
- Dirección 0x76 o 0x77: depende del strap ADDR; prueba ambas si
i2cdetectsolo muestra una.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython