Vous vous souvenez des premiers trains électriques de notre enfance (en tout cas de la mienne ...) ?
Pour commander le train manuellement, on utilisait un vague bouton qui - en régulant la tension de sortie - faisait crachoter le moteur de la locomotive plus ou moins rapidement.
Heureusement, les technologies actuelles permettent de remédier à cela.
La technique utilisée pour réguler la vitesse des moteurs à courant continu consiste à leur fournir plus ou moins d'énergie. Cela s'apparente à une lapalissade et pourtant ...
Rappelons que l'énergie est une puissance multipliée par une durée.
Pour réguler la puissance, on jouait jadis sur la tension de sortie (entre 0 et 12 V) mais la technologie mise en oeuvre était basée sur des résistances variables qui se contentaient de dissiper l'énergie excédentaire ... sous forme de chaleur.
Inutile de dire que le rendement n'était pas optimal !
Les technologies actuelles permettent de faire varier l'énergie transmise en jouant sur des durées : on découpe le temps en petit morceaux (par exemple en centièmes de seconde, en faisant intervenir une fréquence, de 100 Hz dans cet exemple).
Cent fois par seconde, on envoie des petits « paquets » d'énergie, plus ou moins « longs » (un centième de seconde complet ou une fraction d'un centième de seconde) pour réguler l'énergie globale fournie.
Les puristes m'accuseront de mélanger allégrement puissance, énergie, tension au fil de mes explications.
Ce sont bien entendu des notions différentes, mais reliées entre elles.
Valeur | Symbole | Unité | Relation | |
---|---|---|---|---|
Tension électrique | U | Volt (V) | ||
Intensité d'un courant | I | Ampère (A) | ||
Puissance électrique | P | Watt (W) | P = U . I | 1 W = 1 V x 1 A |
Temps, durée | T | Seconde (s) | ||
Energie | E | Joule (J) | E = P . T |
Ainsi,
(*) Ceteris paribus (Je voulais absolument caser un truc en latin pour faire sérieux ! C'est fait).
Parmi les fonctionnalités offertes par les microcontrôleurs, on retiendra qu'ils proposent des sorties de type « PWM » (Pulse-Width Modulation) ou, en français, modulation de largeur d'impulsion.
Cette fonction convient parfaitement à la régulation des « petits paquets d'énergie » évoqués plus haut.
Bien entendu, il n'est pas possible de faire passer des puissances (donc des courants) importants dans nos microcontrôleurs sans risquer de les transformer instantanément en grille-pain.
Pour donner un ordre de grandeur :
Pour éviter ces problèmes de puissance (mais aussi de tension), on passe par un contrôleur DC dont le rôle est de fournir, au départ d'une tension d'entrée donnée (12 V dans notre cas), un signal de sortie, puissant, calqué sur celui d'entrée, de faible puissance (fourni sous 3,3 V - ou 5 V - par le microcontrôleur).
Simple non ?
En terme de programmation, cela revient à demander au microcontrôleur de générer un certain type de « pulsations ».
Les pulsations sont exprimées sous forme de grandeurs qui varient entre zéro et 100 %
Bon, bien sûr, les ordinateurs et les processeurs n'aiment pas qu'on leur parle en pourcentage ; ils préfèrent qu'on s'adresse à eux dans leur langage préféré : le binaire.
Ainsi, zéro reste 0, mais 100 % devient (si on compte avec un seul octet, c'est-à-dire 8 bits) 2 exposant 8 moins 1, soit 255 (et non pas 256, car on compte à partir de zéro ...)
La moitié, 50 % vaudra donc 127
Le quart, 25 % vaudra 63, etc
Dans la pratique et pour tout un tas de raison, nos p'tits compteurs vont - par exemple - travailler sur 12 bits, donc gérer des valeurs comprises entre 0 (0 %) et 4095 (100 %)
En résumé
Valeur | Energie |
---|---|
0 | 0,0 % |
410 | 10,0 % |
511 | 12,5 % |
1023 | 25,0 % |
2047 | 50,0 % |
3071 | 75,0 % |
4095 | 100,0 % |
Jadis, dès qu'on voulait un système un peu automatique - du genre « dès que le train A arrive en gare, il s'arrête et le train B démarre automatiquement » - les choses devenaient beaucoup moins réalistes car la commande des trains fonctionnait en « tout ou rien » :
Les micro-contrôleurs et leurs sorties PWM offrent à présent beaucoup plus de souplesse.
Une accélération est une variation de vitesse par unité de temps (pour les matheux, on parle de dérivée première ...).
Le raisonnement est identique pour les décélérations.
Si on part de zéro, la vitesse sera, dans cet exemple, de « 50 » à la fin de la première seconde écoulée.
Suivant le même raisonnement, si on accélère plus fort (en passant de « 5 » à « 10 »), la vitesse sera de « 100 » à la fin de la première seconde écoulée.
Les microcontrôleurs sont très doués pour les tâches répétitives.
Il suffira de programmer une boucle qui augmente la vitesse d'une certaine valeur à chaque fois.
Cette boucle sera programmée pour « tourner » 10 fois par seconde.
Dans la pratique, on utilisera la fonction timer() de Micropython (le détail du programme sera abordé plus loin).
On comprend intuitivement que plus on fournit de la puissance, plus on accélère vite.
Dans la réalité (en particulier pour les trains), ce n'est pas parce qu'on fournit deux fois plus de puissance qu'on accélère deux fois plus vite !
En effet :
On dira, en langage de matheux, que
Cependant, pour simplifier (et en tout cas pour se faciliter la vie dans la programmation de ce qui n'est après tout qu'un hobby ...), on considérera que l'accélération - donc la vitesse après un certain temps - est directement proportionnelle à la puissance fournie puisque c'est vrai pour les vitesses qui ne sont ni trop basses (comme au démarrage), ni trop hautes (un T.G.V. ne serait de toutes façons pas très à son aise sur notre maquette !)
Et puis, après tout, si on voulait simuler le comportement d'un train de marchandises qui éprouve du mal à se mettre en marche, on pourrait décomposer la programmation en deux phases !
En suivant le même raisonnement, on pourrait imiter assez fidèlement le comportement d'un T.G.V. « qui grapille les derniers km/h » !
On pourrait objecter qu'il suffit de connaître la fonction mathématique qui approche le mieux la courbe V = f(T), ou encore qu'il « suffit de » garder quelque part en mémoire une série de coordonnées qui correspondent à la courbe ...
Des essais ont été menés en ce sens mais ils ne furent pas concluants. Outre le fait que cette approche mathématico-puriste alourdit considérablement la programmmation, il a été observé que, d'un essai à l'autre, le comportement des locomotives et des trains varie fortement.
C'est toute la différence entre la théorie (ca devrait fonctionner) et la pratique (ca ne fonctionne pas) !
Pourquoi ?
Parce qu'un grand nombre de facteurs externes entrent en ligne de compte, notamment :
Bref : au plus simple au mieux ! On considèrera que la vitesse (la vitesse souhaitée en tout cas ...) est directement proportionnelle à la puissance fournie en entrée, et que pour accélérer, on fera varier ladite puissance de façon linéaire et basta.
Dans un monde idéal, on pourrait s'en tirer avec ce qui précède.
Il suffirait de se fixer une « vitesse cible » (c'est-à-dire un pourcentage final d'énergie) et une accélération (une variation par unité de temps) et voir nos petits trains s'élancer gracieusement puis accélérer progressivement jusqu'à atteindre la vitesse demandée.
Malheureusement, la réalité n'est pas aussi idyllique.
Si on veut des accélérations réalistes, cela revient à fournir à nos petites locomotives, au démarrage, une énergie trop faible : elles se contentent alors de grogner sans avancer d'un millimètre
Pour remédier à cela, il faut agir sur la programmation pour fournir un seuil de puissance minimum au démarrage, indépendamment de l'accélération souhaitée.
Cette petite correction devra bien entendu être prévue également (bien que probablement avec des valeurs différentes) pour les cas de décélération jusqu'à l'arrêt complet.