Pour rappel , le but c'est aussi de pouvoir faire varier l'intensité lumineuse des LED par PWM , ce qui permet de simuler l'allumage et l'extinction progressives des feux , dues à l'inertie thermique des lampes à incandescence des anciens signaux SNCF . Pour cela , la commande est constituée de trames répétées ayant chacune 12 fenêtres de temps , dont la durée varie en fonction du rendement lumineux de chaque LED , et dont la durée constitue aussi une période PWM , à l'intérieur de laquelle le duty cycle varie pour déterminer la luminosité de la LED.
Le problème c'est toujours le carré violet , dont la LED a un rendement médiocre . Pour pallier , il a fallu doubler le fil P3 par une deuxième sortie du STM32 (P3x) , dépourvue de résistance : on a alors 150R + 0R pour cette LED , au lieu de 270R + 270R pour les autres LED . Pour un carré normal , à LED rouge , ce n'est pas nécessaire , le fil P3x (0R) reste en INPUT , cad. en haute impédance.
Du coup , la difficulté c'est que pour chaque signal , il faut 5 broches en PWM , et que ces 5 sorties PWM soient synchronisées : c'était possible avec le pi pico , mais pas avec le BluePill+ : il ne dispose que de 4 timers , donc un timer par signal , qui n'ont chacun "que" 4 canaux PWM . J'ai donc dû laisser les broches P3 et P3x en GPIO (sorties digitales) ordinaires , et de n'appliquer le PWM que sur les fils P1 ou P2 ou P4 . Dans ce cas , pour les LED "manoeuvre" , "vert" et "id2" , il a fallu mettre le fil P3 en sortie digitale (GPIO) HIGH , et commander les autre fils (cad. P1 ou P2 ou P4) en PWM inversé (pour STM32 , PWM normal = PWM1 , PWM inversé = PWM2) . J'ai eu du mal à le concevoir et à le mettre au point , il a fallu écrire directement dans les registres , car STM32duino , bien que très complet ne rentre logiquement pas dans ces détails , et cela a aussi permis un gain de temps bien nécessaire ... mais enfin , ça marche bien .
Comme je tiens absolument à utiliser un timer en mode compare + filtre numérique , pour décoder du DCC , et que tous les timers sont pris pour les signaux , le bus de commande doit être d'un type permettant la transmission (la réception , surtout) par UART , c'est à dire Loconet , ou Xpressnet , ou RS485 protocole perso.
La carte de la photo , fonctionne avec Xpressnet , ou RS485 protocole perso , l'interface MAX485 n'est pas visible ici , car située sous le bluePill+ .
Donc a ce stade , je sait commander chacune des 4x 12 LED , individuellement , en intensité lumineuse variable .
La prochaine étape , c'est de commander les LED groupées en indication (aspect) réglementaire de signal , et de ménager la transition progressive d'une indication vers la suivante. Puis il faudra activer le bus , pour que la carte prenne les commandes qui lui sont destinées . L'expérience atteste que , même si c'est des choses que j'ai déjà faites , il faudra du temps .