🛠 Surveiller température et fréquence du BCM2835
Objectifs
Mettre en place une surveillance continue du SoC BCM2835 : température, fréquence ARM courante et indicateur de bridage (throttling). Le firmware bride le CPU au-delà de 85 °C ou en cas de sous-tension détectée — sans coupure franche documentée pour cette carte. Vous allez utiliser vcgencmd, journaliser dans une base de texte et interpréter le drapeau get_throttled bit à bit.
Matériel
- Raspberry Pi Model B Rev 1 (avec ou sans dissipateur/boîtier — comparez !)
- Image legacy 32 bits avec
raspberrypi-firmware(vcgencmd préinstallé) - Charge de test :
sudo apt install -y stress(optionnel, pour provoquer le bridage) - Accès SSH (voir le tutoriel Ethernet) pour suivre les journaux à distance.
Code complet
#!/bin/sh
# surveil.sh - journalise temperature, clock et drapeau de bridage
# format: horodatage;temp_c;arm_hz;throttled_hex
while true; do
T=$(vcgencmd measure_temp | sed 's/temp=//;s/.C//')
C=$(vcgencmd measure_clock arm | cut -d= -f2)
V=$(vcgencmd get_throttled | cut -d= -f2)
echo "$(date -Is);${T};${C};${V}" >> /var/log/pisoc.csv
sleep 30
done
# Lecture rapide :
# vcgencmd measure_temp -> 'temp=52.3'C (bridage au-dela de 85 C)
# vcgencmd measure_clock arm -> 700000000 au repos nominal
# vcgencmd get_throttled -> 0x0 = rien a signaler
# bit 0 sous-tension | bit 2 sous-tension subie | bit 3 bridage thermique
# bit 4 bridage sous-tension | bits 16-19 = memoire des événements passes
# Provoquer la montee (test seulement, 256 MB de RAM : pas de stress --vm) :
stress --cpu 1 --timeout 120
Vérification attendue
tail -f /var/log/pisoc.csv défile avec des températures cohérentes (30-60 °C au repos selon boîtier). Pendant stress --cpu 1, la température monte et la fréquence mesurée peut baisser sous 700 MHz si le seuil de 85 °C est atteint ; get_throttled affiche alors un drapeau non nul avec le bit 3 (bridage thermique) ou le bit 0 (sous-tension) positionné.
Erreurs fréquentes
- Interpréter get_throttled en décimal : c'est un hexadécimal masqué, lire bit à bit (0x50000 = événements passés mémorisés, pas un problème actif).
- Confondre sous-tension et surchauffe : un drapeau 0x1 vient de l'alimentation (polyfuse F1, chargeur faible), pas du dissipateur.
vcgencmd: command not found: firmware absent de l'image (images tierces ARMv6 minimales).- Stress test trop agressif sur 256 MB : le OOM tue des processus avant que la thermique soit intéressante.
- Ajouter
over_voltagepour gagner des MHz sans surveiller les drapeaux : le bridage sous-tension annule tout le bénéfice.
Autres tutoriels pour cette carte
- Allumer une LED via le GPIO avec libgpiod
- Lire un bouton poussoir et afficher l'état dans la console
- Premier script Python : faire clignoter la LED
- Variation d'intensité LED avec le PWM matériel (et son piège)
- Lire un capteur I2C (température/humidité) sur le bus 1
- Configurer l'Ethernet 10/100 et piloter le Pi en SSH
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython