Utilisation de l’application Lego® Powered Up

Dans l’article suivant, je vais vous présenter les fonctionnalités de programmation de l’application dédiée à l’écosystème Powered Up de Lego®.

Cet article à été réalisé grâce à mon expérience personnelle, mais aussi grâce à la documentation trouvée sur ce site : https://racingbrick.com/powered-up-code-block-guide/

Introduction : l’écosystème Powered Up

L’écosystème Powered Up est présent sur les gammes City (train), créator expert, Batman, Boost, Technic… Le principe reste le même sur toutes les gammes, même si la brique programmable (le hub) est différente : pouvoir mettre en mouvement des sets via des moteurs et des capteurs et via un panel de contrôle (smartphone ou tablette) ou via la télécommande. Le sujet de la télécommande ne sera pas traité ici.

La liaison entre le hub et le panel de contrôle se fait via une liaison Bluetooth 4.0.

La liaison entre les hub et les autres composant est de type filaire sur 6 fils. Pour plus d’information, je vous conseil ce site.

Les hubs

Le Hub n’est pas réellement une brique programmable au sens 1e du terme : le programme est contenu dans le panel de contrôle qui envoie les directives. Le hub est juste l’interface qui contient une alimentation, le récepteur Bluetooth, un nombre de ports et éventuellement des moteurs.

Il existe 3 type de hub :

  • Le hub LEGO® train : alimenté par 6 piles AAA, ce hub possède 2 ports. C’est le plus compact. (88009)
  • Le hub LEGO® boost : alimenté par 6 piles AAA, ce hub possède 2 ports extérieurs,2 port internes reliés à 2 moteurs sur le même axe (droit/gauche) et un capteur de mouvement interne. (88006)
  • Le hub LEGO® Technic : alimenté par 6 piles AA, ce hub possède 4 ports et un capteur de mouvement interne. (88012)

hub LEGO® train

hub LEGO® boost

hub LEGO® Technic

Ces 3 hub peuvent être connectés à des moteurs, des capteurs, des leds…

Les autres composants de l’écosystème

Les moteurs

L’écosystème Powered Up utilise 2 type de moteurs :

  • les moteurs simples : sur les moteurs simples, la vitesse de rotation est par une fréquence envoyée par le hub. il n’y a pas de contrôle interne de vitesse ou position – exemple le moteur M 45303)
  • les moteurs tachymétriques : sur le moteur tachymétrique, un encodeur et des capteurs de positions interne permettent de piloter finement la rotation du moteur (en vitesse angulaire ou en degré) – exemple les moteur L/XL et le moteur 88008
Moteur type L (88013)
Moteur type XL (88014)
Moteur de type M (45303)

Il existe également un moteur spécifique pour les trains (88011)

les capteurs

Il existe une multitude de capteurs (position, mouvement, proximité, couleur, luminosité…). La plus part des capteurs est dans la gamme WeDo. Il existe un capteur dans la gamme Power Up, le capteur couleur et distance (lego boost 88007). Il est également possible d’utiliser des capteur non officiel LEGO ou des adaptateur pour le PowerFonction ou autre, la toile en dispose

Capteur couleur et distance 88007
capteur de mouvement 45305
Motion capteur 45304

L’application Powered Up

Installation/lancement

L’application est disponible dans tous les bons stores pour tablette et smartphone. Une fois l’application téléchargée et installée, il n’y a plus qu’à la lancer.

Avant de lancer l’application, veillez à bien activer le Bluetooth et la géolocalisation de votre panel de contrôle.

Lord du lancement de l’application, vous arrivez par défaut sur la partie « jouer ».

Quelle que soit la partie (jouer ou créer), l’application va vous demander d’allumer le hub pour initialiser le dialogue. La 1e chose que va faire l’application, c’est de contrôler la version du hub et le mettre à jour s’il n’est pas à la dernière version. Tout se passe automatiquement !

Ensuite l’application va afficher le menu choisi.

Partie jouer

Cette partie est destinée à faire fonctionner les sets du commerce. Il n’y a pas de paramétrage, l’interface est figée selon le set sélectionné. Elle permet également au panel de contrôle d’émettre certains sons pour augmenter le l’immersion.

Partie créer

Sélection nouveau programme / programme enregistrée

La 1e page permet de lancer soit la conception d’un nouveau programme (le + dans le rond rouge à gauche), soit d’un programme enregistré (sur la droite).

Présentation de la page

Sur le haut de l’écran :

  • La flèche vers la gauche permet de sortir de ce mode
  • L’icône Bluetooth permet de paramétrer la connexion et lancer le dialogue
  • L’icône « play » (triangle vert vers la droite) permet de lancer le programme

Sur le bas de l’écran :

  • 6 onglets qui contiennent plusieurs blocs. Ces onglets vont etre détaillés par la suite
  • Le rond blanc avec 3 points : affiche plusieurs boutons (dupliquer le bloc, annuler/rétablir l’action, recentrer l’écran, paramétrage de l’affichage des blocs en attente et l’aide en ligne)
  • liste de blocs de l’onglet sélectionné

Liste des onglets

Sur le bas de l’écran, se présente 6 onglets. Chaque onglet contient un type de commande

Couleur de l’ongletType de commande
JauneDébut et fin de programme, boucle, temps d’attente et question simple
OrangeAcquisition des capteurs (interne, externe et du mouvement du panel de contrôle)
VertContrôle des moteurs (sens de rotation, vitesse et pas)
VioletSons émit par le panel de contrôle et lumières émit par le capteur
BlancOpérations logiques et mathématiques et paramétrages
Gris BleuCréation de modules personnalisés

L’onglet jaune / bloc d’écoulement

Bloc

Nom du bloc

Commande

Start

Début de programme simple
Démarre l’exécution de la séquence attachée lorsque vous cliquez sur le bloc ou lorsque le programme démarre.

StartOnTrue

Démarre l’exécution de la séquence attachée lorsque la condition est vraie.

StartOnEdge

Démarre l’exécution de la séquence attachée lorsque la condition passe de faux à vrai.

EventStart

Démarre l’exécution de la séquence jointe lorsque le drapeau portant le numéro configuré est levé.

EventTrigger

Lève le drapeau dont le numéro est configuré.

WaitForTime

Pause du temps paramétré (en secondes).

WaitForTrue

Attendez que la condition devienne vraie.

CountLoop

Boucle la séquence fermée pour le nombre de fois.

WhileLoop

Boucle la séquence fermée pendant que la condition est vraie.

LoopForever

Boucler la séquence fermée pour toujours.

IfSwitch

Si la condition est vraie, exécutez la séquence supérieure, sinon exécutez la séquence inférieure.

ForkJoin

InterruptOthers Fin

Exécutez les deux séquences en même temps et attendez qu’elles se terminent avant d’exécuter le bloc suivant.

InterruptOthers

Arrête toutes les autres séquences de programme et poursuit l’exécution de la séquence attachée

End

Arrête l’exécution de toutes les séquences en cours d’exécution sur le canevas actuel.

S’il est utilisé dans le programme le plus haut, cela mettra fin au programme. S’il est utilisé dans un bloc de modèle, le bloc de modèle est terminé, mais le programme contenant le bloc de modèle continuera son exécution.

L’onglet orange / bloc capteur

Bloc

Nom du bloc

Commande

TriggerOnColor

Se déclenche lorsque la couleur mesurée par le capteur est égale à la couleur configurée. Capteur Boost uniquement

WaitForColor

Attendez que la couleur mesurée par le capteur soit égale à la couleur configurée. Capteur Boost uniquement

ColorSensor

Obtenez la couleur actuelle mesurée par le capteur. Capteur Boost uniquement

TriggerOnDistancelessThan

Se déclenche lorsque la distance mesurée par le capteur est inférieure à la distance configurée. Capteur Boost uniquement

WaitForDistancelessThan

Attendez que la distance mesurée par le capteur soit inférieure à la distance configurée.
Capteur Boost uniquement.

VisionProximitySensor AddressablePor

Obtenez la distance actuelle mesurée par le capteur. Capteur Boost uniquement

VisionReflectionSensor AddressablePor

Obtenez le niveau de lumière ambiante actuel mesuré par le capteur. Capteur Boost uniquement

TriggerOnOrientation

Se déclenche lorsque l’orientation du hub est égale à l’orientation du hub configuré. Hub Boost uniquement

WaitForOrientation

Attendez que l’orientation du hub soit égale à l’orientation du hub configuré. Hub Boost uniquement

DriveBaseTiltGetOrientation AddressablePort

Obtenez l’orientation actuelle du hub. Hub Boost uniquement

DriverbaseTiltGetAngleX AddressablePort

Obtenez l’angle d’inclinaison actuel du hub sur l’axe X (-90 .90).
Hub Boost uniquement

DriverbaseTiltGetAngleY AddressablePort

Obtenez l’angle d’inclinaison actuel du hub sur l’axe Y (-90 .90).
Hub Boost uniquement

OrientationAngle

Capture également des données avec le hub Boost et le hub Technic. Le concentrateur Boost fournit uniquement des données X et Y, le concentrateur Technic fournit des données X, Y et Z

DrivebaseTiltConfigure OrientationAddressablePort

Supposé définir l’orientation de l’inclinaison du hub Boost, mais il ne remplace pas la valeur détectée – davantage de tests sont nécessaires.

Accéléromètre

Capture également les données avec le hub Boost et le hub Technic, les informations exactes ne sont pas confirmées

DistanceSensor AddressablePort

Capteur WeDo uniquement

TiltSensorXAddressablePort

Capteur WeDo uniquement

TiltSensorYAddressablePort

Capteur WeDo uniquement

Accéléromètre X

Utilise la position d’inclinaison de l’axe X du panel de contrôle (gauche-droite). 0 est la position centrale.

Accéléromètre Y

Utilise la position d’inclinaison de l’axe y du panel de contrôle (avant-arrière). 0 est d’environ 30 degrés avec l’écran de l’appareil face à vous.

Generic / Hub66 / Button

Détecte le bouton enfoncé du côté A ou B de la télécommande connectée

L’onglet vert / bloc moteur

L’écosystème Powered Up utilise 2 type de moteurs :

  • les moteurs simples : sur les moteurs simples, la vitesse de rotation est par une fréquence envoyée par le hub. il n’y a pas de contrôle interne de vitesse ou position – exemple le moteur M 45303)
  • les moteurs tachymétriques : sur le moteur tachymétrique, un encodeur et des capteurs de positions interne permettent de piloter finement la rotation du moteur (en vitesse angulaire ou en degré) – exemple les moteur L/XL et le moteur 88008

Bloc

Nom du bloc

Commande

Puissance du moteur

Règle la vitesse du moteur – Les nombres positifs tournent dans le sens horaire et le négatif tourne dans le sens anti-horaire – La valeur de puissance peut être comprise entre -100 et 100

ContinuousMedium MotorControl

Règle l’alimentation du moteur connecté au port sélectionné et s’exécute jusqu’à ce que le programme s’exécute sans avoir besoin d’une boucle – Les nombres positifs tournent dans le sens horaire et le négatif tourne dans le sens antihoraire (entre -100 et 100)

MotorFloat

Supprime la vitesse du moteur (roue libre)

ContinuousMediumMotor ControlSpeedSteering

Règle l’alimentation des moteurs connectés aux ports sélectionnés et s’exécute jusqu’à ce que le programme s’exécute sans avoir besoin d’une boucle. La première valeur définit la vitesse, la deuxième valeur définit la direction (modification de la vitesse des moteurs pour diriger le véhicule), la troisième valeur définit si les deux moteurs tournent dans la même direction ou dans des directions opposées.

Frein moteur

Arrête le moteur

TachoMotorGetSpeed

Lit la valeur de vitesse du moteur attaché au port spécifié

TachoMotorSpeed

Faire tourner le moteur tachymétrique sur un port défini avec une vitesse (-100..100)

TachoMotorSpeedDuration

Faire tourner le moteur tachymétrique sur un port défini avec une vitesse (-100..100) pendant la durée (en secondes)

TachoMotorGetPosition

Lit la position du moteur tachymétrique. La position est relative, 0 est la position où le moteur a été mis en marche.

TachoMotorSpeedDegrees

Met le moteur tachymétrique sur le port défini avec une vitesse définie (-100..100) avec la quantité définie (-9999..9999 en degrés). Dans la version 3.1.1, la valeur négative des degrés n’affecte pas le sens de rotation, seule la valeur de vitesse négative

TachoMotorSpeedPosition

Met le moteur tachymétrique sur le port défini avec une vitesse définie (-100..100) à la position définie (-9999..9999 en degrés)

TachoMotorPresetPosition

Règle la position actuelle du moteur tachymétrique sur le port défini à la valeur définie (-9999..9999 en degrés)

TachoMotorHold

Arrête et maintient le moteur du tachymètre sur le port défini

TachoMotorMaxPower

Règle la puissance maximale du moteur tachymétrique sur le port défini (0..100)

TachoMotorAccelerationTime

Définit la durée d’accélération (en secondes) du moteur tachymétrique sur le port défini

TachoMotorDecelerationTime

Définit la durée de décélération (en secondes) du moteur tachymétrique sur le port défini

SynchroMotorPower

Règle indépendamment la puissance (-100..100) d’une paire de moteurs sur les ports définis (AB ou CD)

SynchroTachoMotorSpeed

Règle indépendamment la vitesse (-100..100) d’une paire de moteurs tachymétriques sur les ports définis (AB ou CD)

SynchroTachoMotor SpeedDuration

Définit indépendamment la vitesse (-100..100) d’une paire de moteurs tachymétriques sur les ports définis (AB ou CD) pour la durée (en secondes)

SynchroTachoMotor SpeedPosition

Définit la position (-9999..9999) d’une paire de moteurs tachymétriques sur les ports définis (AB ou CD) avec une vitesse réglée indépendamment (-100..100)

SynchroTachoMotor SpeedSteering     

Définit la vitesse (-100..100) d’une paire de moteurs tachymétriques sur les ports définis (AB ou CD), la commande de direction (-100..100) est de type type char d’assaut. 0 définit une puissance égale pour les deux sorties, 50 alimente uniquement un moteur et 100 alimente les moteurs dans des directions opposées. Une valeur positive-négative pour la commande de direction définit le sens de direction.

SynchroTachoMotor SpeedSteeringDuration

Définit la vitesse (-100..100) d’une paire de moteurs tachymétriques sur les ports définis (AB ou CD), la commande de direction (-100..100) est de type type char d’assaut. Les moteurs tournent pendant la durée définie (en secondes). 0 définit une puissance égale pour les deux sorties, 50 alimente uniquement un moteur et 100 alimente les moteurs dans des directions opposées. Une valeur positive-négative pour la commande de direction définit le sens de direction.

SynchroTachoMotor SpeedSteeringPosition

Définit la vitesse (-100..100) d’une paire de moteurs tachymétriques sur les ports définis (AB ou CD), la commande de direction (-100..100) est de type type char d’assaut. Les moteurs tournent jusqu’à ce que le degré de rotation défini soit atteint (-9999..9999 en degrés). 0 définit une puissance égale pour les deux sorties, 50 alimente uniquement un moteur et 100 alimente les moteurs dans des directions opposées. Une valeur positive-négative pour la commande de direction définit le sens de direction.

L’onglet violet / bloc son et lumière

Bloc

Nom du bloc

Commande

LightPercentage

Règle la puissance de la LED connectée sur le port défini sur% (0..100)

SetHubLightIndexColor AddressablePort

Règle la LED du Hub pour afficher une couleur. Fonctionne sur les hubs Boost / City / Technic

VisionSensorSetColor AddressablePort

Règle la LED du Hub pour afficher la couleur en fonction de l’intensité RVB définie (valeur Rouge, Vert et Bleu en%). Fonctionne sur les hubs Boost / City / Technic

VisionSensorSetColor AddressablePort

Définit la couleur de la LED du capteur. Capteur Boost uniquement

PlaySoundHouse

Litle son sélectionné à partir de la bibliothèque de sons House

PlaySoundWhistle

Lit le son sélectionné à partir de la bibliothèque de sons Whistle

PlaySoundTrain

Lit le son sélectionné à partir de la bibliothèque de sons Train

PlaySoundCar

Lit le son sélectionné dans la bibliothèque de sons de voiture

PlaySoundPlane

Lit le son sélectionné dans la bibliothèque de sons Plane

PlaySoundDog

Lit le son sélectionné dans la bibliothèque de sons Dog

PlaySoundCat

Lit le son sélectionné à partir de la bibliothèque de sons Cat

PlaySoundFart

Lit le son sélectionné à partir de la bibliothèque de sons Fart

PlaySoundHorn

Lit le son sélectionné à partir de la bibliothèque de sons Horn

PlaySoundCrowd

Lit le son sélectionné à partir de la bibliothèque de sons Crowd

PlaySoundRobot

Lit le son sélectionné à partir de la bibliothèque de sons Robot

PlaySoundTarget

Lit le son sélectionné à partir de la bibliothèque de sons Cible

SendIRMessage

Envoie des commandes IR au récepteur IR Power Functions avec le capteur de couleur et de distance connecté au port défini. Le premier paramètre est le port auquel le capteur est connecté. Le second est le canal IR utilisé de 0 à 3 correspondant au port IR 1 à 4. Le troisième définit plusieurs choses, mais pour une utilisation de base, réglez 4 pour contrôler le port rouge, 5 pour contrôler le port bleu. Le quatrième définit la vitesse, 0 est flottant (pas de vitesse), 1 à 7 augmente la vitesse vers l’avant, 8 est arrêté, 9 à F diminue la vitesse vers l’arrière.

SetColorAndDistanceSensorMode

Définit le mode du capteur de couleur et de distance connecté au port défini. Le mode 7 doit être utilisé pour contrôler le récepteur IR Power Functions

L’onglet blanc / bloc opération sur les données

Bloc

Nom du bloc

Commande

LEGODeviceAddress AndPortSelector

Définit le périphérique et le port à utiliser. Le numéro de périphérique (1..4) est défini sur l’écran de connexion (icône Bluetooth dans le coin supérieur gauche). Le port peut être interne (icône du connecteur) ou externe.

LocalVariableFetch

Lit le nombre stocké dans la variable locale. Les variables locales ne sont pas partagées entre le programme principal et les blocs composites.

LocalVariableStore

Met à jour la variable locale pour stocker le numéro. Les variables locales ne sont pas partagées entre le programme principal et les blocs composites.

GlobalVariableFetch

Lit le nombre stocké dans la variable globale – Les variables globales sont partagées entre le programme principal et les blocs composites..

GlobalVariableStore

Met à jour la variable globale pour stocker le numéro – Les variables globales sont partagées entre le programme principal et les blocs composites.

InvertInput

Inverse la valeur d’entrée (+/-)

RandomOperator

Renvoie un nombre aléatoire entre nombre gauche et nombre droit (les deux nombres inclus dans la plage).

EqualOperator

Renvoie si nombre gauche est égal nombre droit.

GreaterThanOperator

Renvoie si le nombre gauche est supérieur au nombre droit.

LessThanOperator

Renvoie si le nombre gauche est inférieur au nombre droit.

NotEqualOperator

Renvoie si nombre n’est pas égal à nombre.

AndOperator

Renvoie vrai si les deux opérateurs sont vrais et sinon faux.

OrOperator

Renvoie vrai si l’un des opérandes est vrai et sinon faux.

PlusOperator

Renvoie le résultat de l’ajout des deux nombres.

MinousOperator

Renvoie le résultat de nombre gauche soustrait avec nombre droit.

MultiplyOperator

Renvoie le résultat de nombre gauche multiplié par nombre droit.

DivisionOperator

Renvoie le résultat du nombre gauche divisé par le nombre droit.

AdvancedMath

Si la position du curseur est inférieure à 50 dans les deux sens (+/-), la LED sur le moyeu est rouge, plus de 50, elle devient verte. L’opérateur avancé « Valeur absolue » est utilisé pour avoir la plage rouge entre -50 et 50. Enfermé dans une boucle pour une surveillance constante de la position du curseur.

Atan2

Renvoie le résultat de la fonction {atan2} (y, x) ou {arctan2} (y, x)

Exposant

Renvoie le résultat de l’augmentation du nombre (première valeur) à la puissance de l’exposant (deuxième valeur).

Max

Renvoie la valeur maximale de nombre (première valeur) et nombre (deuxième valeur).

Min

Renvoie la valeur minimale de nombre (première valeur) et nombre (deuxième valeur)..

Modulo

Renvoie le reste après la division du nombre (première valeur) par le nombre (deuxième valeur).

L’onglet gris-bleu / bloc Composite

Bloc

Nom du bloc

Commande

CreateCompositeBlock

Crée un bloc composite qui agit comme un programme à l’intérieur de notre programme et peut être exécuté par son icône personnalisée.

CompositeBlockFueling

Bloc composite prédéfini dans l’interface Race Car

CompositeBlockJoystick

Bloc composite prédéfini dans l’interface Race Car

CompositeBlockCrash

Bloc composite prédéfini dans l’interface Race Car

L’onglet bleu-vert / bloc personnalisé

Bloc

Nom du bloc

Commande

widget-reporter-block-37

Renvoie la valeur actuelle de l’AccelratorWidget 1.

widget-reporter-block-38

Renvoie la valeur actuelle de l’AccelratorWidget 2.

widget-reporter-block-39

Démarre l’exécution de la bande de programmation lorsque le bouton de la molette est enfoncé.

widget-reporter-block-40

Démarre l’exécution de la bande de programmation lorsque le bouton feu de circulation est enfoncé.

widget-reporter-block-41

Démarre l’exécution de la bande de programmation lorsque le bouton route est enfoncé.

widget-reporter-block-42

Renvoie la valeur actuelle du widget SpeedoMeter 1
Habituellement utilisée pour déclencher l’exécution d’autres bandes de programmation en fonction de sa valeur

.

widget-reporter-block-43

Renvoie la valeur actuelle du SpeedoMeter Widget 2
Habituellement utilisée pour déclencher l’exécution d’autres bandes de programmation en fonction de sa valeur

.

widget-instruction-block-38

Slider Widget 1 qui peut aller de -100 à 100.

widget-instruction-block-39

Slider Widget 2 qui peut aller de -100 à 100.

widget-instruction-block-40

Widget booléen qui peut déclencher le bloc StartOnWheelChange – Déclenche le widget lorsque la condition est vraie.

widget-instruction-block-41

Widget booléen pouvant déclencher le bloc StartOnTrafficlightChange – Déclenche le widget lorsque la condition est vraie.

widget-instruction-block-42

Widget booléen qui peut déclencher le bloc tartOnRoadChange – Déclenche le widget lorsque la condition est vraie.

widget-instruction-block-43

Widget pouvant afficher une valeur numérique sur l’écran du contrôleur (gauche).

widget-instruction-block-44

Widget pouvant afficher une valeur numérique sur l’écran du contrôleur (à droite).

widget-reporter-block-55

Démarre l’exécution de la bande de programmation lorsque le bouton de la molette est enfoncé.

widget-reporter-block-56

Démarre l’exécution de la bande de programmation lorsque le bouton d’outils est enfoncé.

widget-reporter-block-57

Démarre l’exécution de la bande de programmation lorsque le bouton des drapeaux est enfoncé.

widget-reporter-block-58

Démarre l’exécution de la bande de programmation lorsque le bouton rouge est enfoncé

widget-reporter-block-59a

Renvoie la valeur X (horizontale) actuelle du joystick (-100..100).

widget-reporter-block-59b

Renvoie la valeur Y (verticale) actuelle du joystick (-100..100).

widget-reporter-block-59c

Renvoie la distance relative du joystick de 0, la valeur positive / négative dépend de la direction avant / arrière (-100..100).

widget-reporter-block-59d

Renvoie la valeur de l’angle de braquage du joystick (-90..90).

widget-reporter-block-60

Hypothèse – devrait renvoyer la valeur du widget de compteur de vitesse (-100..100) mais reste toujours 0.

widget-reporter-block-62

Renvoie la valeur du widget turbo (0..100).

widget-instruction-block-55

Déclenche le widget de roue lorsque la condition est vraie.

widget-instruction-block-56

Déclenche le widget d’outils lorsque la condition est vraie.

widget-instruction-block-57

Déclenche le widget indicateur lorsque la condition est vraie.

widget-instruction-block-58

Déclenche le widget du bouton rouge lorsque la condition est vraie

widget-instruction-block-59a

Widget de l’axe X (horizontal) du joystick pouvant aller de -100 à 100

widget-instruction-block-59b

Widget de l’axe Y (vertical) du joystick pouvant aller de -100 à 100

widget-instruction-block-59c

Joystick Widget des axes X (horizontal) et Y (vertical) pouvant aller de -100 à 100

widget-instruction-block-60

Définit la valeur du widget compteur de vitesse

widget-instruction-block-62

Définit la valeur du widget turbo

Exemple simple

Le programme suivant analyse des coupleurs via le capteur de proximité/couleur et agit sur le sens de rotation du moteur selon la couleur visualisée.
Ce type de programme a été réalisé pour un train qui fait des aller-retour sur une voie unique avec un repère bleu à chaque bout (gare) et patiente en gare quelques secondes avant de repartir dans l’autre sens.

Décryptage :

Vous aimerez aussi...

Laisser un commentaire