Quintilien

Quis, quid, ubi, quibus auxiliis, cur, quomodo, quando

 

Informatique, électronique et train miniaturePour en savoir plus

Comment contrôler la vitesse d'un train miniature

 

Un peu de théorie

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 régulation de la vitesse

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.

Energie transmise élevée

Energie transmise plus faible

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,

  • si, toutes choses restant égales par ailleurs (*), on fait varier une tension, on fait varier la puissance, donc l'énergie transmise pendant la durée considérée
  • si on « fractionne le temps » pour une tension, donc une puissance donnée, on fait varier l'énergie transmise également.

(*) Ceteris paribus (Je voulais absolument caser un truc en latin pour faire sérieux ! C'est fait).

 

Microcontrôleurs et PWM

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 :

  • un Raspberry Pi Pico peut fournir 300 mA sous 3,3 V au maximum, donc moins d'un Watt de puissance !
  • une locomotive à l'échelle N se nourrit de plus de 100 mA sous 12 V, donc nettement plus d'un Watt.

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 %

 

Les accélérations et les freinages

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 trains démarraient comme des Formules 1 lors d'un championnat du monde
  • ils s'arrêtaient comme s'ils venaient de percuter un mur

Les micro-contrôleurs et leurs sorties PWM offrent à présent beaucoup plus de souplesse.

 

Les accélérations

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.

Premier exemple : petite accélération de « 5 » (km/h par exemple) par unité de temps (p.ex. à chaque dixième de seconde)

Si on part de zéro, la vitesse sera, dans cet exemple, de « 50 » à la fin de la première seconde écoulée.

Deuxième exemple : accélération plus franche, de « 10 »

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.

'y a plus qu'à ...

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).

 

Puissance et accélération

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 :

  • au démarrage, il faut vaincre l'inertie du convoi (beaucoup de puissance pour une faible accélération)
  • à grande vitesse, il faut beaucoup de puissance pour grapiller quelques km/h supplémentaires (les aspects aérodynamiques ont plus d'importance qu'à basse vitesse).

On dira, en langage de matheux, que

  • l'accélération n'est pas linéaire
  • il n'y a pas une parfaite corrélation entre la puissance fournie et l'accélération

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 » !

Le coin des râleurs puristes

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 :

  • le fait que la température d'un moteur - froid au début, plus ou moins chaud après quelques minutes de fonctionnement - a une influence considérable sur la fluidité et la viscosité de la lubrification (bin oui : il y a un peu de graisse sur les axes ...), donc sur le comportement du moteur pour un signal d'entrée donnée ;
  • le fait que la locomotive est attelée à un nombre de wagons plus ou moins grand : la différence de charge joue bien entendu sur la vitesse du moteur à tension égale ;
  • les frottements sont différents selon que la locomotive est en ligne droite ou en courbe ;
  • et, bien entendu, les vitesses varient suivant que la voie monte ou descend ...

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.

 

Puissance et vitesse souhaitée

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.


Retourner en début de page