Cela se produisant sur les deux écrans achetés, les clients ont immédiatement pensés à un problème matériel...
Seulement voila, tous les produits Raspberry-Pi sont testés sur chaîne de production. Il est donc peu probable d'avoir un produit défectueux, ... deux produits défectueux en même temps, c'est le signe qu'il faut chercher une cause environnemental!
Le source du problème
Hypersensibilité de la dalle tactile
La dalle tactile fonctionne par effet capacitif. Quelques capteurs répartis sur la dalle essayent de mesurer le courant de fuite qui s'échappe par par le doigt lorsque celui-ci touche l'écran.
Ce dispositif, par nature, est donc très sensible aux problèmes d'alimentations et aux boucles de courants.
Tout problème de masse, aussi minime soit-il, aura une répercussion immédiate sur la partie tactile.
Après des recherches sur les Forums Raspberry-Pis, voici les suggestions trouvées:
Vérifier les masses (masse commune)
Vérifier l'alimentation, sinon vérifier l'alimentation et après encore vérifier l'alimentation.
Cette dernière proposition est plus que bien indiquée.
Démonstration en vidéo
La vidéo ci-dessous présente un test complémentaire réalisé sur l'un des écrans.
Première partie de la vidéo:
Seule la surface tactile est touchée => problèmes est bien présents.
Seconde partie de la vidéo:
Le client touche aussi la partie métallique à l'arrière de l'écran. Il porte donc le potentiel de la masse de l'écran au même potentiel que son propre corps => l'écran fonctionne parfaitement.
C'est donc bien un problème de masse!
La solution
Après de multiples tests, le client à brancher une alimentation redondante entre le GPIO et le connecteur d'alimentation de l'écran.
Ce faisant, l'alimentation est plus stable (section supérieure des fils) ainsi qu'une meilleure ligne de masse => c'est réglé.
Petit retour sur notre projet de carte contrôleur MyDin en cours de développement.
Le dernier article sur le sujet détaillait les deux cartes principales, leurs fonctionnalités et détails techniques.
La bibliothèque MicroPython et les tests avancent rapidement. Cet article s'attarde un peu sur le montage dans le boîtier Din.
Un peu d'impression 3D
Deux pièces supplémentaires ont été imprimées pour maintenir la carte contrôleur bien en place.
MyDin - carte contrôleur DINCASE-MB3PICO
Elément qui vient se placer comme ci-dessous sur la carte contrôleur.
MyDin - carte contrôleur DINCASE-MB3PICO
Test d'assemblage
Il faut préalablement équiper le contrôleur du câble d'interface
Puis présenter la carte face à l'ouverture USB.
Enfin, placer la seconde pièce pour sécuriser la carte dans son emplacement.
MyDin - carte contrôleur DINCASE-MB3PICO
Sans oublier, bien sur, d'utiliser les vis de fixation.
Accès au port USB du Pico
Vient ensuite la connexion de la carte de fond de panier.
MyDin - carte de fond 2 Relais DINCASE-2R-BP3MOD
MyDin: DINCASE-MB3PICO + DINCASE-2R-BP3MOD
Reste plus qu'a refermer le boîtier.
Module fermé et prêt à l'emploi
Ensuite
Il reste encore à s'occuper de:
la face du module avec l'accès aux boutons.
finaliser la bibliothèque MicroPython.
Du code en prévisualisation
Voici un exemple rudimentaire présentant le fonctionnement général de la bibliothèque.
Le point principal est l'appel configure() qui précise la carte contrôleur et la carte d'interface associée. Dans le cas présent, l'appel configure( Pico3Mod, TwoRelay3Mod ) nous informe que:
La carte contrôleur est basée sur un Raspberry-Pico (3 modules DIN).
La carte d'interface est un module 2 relais (3 modules DIN).
L'objet ainsi créé expose les interfaces de la carte contrôleur et des interface de la carte en fond de panier. Cette approche permet d'envisager d'autres combinaisons de cartes contrôleurs (incluant d'autres interfaces) et d'autres cartes d'interfaces.
from mydin import configure
from mydin.pico import Pico3Mod
from mydin.backplane.relays import TwoRelay3Mod
import time, sys
din = configure( Pico3Mod, TwoRelay3Mod )
# === Relays ==================================
din.rel1.on()
print( "Rel1 is", din.rel1.value() )
time.sleep(1)
din.rel2.on()
print( "Rel2 is", din.rel2.value() )
time.sleep(1)
print( "All relays off" )
for relay in din.relays:
relay.off()
print( "relays state", [relay.value() for relay in din.relays] )
# === LEDs ====================================
for i in range( 20 ):
for led in din.leds:
led.toggle()
time.sleep_ms(100)
# turn off all leds.
[ led.off() for led in din.leds ]
La solution MyDin existe déjà depuis quelques années pour permettre le prototypage de projets pro et semi-pro. J'en parlais dans cet article.
Le projet connaît un développement intéressant en proposant des cartes plus avancées.
mb3mod
Bien qu'en cours de développement, les avancées sont suffisantes pour une petite présentation ;-) .
A propos de myDIN
Le
but du projet myDin c'est de proposer un écosystème de boîtier + cartes permettant
d'accueillir les projet Makers mais aussi de développer des solutions
Pro/Semi-Pro pour les inclure dans des boîtier DIN.
myDin permet de combler le vide cruel entre le banc d'essai et le coffret électrique.
L'idée derrière cette gamme est de proposer des cartes de fond de panier pour la commande de "puissance" et des cartes frontales pour l'interface de votre projet.
myDin est un outil qui vous laisse le libre choix du début à la fin de votre projet.
Carte 2 relais pour boîtier DIN 3 modules
Plus récemment, j'ai préparé une carte de fond de panier 2R-BP3MOD pour le boîtier DIN 3 modules.
Cette carte de prototypage propose:
2 relais opto-isolés capables de couper un courant important
Ces deux relais permettent de commander des appareils comme pompe à eau, petit chauffage, ventilation, éclairage, ...). Grâce a l'isolation galvanique offert par les relais, il est aussi de commander la mise en marche (ou arrêt) d'une chaudière ou d'un AirCo en simulant l'appui sur un bouton.
Premier prototype de la carte 2R-BP3MOD (fond de panier)
Le connecteur présente une connectique "standardisée" entre la carte contrôleur (développée ci-après) et les cartes de fond de panier.
Description de l'interface avec la carte contrôleur
Carte contrôleur pour boîtier DIN 3 modules
Comme une carte de puissance ne présente aucun intérêt sans carte de contrôleur adéquate.
Voici une carte Pico sous MicroPython Pico-MB3MOD équipée des éléments essentiels à la réalisation de nombreux projets d'automatisation.
Carte contrôleur pour boîtier DIN 3 modules
La carte de contrôle propose une interface utilisateur et des connecteurs d'extensions accessibles depuis la face avant du boîtier DIN.
L'intérêt d'utiliser du code Python est de permettre le développement facile de solution personnalisée en utilisant Thonny IDE (disponible sur Thonny.org). Cela est rendu possible grâce à MicroPython!
DIN 3 module avec carte contrôleur + carte fond de panier.
La carte de contrôle propose les fonctionnalités suivantes:
Raspberry-Pi Pico 2 Wireless
4x boutons utilisateurs.
4x LEDs utilisateurs.
1x LED de statut (contrôlable par le code utilisateur)
Bouton Reset, LED d'alimentation, switch RUN_APP (sous forme de connecteur a ponter).
Disposant de 512 Kio de RAM, ce microcontrôleur surpuissant est capable d'exécuter du code MicroPython (mais aussi Arduino, Circuit Python, Rust, C, etc).
Il est même assez puissant pour proposer un mini Web-Serveur.
Comme les 4 Mio de mémoire Flash est également utilisée pour stocker le système de fichiers de MicroPython, un espace de stockage énorme pour vos scripts et ressources (ex: faire du datalog).
Les GPIOs du Pico sont tous attribués dans le projet, suivant vos besoins, il sera possible d'en récupérer l'un ou l'autre sur le connecteur UEXT en fonction des besoins.
Ce connecteur est pratique pour connecter rapidement un capteur sur la carte contrôleur (luxmètre, Humidimètre, température, qualité d'air, etc) ou afficheurs (4x7 segments, LCD, OLED, etc)
Un connecteur de choix pour rendre le module DIN sensible au monde environnent ET/OU améliorer l'interaction avec l'utilisateur.
Le bus SPI pourra être utilisé pour faire de l'échantillonnage haut-débit ou pour connecter un écran TFT.
L'intérêt de ce connecteur est d'utiliser un empattement de 2.54mm, ce qui permet aussi d'utiliser les fils de prototypage soit avec les bus, soit en utilisant directement les GPIOs associés.
Seul le bus I2C ne peut être détourné car il est également utilisé sur la carte contrôleur.
A propos du connecteur 1Wire
Le bus 1-Wire (Wikipedia) est surtout connu grâce au capteur de température DS18B20.
Le connecteur à ressort permet d'ajouter facilement une (ou plusieurs) sonde(s) de température.
Les sondes de température sont pratiques pour surveiller la température d'une serre, d'un aquarium, vivarium ou d'un frigo.
LES DESSOUS de la carte contrôleur
Le module est équipé d'une horloge RTC de précision, ce qui permettra au module de rester à l'heure même après une coupure de tension :-)
Disposer d'une horloge permet aussi de planifier des tâches horodatée.
Le buzzer amplifié est là pour offrir un retour sonore. Utile par exemple pour produire une alerte lorsque les conditions environnementales semblent anormale. Encore une fois, cela serait fort utile pour les Aquariums et Vivariums.
Une empreinte de connecteur Qwiic est également disponible sous la carte. Cela permettra, au besoin, d'ajouter des fonctionnalités avancées par l'intermédiaire du bus I2C.
Enfin, comme le microcontrôleur RP2350 dispose d'un capteur de température, celui-ci pourra être utilisé pour surveiller la température à l'intérieur du boîtier.
Votre avis compte aussi
Je crois que ce projet réunit des éléments dans une configuration prometteuse. Il me faut encore me pencher sur la partie logicielle de sorte à faciliter la personnalisation.
Si cet article vous inspire commentaires et remarques alors n'hésitez pas à les partager dans la section "commentaire" de cet article.
Le premier réflexe est souvent de penser à un défaut du matériel... c'est pourtant illogique.
Le RP1 c'est un tank!
Bien que le RP1 soit le dernier composant arrivé sur le Raspberry-Pi, c'est une composant particulièrement fiable parce que, pour commencer, il est toujours réalisé en 40nM. Dans le monde de la gravure microprocesseur, 40nM fait un peu office de tank! C'est que le RP1 est prévu pour contrôler les GPIO et doit donc être capable de délivrer plusieurs milliampères sur ces entrées/sorties. C'est pour cela que le RP1 est bâtit comme un tank!
Le SoC ou la RAM ont plus de chance de défaillir avant le RP1 (sauf si vous faites des court-circuits avec le GPIO... fumée magique tu verra...).
Autopsie
1) Le "flash code" nous apprend:
Le SoC démarre et charge le programme de boot depuis la l'EEPROM.
2) La mise à jour EEPROM réussie nous apprend:
La séquence de BOOT démarre la mise-à-jour EEPROM avant de finaliser l'initialisation des composants de la plateforme. C'est assez intelligent!
Que la RAM est accessible et fonctionne parfaitement.
3) Pas de "Debug Probe" disponible.
Cela aurait probablement fourni des informations intéressantes... mais bon.
3) Inspection visuelle nous apprend:
Sauf court-circuit sur GPIO, il est peu probable que le RP1 rende l'âme spontanément. Il est fort probable -si pas certain- qu'une manipulation ait arraché un composant!
Je vous propose de faire l'inspection sur les photos transmises par le client... juste pour vois si vous pouvez identifier le problème.
Alors l'image n'est pas très nette suite au grossissement logiciel mais le composant partiellement arraché est sur l'une des deux pistes de l'horloge RP1. Normal donc qu'il ne réponde plus au sollicitations du SoC.
Réparation
Par chance, c'est parfaitement réparable. Nous avons recommandé au client de remettre délicatement le composant en place puis de refaire une soudure.
C'est une tâche délicate compte tenu de la taille des composants... voici la réponse reçue du client ce Lundi matin.
Hi Dominique,
I'm super impressed and you clearly have an attention to detail I don't have yet. This was the source of the issue, moved back and re-soldered the component, and TADAAAA!!
You made my weekend! And again, well done on catching this!
Ce faisant, cela produisait un dégagement constant de chaleur de 1.3W et l'élévation de la température à 70°C.
Cet article va explorer d'autres options
Cascade de Villard
Etant donné que nous avons aussi un transformateur 230 V AC vers 2x 6V AC, il est possible d'envisager l'utilisation d'une Cascade de Villard... qui permet d'élever une tension alternative en employant des étages de Diode + Condensateur.
La tension de sortie Vout produite est une tension continue et relevée aux bornes du condensateur.
Ce qu'il y a de bien avec la cascade de Villard, c'est qu'il est possible de chaîner les étages.
Il n'est pas une absolu nécessité d'utiliser des condensateurs polarisés. Comme je tiens à produire une tension de -24V pour le VFD, j'ai préféré utiliser des condensateurs polarisés.
La seule condition imposée est que chaque condensateur et chaque diode doit être capables de supporter le double de la tension d'alimentation.
Je vous propose cette vidéo de "Ludic Science" qui donne des détails sur la réalisation d'une cascade de Villard.
Cas du transformateur 6V
Souvenez-vous, dans le précédent article, le transformateur 6V à vide produisait une tension de 10.44 Vrms à vide. La tension de pic est toujours de 14.74V (soit 10.44 x 1.41).
J'ai donc récupérer la tension alternative sur le premier étage 5V pour obtenir une tension de 25V DC.
L'utilisation d'un oscilloscope pour contrôler la tension aux bornes du condensateur révèle que celle-ci est parfaitement lissée (en l'absence d'un courant de charge).
Cependant, vu que les deux circuits partagent des diodes en commun, nous ne pouvons pas simplement imposer la masse du circuit 5V DC comme référence commune avec le +28V DC (de sorte à obtenir les -28V nécessaires).
Pour que cela puisse fonctionner, il faut que le circuit générant les 28V DC soit totalement isolé du premier. Il faut donc utiliser le 2ieme secondaire 6V sur premier transformateur. Il sera alors possible de créer du -28V DC avec la masse commune.
Si cela est fonctionnel, cela me prive aussi de mon 2ieme secondaire 6V destiné à la "chauffe" du filament.
Cela avance, au moins cette fois, il n'y a plus de dissipation de chaleur (compré au précédent article).
Si vous avez l'occasion de vous pencher sur les derniers articles concernant les "Vaccum Fluorescent Display" (FVD) alors vous savez que trois tensions sont nécessaires:
5V pour la logique.
-24V pour les grilles.
5V isolée pour l'alimentation du filament.
Je me tourne donc vers la réalisation d'une alimentation à multiples tensions de sorties. Je recherche donc quelques transformateurs 220V AC...
Les transformateurs
Mon premier transformateur est un BV302D06023 de Zettler Magnetics.
BV302D06023 de Zettler Magnetics
Dont voici les caractéristiques principales:
Voltage - Primary: 230V
Voltage - Secondary (Full Load): 6V
Current - Output (Max): 383mA
Primary Winding(s): Single
Secondary Winding(s): Dual
Center Tap: No
Power - Max: 2.3VA
Mon second transformateur BV302S24012 toujours de Zettler Magnetics.
BV302S24012 de Zettler Magnetics
Dont voici les caractéristiques principales:
Voltage - Primary: 230V
Voltage - Secondary (Full Load):24V
Current - Output (Max): 50mA
Primary Winding(s): Single
Secondary Winding(s): Single
Center Tap: No
Power - Max: 1.2VA
Les premières mesures = surprise
C'est en commençant mon petit montage de test que je m’aperçois que la tension de sortie des transformateurs ne sont pas celles attendues.
Au lieu de 6V est de 10.44 V AC et de 13V DC après pont redresseur + condensateur (le double de la tension AC annoncée).
C'est encore pire pour la sortie 24V AC atteint 50V DC!!! Outch!
Que se passe t'il ?
Et bien c'est simple, la tension de sortie du transformateur varie en fonction du courant de charge. D'ailleurs, la tension secondaire est indiquée pour la plein charge (comme le mentionne l'indication "Full Load".
Etant donné qu'il n'y a pas de charge sur l'alimentation, il est normal d'avoir une tension de 10.44V AC supérieure aux 6V AC attendus. La tension de 13V DC s'explique parce que le condensateur lisse la tension à la tension de pic (Vpeak) de la sinusoïde.
10.44V AC est une tension Vrms. Pour obtenir la tension de pic, on applique la formule suivante:
Vpeak = Vrms * 1.41
Donc VPeak = 10.44 * 1.41 = 14.74 V auquel il faut soustraire 2 * 0.7V de chute de tension dans les diodes (0.7V par diode).
Donc, la tension de pic aux bornes du condensateur est donc de 14.74 V - 1.4 = 13.34V et sera la tension lissée par le condensateur.
Note:
Pour la régulation 5V avec un L7805, la tension d'entrée de 13V DC ne sera pas un problème!
La tension de 50V sera un problème car le régulateur MC79L24 accepte un maximum de -40V!
Réduire la tension de sortie du transfo 24V
Comme précisé, le transformateur 24V produit une tension redressée de 50V DC. C'est principalement parce que la tension de sortie à vide du transformateur est de 37V AC.
Une façon de réduire la tension de sortie est de mettre le transformateur en charge avant d'effectuer le redressement. Cela tombe bien, j'ai une résistance de 330 Ohms 5W sous la main.
Utiliser cette résistance fera circuler un courant dans le transformateur et abaissera la tension de sortie AC. Mais quel sera cette tension ?
Le transformateur dispose d'une puissance de 1.2 VA (Volt-Ampère).
Donc 1.2 VA = Usecondaire * Isecondaire
Or, comme la résistance sera branchée directement sur la sortie du transformateur on peut aussi écrire
Usecondaire = R * Isecondaire Usecondaire = 330 * Isecondaire
En substituant dans la Usecondaire dans la formule de la puissance nous obtenons:
1.2 = 330 * Isecondaire * Isecondaire
Donc Isecondaire = SQRT( 1.2 / 300 ) = 0.063 A ou 63 mA.
Maintenant que le courant est connu, il est aussi possible de déterminer la tension sur le circuit secondaire.
Après contrôle, la tension de sortie est mesurée à 21.8V... car la résistance ne vaut pas exactement 300 Ohms.
Tension redressée
La puissance de 1.2 VA se calcule sur des valeurs Vrms. Les 20.87 V AC déterminés par calcul seront donc en Vrms. Puisque la tension a été mesurée à 21.8V, la suite réutilisera cette dernière valeur.
La tension de pic sera Vpeak = Vrms * 1.41 = 21.87 * 1.41 = 30.73 Volts. Il faut y soustraire la chute de tension des diodes (2 * 0.7V), ce qui donne une tension Vpeak de 30.73-1.4 = 29.33 Volts aux bornes du condensateur.
La tension lissée sera de 29.33 V DC (mesuré à 29.7 VDC), pile dans les spécifications du régulateur -24V :-)
Puissance dissipée dans la résistance
Le courant circulant dans la résistance de 330 Ohms produit un échauffement. Puisqu'il s'agit d'une tension alternative, la puissance dissipée par une résistance se formule comme suit: P = R * I² = 330 * 0.063² = 1.3 W
La température de la résistance monte assez vite et se stabilise autour de 70°C~75°C à l'air libre (même pour une résistance de 5W).
Cela chauffe vraiment beaucoup... même si l'on reste dans les tolérances de puissance de la résistance.!!! Augmenter la surface d'échange ne serait pas du luxe.
Puissance consommée sur le transformateur 24V
La tension de -24 V produite sert principalement à la polarisation des grilles du VFD. Il n'y aura donc pas de courant significatif consommé sur ce circuit.
La résistance de charge de 330 Ohms reste donc un élément indispensable de ce circuit.
Cela représente quand même une puissance dissipée en chaleur de 1.3W ! Pas franchement idéal!
Toujours dans la série des articles sur les tubes VFD (Vaccum Fluorescent Display), voici mon article de détente pour ce dimande.
Les VFD sont des tubes sous vide qui étaient utilisés pour afficher des informations sur nos appareils électroniques durant les années 1980 à 2000. Bien que largement remplacé par des afficheurs LEDs et autres technologies, les VFDs sont encore forts appréciés malgré leur anachronismes.
Il y a bien des années, je disposais d'un four à micro-ondes MT-267, un excellent appareil mais qui à rendu l'âme.
Four micro-ondes / multi-fonctions MT-267
Il utilisait un afficheur VFD (je ne le savait pas encore à l'époque)... et j'aimais beaucoup l'effet produit par ce type d'affichage. J'ai donc récupéré le panneau de commande.
Panneau de commande du MT-267
Panneau de commande du MT-267
Le panneau de commande ci-dessous peut être démonté pour accéder à l'électronique.
Panneau de commande du MT-267
La carte expose:
L'afficheur VFD complet
Un encodeur rotatif d'excellente qualité
Une EEPROM de 1K (sur la gauche de l'encodeur).
Ce qui serait le contrôleur VFD est collé sous l'afficheur.
Une belle série de bouton.
Afficheur VFD - mention FV731GN
Comme le montre l'image ci-dessus, l'afficheur propose:
des segments supplémentaires (pour afficher des lettres)
Nombre à 5 digits --OU-- 4 digits + 1 décimale
Affichage de l'heure
des tirets pouvant servir de barre de progression (au dessus et en dessous
Quelques symboles pouvant être fun à utiliser (comme "la tasse de café").
Après un peu de travail, il est possible d'accéder au contrôleur présent sous l'afficheur.
TOSHIBA TMP47C1670
Le contrôleur de cette carte n'est pas un simple Contrôleur VFD mais plutôt un microcontrôleur TMP47C1670 de Toshiba. Ce microcontrôleur est spécialisé pour les interface d'affichage VFD et saisie clavier. Etant donné que c'est un microcontrôleur, il dispose aussi d'entrées/sortie standard, de Timer, d'une horloge, d'un générateur PWM et même d'un convertisseur analogique/numérique.
Diagramme de bloc du TMP47C1670
Le TMP47C1670 est un peu trop complexe pour envisager sa reprogrammation. Par contre le diagramme nous apprend qu'il y a des broches réservées au contrôle des segments (les anodes) et des broches réservées au contrôles des digits (les grilles).
En utilisant ces informations, le brochage TMP47C1670 et la carte, il est possible de re-documenter le brochage de l'afficheur VFD.
Brochage du VFD - mention FV731GN
Il me faudra, bien entendu récupérer (ou acheter) un controleur VFD parmi ceux utilisables avec MicroPython (PT6302, M9202 / MSM9202, M66004) déjà abordés dans les quelques articles précédents.
Le précédent article sur les tubes VFD (Vaccum Fluorescent Display) c'était le contrôleur VFD M9202 (aussi appelé MSM9202) de mon ancien Sony compact disk player CDP-CX35.
Poursuite du hacking
Après la prise en main de l'afficheur VFD, je veux maintenant prendre le contrôle du restant de la facade... cela concerne les LEDs, les encodeurs rotatifs et les boutons.
Sony compact disk player CDP-CX350
Interface Clavier
Le connecteur principal était déjà partiellement décodée pour l'afficheur VFD.
CDP-CX350 - détail de la carte principale
En poursuivant les investigations, j'ai découvert que les LEDs étaient contrôlées par un GPIO expander 16 bits (M66310). Pour leur part les boutons sont raccordés en grappe.
Voici donc le complément d'information concernant le connecteur principal (CON1) et le connecteur vers la carte fille (CON2).
On peut y voir que les broches DataIn, ShiftClk, Reset de l'afficheur VFD sont ici utilisées pour contrôler le GPIO Expander M66310 (plus le signal LatchClk).
Contrôler les LEDs
Pour prendre le contrôle des LEDs, il faut donc envoyer les 16 bits de données vers le M66310 puis activer le signal LatchClk pour mettre à jour les sorties sur le GPIO Expander.
Les données sont envoyés en utilisant les mêmes signaux DataIn, ShiftLck que l'afficheur VFD. Le contrôleur VFD a son ChipSelect désactivé durant la communication avec le M66310.
Comme déjà précisé, une fois les 16 bits de données envoyés vers le M66310, une impulsion est envoyé sur LatchClk pour envoyer les bits sur les sorties.
En suivant les traces, il est alors possible de relier LEDs et GPIOs du MF66310.
Une fois la bibliothèque m66310.py rédigée, le contrôle du GPIO expander est relativement simple.
from machine import Pin
from m66310 import M66310
import time
_reset = Pin(Pin.board.GP18, Pin.OUT, value=True ) # Reset désactivé
_cs = Pin( Pin.board.GP14, Pin.OUT, value=True ) # VFD désactivé
_sdata = Pin( Pin.board.GP13, Pin.OUT )
_sck = Pin( Pin.board.GP16, Pin.OUT, value=True )
# M66310 GPIO Expander, Latch on raising edge
_latch = Pin( Pin.board.GP20, Pin.OUT, value=True )
# Modifier tous les bits en un fois (sous forme de nombre)
leds = M66310( _sdata, _sck, _latch, _reset )
leds.data = data = 0b0000000000011100 # 16 bits.
leds.update()
time.sleep_ms( 500 )
leds.clear()
leds.update()
# Modification bit à bit
for bit_idx in range( 2, 16 ):
print( bit_idx )
leds[bit_idx]=True
leds.update()
time.sleep_ms(100)
leds[bit_idx]=False
leds.update()
leds.clear()
leds.update()
Détecter les boutons pressés
Dès le début de ce projet, je suis assez étonné de trouver deux entrées 5V et deux masses totalement distinctes sur le connecteur principal.
Il m'aura fallu attendre le décodage de la partie bouton pour me rendre compte que les boutons sont raccordés en grappe chacun avec une résistance d'une valeur différente.
En voici un exemple d'une série de boutons branché sur la broche "key1".
Raccordement des boutons en grappe
Il faut donc ajouter une résistance pour compléter un pont diviseur et ainsi obtenir une tension (qui dépend du bouton pressé).
Cela explique aussi la raison pour laquelle il existe deux masses et deux sources 5V. Un circuit est destiné à la lecture analogique et un autre circuit est destiné au circuits logiques et contrôleurs. Le circuit analogique ne peut pas être perturbé par des parasites, variation de tension ou courant qu'il est plus facile de rencontrer sur le circuit logique (surtout à cause du contrôleur VFD).
La quantité de boutons sur le panneau fait qu'ils sont regroupés sur différentes grappes indépendantes. C'est ainsi que la carte présente les sorties Key0, Key1, Key2, Key3, Key4. Les encodeurs étant également des boutons un peu spéciaux, ceux-cis sont également repris sur les grappes.
Je dois toujours réaliser un étage d'alimentation pour rendre un projet VFD autonome (j'avance sur ce point). Cela me facilitera aussi la vie lors du test d'autres VDF.
La réalisation d'une carte personnalité permettra d'interagir facilement avec les éléments de ce panneau.
A la veille d'une sortie cruciale, c'est très agacé que j'écris cet article qui, une fois de plus, étale les conséquences d'un fondamental manque de réflexion chez Payconiq/Banksys!
En effet, une récente modification technique chez Payconiq créée la panique chez les clients du WebMarchand MC Hobby.
Depuis quelques jours, Payconiq : spécialiste du paiement sûr et facile, très apprécié des belges, a étendu sa fenêtre de réponse aux WebMarchands de 2 heures!
En gros, vous payez tout de suite... mais le WebMarchand n'aura confirmation du paiement que dans un intervalle de 2 heures (ce qui est confirmé, 2 heures, vraiment!).
Et puisque le WebShop ne reçoit pas de confirmation, le panier n'est pas transformé en commande. D'autant que le prélèvement sur le compte bancaire du client est immédiat! Pour une méthode de paiement instantané... "Ca la fout mal!".
Conséquence:
Nous avons des appels de clients débités sur leur compte bancaire qui ne comprennent pas pourquoi il n'ont pas la commande correspondante dans le web-shop après leur paiement!
Web-marchand prit au piège:
Comme la solution Payconiq est liée à Bancontact, il est impossible de désactiver l'un sans désactiver l'autre.
Si le WebMarchand veux garder le moyen de paiement Bancontact (c'est dans son intérêt), il présente de-facto les paiement PayConiq.
Le mot de la fin
Espérons que Payconiq/Banksys se rendra rapidement compte de leur erreur!
Je n'arrête décidément plus mes expérimentations avec les tubes VFD (Vaccum Fluorescent Display). Cette fois, je me suis penché que contrôleur VFD M9202 (aussi appelé MSM9202) qui a sa propre petite histoire.
Introduction
Il y a bien des années, je me suis payé un Sony compact disk player CDP-CX350, un carrousel capable de contenir 300 Compact Discs. J'adorai ce lecteur.
Sony compact disk player CDP-CX350
Je parle au passé car ce magnifique appareil n'a pas survécu à ses multiples déménagements. C'est que 300 CD, cela fait son poids et jeunesse aidant j'ai habité divers endroits. Et c'est avec désolation que j'ai découvert que mon génial lecteur CD avait mécaniquement dépassé tout espoir de réparation.toute lecture... nous étions en 2005!
Le maker était en sommeil
Bien qu'en 2005 je n'y connaissais pas grand chose en programmation microcontrôleur, j'ai procédé à la récupération de la face avant me disant qu'un jour, peut-être, je pourrai le recycler.
Sony compact disk player CDP-CX350 (face avant)
Sony compact disk player CDP-CX350 (face avant)
De nos jours
Nous sommes en 2025, j'ai ressorti la face avant du lecteur (photos ci-dessus) en vue d'un recyclage complet de l'afficheur VFD mais aussi les boutons, les LEDs, les encodeurs rotatifs, etc!
La carte principale à l'afficheur VFD est visible ci-dessous
CDP-CX350 Carte principale
De haut en bas, la carte reprend les éléments suivants:
Connecteur d'interface : en haut a gauche, destiné à recevoir un ruban. Ce connecteur 23 contacts permet de communiquer avec tous les éléments de la carte principale et carte fille.
Connecteur carte fille : ce connecteur bleu (toujours en haut) permet de connecter les éléments de la carte fille (encodeurs rotatifs, bouton play/pause/...)
Récepteur infrarouge : en haut à droite, permet de réceptionner les signaux de la télécommande.
L'afficheur VFD : superbe comme tous les autres et contenant de nombreux symboles. Ce VFD est piloté par un contrôleur VFD M9202 (OKI).
LEDs oranges : contrôlée avec un GPIO expander 16 bits M66310FP. Ce GPIO expander est aussi un LED Driver. Les deux contrôleurs M66310FP & M9202 partagent le même bus de communication.
Boutons : les nombreux boutons présent sur cette carte (comme la carte fille) sont regroupés par lot sur 5 lignes "keys" distinctes. Chacun de ces boutons ayant une résistance pull-down spécifique (dans son groupe), il faut utiliser une entrée analogique pour déterminer quel bouton est pressé dans un groupe donné.
Emetteur infrarouge : les 5 LEDs "bleues" sont en fait des émetteurs infrarouges accompagnés de leur circuit de puissance (les transistors) et connecteur d'interface (en bas à gauche)
Le contrôleur VFD M9202
CDP-CX350 - détail de la carte principale
A partir de la fiche technique du M9202, j'ai pu identifier les différentes connexions nécessaires au contrôle de l'afficheur.
C'est en lisant la fiche technique du M9202 (MSM9202) que j'ai remarqué que le protocole est identique à celui utilisé pour le ChipSet PT6302 de Princeton Technology.
Clk : signal d'horloge du M9202 utilisé pour la transmission de données.
DataIn : signal de données du M9202 (communiqués bit-à-bit en commençant par le bit le moins significatif)
ChipSelect : activation du M9202. Nécessaire lorsque le microcontrôleur doit envoyer des données.
VFL : tension négative permettant de contrôler les grilles ( -25V est suffisant).
Heater1 & 2 : filament de chauffe (5 Ω), alimenté en 2.9V (consommation 170mA).
Les signaux identifiés, voici comment brancher le Pico pour contrôler le VFD.
Un 74AHCT125 est utilisé pour convertir les signaux logiques.
Le circuit Cut-off bias voltage est réalisé à l'aide de 2 diodes Zener et résistance de 2.2K il m'a fallu un certain temps pour me rendre compte que j'avais oublié de le monter... raison pour laquelle l'afficheur n'affichait absolument rien.
Il est maintenant possible de tester les Digits et d'identifier leurs positions. La disposition des caractères est un peu bizarre mais n'empêche en rien la représentation de texte.
Comme pour les autres VFD, le contrôle individuel des segments permet aussi de contrôler les divers symboles (voir le Digit #16 ci-dessous).
Contrôle des segments 0 à 34 d'un digit.
L'exemple test_btn_segment.py montre justement comment prendre le contrôle des segments sur le Digit #16.
Pour la première fois, j'utilise aussi l'ADRAM du contrôleur VFD.
ADRAM, 2 bits complémentaires par digits
l'ADRAM est un espace mémoire de deux bits supplémentaires par Digits (donc 35 segments + 2 bits ADRAM). Ces bits additionnels peuvent être utilisés pour activer/désactiver des symboles (ou points) supplémentaires.
Les bits ADRAM sont souvent utilisés pour activer un point décimal, double-point ou un curseur sur l'afficheur.
Dans le cas présent l'ADRAM est utilisé pour activer un symbole supplémentaire sur l'écran. Ainsi, en fixant l'ADRAM du Digit #8 à 0b01, le libellé "GROUP" est illuminé au dessus du Digit #8.
M9202 : code et exemples
Le dépôt github micropython-M9202-VFD dispose des informations nécessaires à la prise de contrôle de l'afficheur VFD avec le contrôleur OKI M9202.
Le dépôt contient plusieurs exemples utilisés pour tester l'afficheur VFD.
test_display_all.py : active le mode de test du VFD illuminant toutes les segments.
test_display_chars.py : les caractères A à Z sur les 16 positions du VFD.
test_display_str.py : affiche la chaîne de caractères "ABCDEFGHIJKLMNOP" sur l'afficheur à partir de la position 1. Très pratique pour deintifier la position de chaque Digit.
test_custom_char.py : création et affichage d'un caractère personnalisé.
test_segments.py : active progressivement les segments 0 à 34 du digit sélectionné.
test_btn_segment.py : utilise un bouton Up et Down (sur GPIO 0 et 1) pour contrôler le segment allumé entre 0 et 34.
test_adram.py : modifie les bits ADRAM des digits de 1 à 16. Permet d'identifier les éléments/symboles activés par les combinaisons binaires testées.
test_adram_raw.py : manipulation brut de l'ADRAM par envoi direct des messages. Uniquement à des fins de démonstration.
test_btn_adram.py : Utilise un bouton Up et Down (sur GPIO 0 et 1) pour contrôler le Digit (de 1 à 16) dont l'ADRAM est modifié.
test_raw.py : test brut de l'afficheur VFD en envoyant des messages brutes. Uniquement à des fins de démonstration.
Boutons, encodeurs et LEDs
Le décodage de ces éléments est en cours. Le dépôt contient déjà des informations mais il reste encore un travail non négligeable à réaliser. Cela fera l'objet d'un autre article.
Cet article intéresse certainement tous les Makers mais les Belges se sentiront privilégié ;-) Après le contrôleur VFD M660004 dans le précédent article, cette fois, c'est le contrôleur VFD PT6302 qui est à l'honneur.
Introduction
Mon tout premier afficheur VFD (Vaccum FLuorescent Display) fût récupéré sur un décodeur Belgacom TV (aujourd'hui Proximus TV) de 4ieme génération.
En 2022, je démontais le décodeur pour le transformer en alimentation d'établi. A cette occasion, je mettais l'afficheur de côté en espérant pourvoir le hacker.
Fort de ma toute récente expérience avec le VFD de Sony, j'ai embrayé sur celui de Belgacom/Proximus TV que l'on peu admirer dans toute sa gloire ci-dessous!
A l'évidence, la carte est équipée des éléments nécessaires pour générer la tension négative pour les grilles ainsi que l'alimentation du filament. Diandre! Je ne suis jamais arrivé à la faire fonctionner!
J'ai donc sorti mon fer à souder et j'ai éliminé tous les composants entre les boutons poussoirs et le bord opposé de la carte! J'ai bien entendu préservé le contrôleur et les composants directement attachés.
VEE: Tension négative utilisé pour fixer le potentiel du filament de chauffe (-25 à -35 volts)
VSS: masse commune.
RSTB: Reset du contrôleur
CSB: Chip Select. Placez le au niveau bas pour communiquer avec le composant.
CLKB: signal d'horloge. L'acquisition du bit de données se fait sur le flan montant du signal d'horloge.
DIN: Data Input=entrée de donnée. Les données sont envoyée bit à bit (LSBF = bit le moins significatif en premier).
Brancher sur un Pico
Avant d'envisager le branchement sur un Pico, il faut:
Recréer le circuit de polarisation du filament de tungstène. C'est qu'en enlevant tous les composants... j'ai aussi enlevé ces éléments.
Récupérer les signaux VDD, VEE, VSS, RSTB, CLKB, DIN du contrôleur (sans oublier ceux du filament de chauffe).
Polarisation du filament
Par expérimentation, une tension de 2.9V est suffisant (le courant de chauffe atteint 150mA). Deux résistance de 500 Ohms sont utilisés (appris avec le VFD de Sony)
Par expérience, encore, une tension VEE (ou VP) de -25V est suffisante pour un fonctionnement correct. Une tension de -35V est également convenable mais fait un peu trop chauffer la résistance de 2.2K (1/4W). Avec VEE de -25V, la tension bias est alors de -19V, un différence de 6V qui s'est révélée suffisante à l'usage.
Récupération des signaux
Vient ensuite la localisation de tous les signaux VDD, VEE, VSS, RSTB, CLKB, DIN sur le contrôleur (où différents endroits de la carte).
Brancher sur Raspberry-Pi Pico
Ayant décidé de garder une tension logique de 5V pour le contrôleur VFD, il faut donc utiliser un LevelShifter (un 74AHCT125) pour adapter les tensions.
vfd_pt63.py : contrôle des fonctions essentielles du contrôleur VFD.
vfd_proximus.py : fonctions avancées facilitant la prise en main de l'afficheur utilisé sur Proximus TV / Belgacom TV.
Scripts d'exemple
le dépôt reprend de nombreux exemples mais c'est principalement ceux relatifs à ProximusTV qui sont les plus intéressants.
Ce premier exemple indique comment afficher du texte et allumer/éteindre les symboles de l'écran.
from vfd_proximus import *
from machine import Pin
import time
d = VFD_Proximus( sck_pin=Pin.board.GP16, sdata_pin=Pin.board.GP13, cs_pin=Pin.board.GP14, reset_pin=Pin.board.GP18 )
d.print("VFD Proximus")
# affiche toutes les options une par une
# TITLE, CHANNEL, TRACK, STEREO, RECORD, CLOCK, ANTENNA, AM, FM
for option in ALL_OPTIONS:
d.options += option
time.sleep_ms( 500 )
for option in ALL_OPTIONS:
d.options -= option
time.sleep_ms( 500 )
d.clrscr()
d.print("Done !")
Alors, l'afficheur de Belgacom TV / Proximus TV dispose de trois sections d'affichage sur le dessus de l'écran. C'est trois sections sont accessibles par l'intermédiaire des propriétés left , center , right .
Il existe pas mal de moyen d'y afficher des informations, y compris des entiers et nombre décimaux comme l'indique l'exemple ci-dessous.
from vfd_proximus import *
from machine import Pin
import time
d = VFD_Proximus( sck_pin=Pin.board.GP16, sdata_pin=Pin.board.GP13, cs_pin=Pin.board.GP14, reset_pin=Pin.board.GP18 )
d.print("Show float")
VALUES = [1.25,15.2,32,133.78,73.1,5.2]
for value in VALUES:
d.center.float( value )
d.update()
time.sleep(1)
d.center.clear()
d.update()
for value in VALUES:
d.left.float( value )
d.update()
time.sleep(1)
d.left.clear()
d.update()
d.clrscr()
d.print('Done!')
Ce second exemple se concentre sur le disque dans la section de droite. Le script fait d'abord clignoter le disque... puis fait tourner un secteur sur le disque.
from vfd_proximus import *
from machine import Pin
import time
d = VFD_Proximus( sck_pin=Pin.board.GP16, sdata_pin=Pin.board.GP13, cs_pin=Pin.board.GP14, reset_pin=Pin.board.GP18 )
d.print("Show DISC")
# Allumer éteindre le disque
for i in range( 10 ):
d.right.disc( i%2 )
d.right.update()
time.sleep_ms( 500 )
d.right.disc( False )
# Rotation du disque
d.right.disc_start()
d.update()
while True:
d.right.disc_step()
d.update()
time.sleep_ms( 50 )
d.right.disc( False )
Enfin, un exemple simple mais celui que je préfère.... afficher l'heure. Les heures et minutes sont affichées sur la section centrale... tandis que les secondes sont affichées sur la section de droite.
MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.