🛠 Surveiller température et bridage : le BCM2835 à l'épreuve
Objectifs
Mettre en place une surveillance continue du SoC : température, fréquence réelle et surtout le registre de bridage du firmware, qui signale aussi les sous-tensions. Le BCM2835 du Model B+ est cadencé à 700 MHz et le firmware bride au-delà de 85 °C ou en cas d'alimentation trop faible — savoir le détecter avant les coupures.
Matériel
- Raspberry Pi Model B+ sous Raspberry Pi OS legacy 32 bits, en Ethernet (tuto réseau)
- Alimentation 5 V de qualité ; dissipateurs ou boîtier ventilé en option
- Charge de test : sysbench ou une simple boucle de calcul
Code complet
# Lecture ponctuelle
cat /sys/class/thermal/thermal_zone0/temp # milli-°C
vcgencmd measure_temp # °C format humain
vcgencmd measure_clock arm # fréquence courante (Hz)
vcgencmd get_throttled # 0x0 = rien à signaler
# Interprétation de get_throttled (masques) :
# bit0 sous-tension | bit3 bridage sous-température | bit5 bridage fréquence
# bit6 bridage sous-tension | bits 16-19 = événements passés depuis le boot
# Journal de surveillance toutes les 30 s, 24 h
timeout 86400 sh -c 'while :; do
echo "$(date -Is) $(cat /sys/class/thermal/thermal_zone0/temp) $(vcgencmd measure_clock arm | cut -d= -f2) $(vcgencmd get_throttled | cut -d= -f2)"
sleep 30
done' > /var/log/thermal.csv
# Charge de test dans un autre terminal
yes > /dev/null & # puis tuer : kill %1
Vérification attendue
Au repos, le capteur reste typiquement sous 50 °C et get_throttled renvoie 0x0. Sous « yes », la température monte vers le seuil de 85 °C et measure_clock peut descendre sous 700 MHz avec le bit de bridage qui s'allume. Un 0x50000 ou 0x50005 dénote une sous-tension : le problème est l'alimentation, pas le refroidissement.
Erreurs fréquentes
- Croire à un CPU défectueux quand get_throttled affiche un bit sous-tension : changer d'abord câble et chargeur micro-USB.
- Lire le registre une seule fois : les bits 16-19 sont mémorisés depuis le boot, il faut surveiller l'évolution dans le temps.
- Overclocker un B+ à 1 GHz comme un Pi 3 : l'ARM1176JZF-S ne le supporte pas ; gains faibles, instabilité garantie.
- Oublier que les 512 Mo de RAM sont partagés avec le GPU : le bridage mémoire arrive avant le bridage thermique dans les usages graphiques.
- Encastrer la carte dans un boîtier fermé sans aération : la convection du design nu ne fait plus rien.
Autres tutoriels pour cette carte
- Allumer une LED depuis la GPIO 17 avec libgpiod
- Lire un bouton et afficher les appuis dans la console
- Premier script Python : faire clignoter la LED
- Variation d'intensité d'une LED avec le PWM matériel (GPIO18)
- Interroger un capteur I2C (BME280) sur le bus du 40 broches
- Mettre le B+ en réseau par Ethernet et piloter en SSH
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython