#!/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()