🛠 Lire un capteur I²C (BME280) sur le bus i2c-1 du connecteur Pi-2
Objetivos
En las imágenes mainline de la PINE A64, el bus i2c-1 está activado de forma predeterminada en el device tree (&i1c1 con el grupo de pines i2c1_pins en PH2/PH3 del conector Pi-2, incluyendo resistencias de pull-up): un sensor I²C funciona sin necesidad de overlay. Vas a conectar un BME280 (temperatura/presión/humedad), detectarlo con i2cdetect y leerlo en Python mediante smbus2 — comprendiendo la numeración: PH2 = (H−A)×32 + 2 = 226, PH3 = 227, si necesitas reproducir la configuración pinctrl manualmente.
Material
- 1 × PINE A64/A64+ con Armbian mainline
- 1 × módulo BME280 (dirección 0x76 por defecto, 0x77 si CSB está a nivel alto)
- Alimentación del sensor a 3,3 V (la lógica del conector es de 3,3 V)
sudo apt install i2c-tools python3-smbus2(paquetepython3-smbussegún las versiones)
Código completo
# Lister les bus puis scanner le bus 1 (&i2c1 activé dans le DTS) :
i2cdetect -l
i2cdetect -r 1 # doit afficher 76 (ou 77)
#!/usr/bin/env python3
"""Lecture brute d'un BME280 sur i2c-1 (broches PH2/PH3 du connecteur Pi-2)."""
import smbus2, time
BUS = 1 # &i2c1 est activé dans sun50i-a64-pine64.dts
ADDR = 0x76 # 0x77 si la broche CSB est tirée à 1
bus = smbus2.SMBus(BUS)
assert bus.read_byte_data(ADDR, 0xD0) in (0x52, 0x53), "pas de BME280 (id?)"
bus.write_byte_data(ADDR, 0xF4, 0x27) # temp x1, press x1, mode normal
bus.write_byte_data(ADDR, 0xF5, 0x00) # veille 1 Hz
time.sleep(0.1)
print("octets bruts pression:", bus.read_i2c_block_data(ADDR, 0xF7, 6))
# Pour des unités lisibles, utiliser un driver (adafruit-blinka, bme280-i2c) ;
# les formules de compensation complètes sont dans la datasheet BME280.
Verificación esperada
i2cdetect -r 1 muestra 76: el bus i2c-1 existe, las resistencias de pull-up del DTS están funcionando y el sensor responde. El script de Python imprime los 6 bytes sin procesar de la presión (registros 0xF7–0xFC) que varían cuando se presiona el sensor con el dedo. La prueba de identidad (0xD0 = 0x52) valida la conexión antes de cualquier medición — la aserción falla ruidosamente si el cableado es incorrecto.
Errores frecuentes
- Conectar en los pines «I2C» de una referencia Raspberry Pi: el conector Pi-2 no tiene el pinout RPi — en la PINE A64, I2C1 está en PH2/PH3 (desplazamientos 226/227), y el UART2 del mismo conector está en PB0/PB1.
- Escanear el bus equivocado: ejecuta primero
i2cdetect -l; es el bus 1 el que activa el device tree, no necesariamente el 0. - Alimentar con 5 V un módulo BME280 de 3,3 V: la lógica del conector es de 3,3 V — alimenta y comunica a 3,3 V.
- Dirección no encontrada: verifica 0x77 (CSB conectado a alto), la inversión de SDA/SCL y la masa común; un módulo sin resistencias de pull-up adecuadas en una protoboard larga no responde.
- Esperar un ADC en el conector: el A64 tiene un TPADC/LRADC pero no está enrutado al conector de 40 pines — para señales analógicas, utiliza un ADC I²C (PCF8591, ADS1115).
- En C SDK o en Python, olvidar que el bus puede estar ocupado: un demonio (i2c-mux, drivers del kernel) que acapara la dirección hace que
read_byte_datafalle sin un mensaje claro.
Otros tutoriales para esta placa
- Premier boot d'Armbian sur la PINE A64 (microSD, console série, rootfs)
- PINE A64 ou PINE A64+ ? Le pièg du réseau gigabit dès le premier regard
- Faire clignoter une LED avec libgpiod (numérotation GPIO du A64 : PB0 = 32)
- Benchmark Ethernet iperf3 : mesurer le piège 10/100 vs gigabit
- Un serveur maison qui consomme 2,5 W : Docker léger sur la PINE A64
- Construire sa propre image Armbian pour la PINE A64 (armbian/build)
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash