8x32 PI : séquences jusqu'à 120 PNG, test du fil de données, montage A validé
- serveur_web.py : séquences limitées à 120 PNG (message clair au-delà), envois jusqu'à 200 Mo, fichiers temporaires sur la carte SD (et plus dans /run, trop petit), garde-fou si une séquence est envoyée dans le cadre « fichiers séparés ». - outils/test_fil_donnees.py : met GPIO 18 à 1 puis à 0 toutes les 10 s, pour suivre le signal au multimètre du Pi jusqu'à DIN. - README : montage A (Pi en direct, LED en 4,4 V) testé et validé ; montage B (transistor 2N3904) déconseillé, trop lent (temps de stockage ≈ 0,2 µs face à un « 0 » de 0,4 µs) ; mise en garde sur les convertisseurs HV/LV ; dépannage « seule la 1re LED s'allume ». - INTERFACE_WEB.md, CLAUDE.md : nouvelles limites, accès au Pi en Wi-Fi seul, lecteur activé au démarrage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
=============================================================================
|
||||
TEST DU FIL DE DONNÉES AU MULTIMÈTRE
|
||||
Workshop « Vitrine pixels »
|
||||
=============================================================================
|
||||
|
||||
Quand la matrice ne s'allume pas du tout, il faut savoir OÙ le signal se
|
||||
perd : à la sortie du Pi ? dans le convertisseur de niveau ? dans un fil ?
|
||||
|
||||
Le vrai signal des LED est beaucoup trop rapide pour un multimètre
|
||||
(800 000 bits par seconde). Ce programme transforme donc la patte 12
|
||||
(GPIO 18) en simple interrupteur LENT :
|
||||
|
||||
10 secondes à « 1 » (3,3 V à la sortie du Pi)
|
||||
10 secondes à « 0 » (0 V)
|
||||
… et on recommence, pendant 2 minutes (Ctrl + C pour arrêter).
|
||||
|
||||
Pendant ce temps, on mesure au multimètre (calibre 20 V continu, pointe
|
||||
NOIRE sur un GND, pointe ROUGE sur le point à tester) :
|
||||
|
||||
Point mesuré pendant « 1 » pendant « 0 »
|
||||
------------------------------------------- ------------- -------------
|
||||
1. patte 12 du Pi (GPIO 18) ≈ 3,3 V 0 V
|
||||
2. entrée du convertisseur (côté 3,3 V) ≈ 3,3 V 0 V
|
||||
3. sortie du convertisseur (côté 5 V) ≈ 5 V 0 V (*)
|
||||
4. après la résistance de 330 Ω ≈ 5 V 0 V (*)
|
||||
5. fil VERT de la fiche, au plus près de DIN ≈ 5 V 0 V (*)
|
||||
|
||||
(*) Avec le montage A (sans convertisseur, matrice en 4,4 V) : 3,3 V.
|
||||
Avec le montage B (transistor) : INVERSÉ, ≈ 5 V pendant « 0 » et
|
||||
0 V pendant « 1 ». C'est normal.
|
||||
|
||||
Le premier point où la mesure est fausse indique la panne : le problème se
|
||||
trouve entre ce point et le précédent.
|
||||
|
||||
Et aussi, sans rien lancer :
|
||||
- entre le 5V et le GND des fils du MILIEU de la matrice : 5,0 V (ou 4,4 V) ;
|
||||
- entre le GND du Pi et le GND de la matrice : 0 V (sinon, masse pas commune).
|
||||
|
||||
Lancer (le lecteur ne doit pas tourner en même temps) :
|
||||
sudo systemctl stop vitrine-pixels
|
||||
sudo ~/vitrine-env/bin/python outils/test_fil_donnees.py
|
||||
|
||||
Le prochain programme qui affiche sur la matrice remettra tout seul la
|
||||
patte 12 dans son mode normal.
|
||||
"""
|
||||
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
BROCHE = "18"
|
||||
DUREE_ETAT = 10 # secondes à « 1 », puis à « 0 »
|
||||
DUREE_TOTALE = 120 # secondes
|
||||
|
||||
|
||||
def regler(niveau):
|
||||
"""Met la patte en sortie, à 1 (dh = « drive high ») ou à 0 (dl)."""
|
||||
# « raspi-gpio » sur Raspbian 11, « pinctrl » sur les systèmes plus récents.
|
||||
outil = "raspi-gpio" if shutil.which("raspi-gpio") else "pinctrl"
|
||||
subprocess.run([outil, "set", BROCHE, "op", "dh" if niveau else "dl"], check=True)
|
||||
|
||||
|
||||
def main():
|
||||
print(__doc__.split("Lancer")[0])
|
||||
debut = time.monotonic()
|
||||
niveau = 1
|
||||
try:
|
||||
while time.monotonic() - debut < DUREE_TOTALE:
|
||||
regler(niveau)
|
||||
print(f"{time.strftime('%H:%M:%S')} patte 12 à « {niveau} » "
|
||||
f"({'≈ 3,3 V' if niveau else '0 V'} à la sortie du Pi)")
|
||||
sys.stdout.flush()
|
||||
time.sleep(DUREE_ETAT)
|
||||
niveau = 1 - niveau
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
finally:
|
||||
regler(0)
|
||||
print("Terminé : patte 12 à 0.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user