🛠 Lire un capteur I²C (BME280) sur le bus i2c-1 du connecteur Pi-2
Objectifs
Sur les images mainline de la PINE A64, le bus i2c-1 est activé d'office dans le device tree (&i1c1 avec le groupe de broches i2c1_pins sur PH2/PH3 du connecteur Pi-2, pull-ups inclus) : un capteur I²C fonctionne sans overlay. Tu vas câbler un BME280 (température/pression/humidité), le détecter avec i2cdetect, et le lire en Python via smbus2 — en comprenant la numérotation : PH2 = (H−A)×32 + 2 = 226, PH3 = 227, si tu dois rejouer la config pinctrl à la main.
Matériel
- 1 × PINE A64/A64+ sous Armbian mainline
- 1 × module BME280 (adresse 0x76 par défaut, 0x77 si CSB est au niveau haut)
- Alimentation du capteur en 3,3 V (logique du connecteur en 3,3 V)
sudo apt install i2c-tools python3-smbus2(paquetpython3-smbusselon les versions)
Code complet
# 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.
Vérification attendue
i2cdetect -r 1 affiche 76 : le bus i2c-1 existe, les pull-ups du DTS font leur travail, le capteur répond. Le script Python imprime les 6 octets bruts de pression (registres 0xF7–0xFC) qui varient quand on presse le capteur du doigt. Le test d'identité (0xD0 = 0x52) valide la liaison avant toute mesure — l'assertion échoue bruyamment si le câblage est faux.
Erreurs fréquentes
- Câbler sur les broches « I2C » d'un mémo Raspberry Pi : le connecteur Pi-2 n'a pas le pinnage RPi — sur la PINE A64, I2C1 est sur PH2/PH3 (offsets 226/227), et l'UART2 du même connecteur est sur PB0/PB1.
- Scanner le mauvais bus :
i2cdetect -ld'abord ; c'est le bus 1 que le device tree active, pas forcément le 0. - Alimentation 5 V sur un module BME280 3,3 V : la logique du connecteur est en 3,3 V — alimenter et parler en 3,3 V.
- Adresse introuvable : vérifier 0x77 (CSB monté), l'inversion SDA/SCL, et la masse commune ; un module sans pull-ups propres sur une longue maquette ne répond pas.
- Attendre un ADC sur le connecteur : le A64 a un TPADC/LRADC mais il n'est pas routé vers le connecteur 40 broches — pour de l'analogique, passer par un ADC I²C (PCF8591, ADS1115).
- En C SDK ou en Python, oublier que le bus peut être occupé : un démon (i2c-mux, drivers kernel) accaparant l'adresse fait échouer
read_byte_datasans message clair.
Autres tutoriels pour cette carte
- 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)
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash