LOCODUINO

Parlons Arduino => Modélisation, Architectures logicielles et matérielles => Discussion démarrée par: Dom59 le avril 17, 2023, 09:28:05 pm

Titre: TCO avec Processing 4.2
Posté par: Dom59 le avril 17, 2023, 09:28:05 pm
Bonjour à tous,
j'ai en projet un petit réseau industriel où j'aimerais pouvoir associer ma multimaus Roco (10764) + Arduino + TCO Processing (sur mon Ordinateur), pas à pas.
Je suis novice en la matière, mais j'ai commencé timidement mon TCO avec Processing et voici mes deux questions:
1) quelqu'un pourrait-il me dire comment je peux assigner un feu violet fixe avec un heurtoir (Butoir) ?
Pour info, dans certains triages, gares et zones industrielles, des heurtoirs se voyaient équipés d'un feu violet fixe, souvent placé sur la traverse du haut ou derrière le heurtoir, du fait de la fréquentation importante des trains marchandises en général, et souvent de nuit.
2) et comment faire une barre de signal jaune ou rouge (de moindre taille) avec manoeuvre par clic dans un pavé droit (indication de présence d'un train (rouge) ou voie libre (jaune)) ?
D'avance je vous remercie, et désolé si je n'ai pas employé les bons termes.
Cordialement
Dominique,
Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 18, 2023, 07:34:01 am
Bonjour

C'est tout à fait possible.

Pour pouvoir vous répondre j'ai besoin de savoir de quelle version de TCO en Processing vous êtes parti (référence de l'article sur le site).

Cordialement

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 18, 2023, 01:19:34 pm
bonjour Pierre,
merci beaucoup de pouvoir m'aider,
j'ai utilisé ceci avec Processing 4.2:

// Fabrication de TCOs pour l'article "TCOs en Processing"
// version 1.1 du 26 decembre 2017
// Pierre Lecouffe

et j'ai ajouté quelques nouveautés (butoir, signal entre autres dans les articles de Denis citant Pierre et Dominique)

Mon tableau comporte les onglets suivants:
Tco 1 (constantes et variables); Formes; Paves; TCO.

Cordialement Dominique


Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 18, 2023, 06:13:00 pm
Bonjour

Dans la version 2.1 (avec le deuxième article) il y a des butoirs PaveButoirDroit et PaveButoirBiais (et aussi des signaux).
J'ai rajouté des butoirs avec des feux violets : PaveButoirDroitFeu et PaveButoirBiaisFeu.
Voir le code ci dessous :

class PaveButoirDroit extends Pave {
  PaveButoirDroit() { // constructeur
    super(new FormeSimple(9,2, 7,2, 7,7, 9,7),
          new FormeSimple(7,3, 0,3, 0,6, 7,6));
  }
}

class PaveButoirDroitFeu extends PaveButoirDroit {
  void dessiner() {
    super.dessiner();
    pushStyle();
    strokeWeight(ZOOM/2);
    stroke(VIOLET);
    point(8,4.5);
    popStyle();
  }
}

class PaveButoirBiaisFeu extends PaveButoirBiais {
  void dessiner() {
    super.dessiner();
    pushStyle();
    strokeWeight(ZOOM/2);
    stroke(VIOLET);
    point(6.8,2.2);
    popStyle();
  }
}

class PaveButoirBiais extends Pave {
  PaveButoirBiais() { // constructeur
    super(new FormeSimple(4,1, 5.75,-0.75, 9.75,3.25, 8,5),
          new FormeSimple(-1,8, 5,2, 7,4, 1,10));
  }
}

class FormeSimple extends Forme {
  FormeSimple(float... xys) { // constructeur
    vertex(xys);
  }
}
Il faut aussi une FormeSimple.

Je regarderais les signaux.

Cordialement

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 18, 2023, 08:30:58 pm
Bonsoir Pierre,
le rendu est magnifique,
effectivement j'avais également copié les "butoirs" et "signaux" dans l'onglet "Paves" de la version 2.1, ainsi que l'ajout de "forme simple" dans l'onglet "Formes".
Encore merci beaucoup d'avoir répondu au débutant que je suis,
Cordialement
Dominique,
Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 19, 2023, 10:09:16 am
Bonjour
comment faire une barre de signal jaune ou rouge (de moindre taille) avec manoeuvre par clic dans un pavé droit (indication de présence d'un train (rouge) ou voie libre (jaune)) ?
Je ne vois pas très bien de quoi il s'agit.

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 19, 2023, 01:13:33 pm
Bonjour Pierre,
Un gestionnaire en C++ pour votre réseau (3) nous parle des itinéraires où l'on peut voir au paragraphe "Mise en œuvre" le schéma d'un TCO virtuel. Sur le quai B, au "PaveDroit" il y a un signal carré fermé et au milieu du "rail" un cercle jaune.
Pourrais-t 'on le remplacer par un petit rectangle jaune centré (laissant apparaître un peu le rail "Gris-Foncé" de chaque côté) avec possibilité de le manœuvrer par clic de souris laissant apparaître un petit rectangle rouge (principe des signaux case "Rouge" feu "Vert").
Le but: "JAUNE", zone non occupée et "ROUGE", zone occupée, par un train, une loco ou et des wagons.
Probablement par la suite la possibilité du traçage d'itinéraires. Sauf erreur de ma part, on peut le nommé comme canton libre (jaune) ou canton occupé (rouge). Ce qui se rapproche de la réalité.
D'avance, merci de votre compréhension pour le novice que je suis, j'ai lu l'article qui était très intéressant, mais côté pratique pour moi pas facile.
Cordialement,
Dominique,

 
Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 19, 2023, 05:33:55 pm
Bonjour

Voila un paveDroitZone, comme sur les TCOs sncf (cela pourrait aussi se faire sur des PaveSignal).

class PaveDroitZone extends PaveDroit {
  boolean occupe=false;
 
  Pave manoeuvrer(boolean b) { occupe=!occupe; return this; }

  void dessiner() {
    super.dessiner();
    pushStyle();
    strokeWeight(ZOOM/3); strokeCap(SQUARE);
    if (occupe) stroke(ROUGE); else stroke(JAUNE);
    line(1,4.5, 8,4.5);
    popStyle();
  }
}
En cliquant dessus il change de couleur.

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 19, 2023, 05:56:12 pm
Bonjour Pierre,
que du bonheur, les nombreux novices comme moi vont se régaler.
Je me permets une nouvelle question; j'ai ceci en "Pave":

class PaveSignal extends Pave {
  int feu;                                        // couleur du feu pour le tco

  PaveSignal(int f) {                            // constructeur
    super(new FormeSimple(3.4,3, 3.4,0.4, 6,0.4, 6,-1, 9,-1, 9,2, 6,2, 6,0.6, 3.6,0.6, 3.6,3),
          new FormeFeu(),
          new FormeDroit()); // RPL par FormeBiais
    feu=f;
  }

  void dessiner() {
    formes[0].dessiner(GRIS_FONCE);              // cible et mat
    formes[1].dessiner(feu);                     // feu
    formes[2].dessiner(couleur);                 // voie
                                                 // for (Forme f : retraits) f.dessiner(GRIS_FOND);// dessin des retraits
  }
 
  Pave manoeuvrer(boolean b) {                   // pour manoeuvres par clic
    switch (feu) {
      case ROUGE:  feu=VERT; break;
      case VERT:   feu=ROUGE; break;
      case VIOLET: feu=BLANC; break;
      case BLANC:  feu=VIOLET ; break;
      case ROUGE_FONCE:  feu=JAUNE; break;
      case JAUNE:   feu=ROUGE_FONCE; break;
     
    }
    return this;
  }
}

De ce fait, j'ai remplacé les termes "PaveSignal" par "PaveBiaisSignal", afin de pouvoir mettre un signal pour un PaveBiais mais il n'est pas reconnu dans l'onglet "TCO"
J'ai dû faire une grosse erreur, qu'en pensez-vous?
Cordialement Dominique,

Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 20, 2023, 08:40:30 am
Bonjour

Le problème est plus compliqué que vous pensez. Il faut tout tourner de 45°, les 3 formes du constructeur :
- la première est une liste de coordonnées (x,y) du dessin du mat et de la cible
- la deuxième est un rond pour le feu, cela pourrait être fait comme pour le feu du butoir avec un point
- la troisième c'est facile en utilisant la forme Biais

Je ne l'ai pas fait pour l'article car c'est assez fastidieux à faire, mais vous pouvez essayer.

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 20, 2023, 10:18:27 am
Bonjour Pierre,
parfois on ne se rend pas compte de certaines difficultés de la programmation. Vous avez une telle facilité de faire et une grande gentillesse à répondre aux personnes comme moi, "chapeau". Mais j'ai trouvé la solution, j'ai ajouté un "PaveDroit" de "Signal" et c'est bon.
....autres questions;
1/
passage à niveau:
création d'un signal rouge clignotant (case ROUGE feu=GRIS; break; mon feu rouge se trouve à droite au lieu de gauche et le clignotant rouge, je ne sais pas le faire si cela est possible. Il me manquera juste le bouton poussoir de commande "PN" sur le tco (il me semble qu'il y a un article).

class PaveSignalPn extends Pave {
  int feu;                                        // couleur du feu pour le tco

  PaveSignalPn(int f) {                            // constructeur
    super(new FormeSimple(),                       // coordonnées de la cible
          new FormeFeu(),
          new FormeDroit());
    feu=f;
  }

  void dessiner() {
    formes[1].dessiner(GRIS_FONCE);              // cible
    formes[1].dessiner(feu);                    // feu
    formes[2].dessiner(couleur);                 // voie
                                                 // for (Forme f : retraits) f.dessiner(GRIS_FOND);// dessin des retraits
  }
 
  Pave manoeuvrer(boolean b) {                   // pour manoeuvres par clic
    switch (feu) {
      case ROUGE:  feu=GRIS; break;
      case GRIS:   feu=ROUGE; break;
     
    }
    return this;
  }
}

2/
j'ai mis en jaune l'aiguille déviée (autre forme), cela me semble plus lisible et les butoirs sont aussi jaunes (autre forme)
est-il possible de mettre les butoirs en noir ?

  Pave manoeuvrer() { manoeuvrer(false); return this; }                    // manoeuvre des aiguilles simples
  Pave manoeuvrer(boolean b) { return this; }                              // manoeuvre des aiguilles doubles (TJD TJS triple)
 
  void dessiner() { int l;                                                 // dessin du pave
    l=formes.length;                                                       // le nombre de formes
    for (int i=0; i<l; i++) {                                              // pour toutes les formes
      if (i==l-1) formes.dessiner(GRIS);                                // la derniere forme (gris ou autre)     
      else        formes.dessiner(JAUNE);                               // les autres formes (Jaune)
    }
  }
 
  void colorer(int c) { couleur=c; }                                       // coloration du pave (pour occupation et itineraires)
}


Cordialement
Dominique

Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 20, 2023, 04:06:46 pm
Bonjour à tous,
en complément du "PaveDroitZone" réalisé par Pierre et utilisable sur la ligne, j'ai fait celui qui est utilisable pour la colonne:

class PaveDroitColonneZone extends PaveDroit {
  boolean occupe=false;
 
  Pave manoeuvrer(boolean b) { occupe=!occupe; return this; }

  void dessiner() {
    super.dessiner();
    pushStyle();
    strokeWeight(ZOOM/3); strokeCap(SQUARE);
    if (occupe) stroke(ROUGE); else stroke(JAUNE);  // couleur des signaux
    line(4.5,1, 4.5,8);
    popStyle();
  }
}

Si cela peut aider,
Cordialement
Dominique
Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 20, 2023, 06:14:09 pm
Bonjour

Pour le clignotement mettre ceci :
boolean cli=false; // bascule
int temps=0; // ancien temps

void draw() {
  if (millis()-temps>=500) { cli=!cli; temps=millis(); } // bascule toutes les 1/2 secondes (500 ms)
  // ...
au début du draw()

Utilisation if (cli) ...JAUNE...; else ...ROUGE...;

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 20, 2023, 07:48:22 pm
bonjour Pierre,
j'ai mis la formule concernant le clic mais j'ai dû zapper quelque chose ... dans l'onglet "Paves",

class PaveSignalPn extends Pave {
  int feuPn;                                        // couleur du feu pour le tco

  PaveSignalPn(int f) {                            // constructeur
    super(new FormeSimple(),                       // coordonnées de la cible
          new FormeFeu(),
          new FormeDroit());
    feuPn=f;
  }

  void dessiner() {
    formes[1].dessiner(GRIS_FONCE);              // cible
    formes[1].dessiner(feuPn);                    // feu
    formes[2].dessiner(couleur);                 // voie
                                                 // for (Forme f : retraits) f.dessiner(GRIS_FOND);// dessin des retraits
  }
 
   boolean cli=false;           // bascule
 int temps=0;                  // ancien temps

 void draw() {
  if (millis()-temps>=500) { cli=!cli; temps=millis(); }       // bascule toutes les 1/2 secondes (500 ms)
  // ...
   
 }
 
  Pave manoeuvrer(boolean b) {                   // pour manoeuvres par clic
    switch (feuPn) {
      case ROUGE:  feuPn=GRIS; break;
      case GRIS:   feuPn=ROUGE; break;
     
    }
    return this;
  }
}

Cordialement
 Dominique,

Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 21, 2023, 09:50:32 am
Bonjour

C'est la fonction draw() du premier onglet qui doit être légèrement modifiée avec le code fourni.

Pour faire clignoter le feu :

  if(cli) formes[1].dessiner(GRIS);  else formes[1].dessiner(feuPn);                    // feu

ou

  formes[1].dessiner(cli?GRIS:feuPn);   // feu

Pour éteindre le feu :   feuPn=GRIS    dans manoeuvrer()
Pour allumer le feu :   feuPn=couleur   dans manoeuvrer()

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 21, 2023, 02:55:14 pm
Bonjour,

Dans l'onglet "Tco1" qui est l'ossature à mon sens du TCO,

il y a bien comme variable: void draw;
je l'ai donc modifié comme prévu et il me dit que le variable "temps" et "cli" n'existe pas.

void draw() {
background(GRIS_FOND);      // couleur du fond
  tco.dessiner();             // dessin du tco

if (millis()-temps>=500) { cli=!cli; temps=millis(); } // bascule toutes les 1/2 secondes (500 ms)
  boolean cli=false; // bascule
int temps=0; // ancien temps
}

Et dans l'onglet "Paves" il me dit que le variable "cli" n'existe pas.

class PaveSignalPn extends Pave {
  int feuPn;                                        // couleur du feu pour le tco

  PaveSignalPn(int f) {                            // constructeur
    super(new FormeSimple(),                       // coordonnées de la cible
          new FormeFeu(),
          new FormeDroit());
    feuPn=f;
  }

  void dessiner() {
    formes[1].dessiner(GRIS_FONCE);              // cible
    formes[1].dessiner(cli?GRIS:feuPn);   // feu
    formes[2].dessiner(couleur);                 // voie
  }
 
  Pave manoeuvrer(boolean b) {                   // pour manoeuvres par clic
    switch (feuPn) {
      case ROUGE:  feuPn=GRIS; break;
      case GRIS:   feuPn=couleur; break;
    }
    return this;
  }
}

Je pense ne pas être loin de la vérité....

Cordialement,
Dominique,


Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 21, 2023, 03:56:06 pm
Il faut remplacer le   void draw() {   par le bout de programme fourni

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 21, 2023, 04:37:08 pm
bonjour Pierre,
le pavé est-il bon?

Dominique,
Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 22, 2023, 11:15:07 am
Faut essayer !

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 23, 2023, 11:24:55 am
Bonjour,

après de nombreuses modifications, cela fonctionne sauf qu'il me met des feux fixes au droit du Pn (gris fixe et clic souris = rouge fixe),  je pense qu'il faut que je modifie le pavé manœuvrer ( boolean b) dans PaveSignalPn et là, je coince.

PaveSignal
 
class PaveSignal extends Pave {
  int feu;                                        // couleur du feu pour le tco

  PaveSignal(int f) {                            // constructeur
    super(new FormeSimple(3.4,3, 3.4,0.4, 6,0.4, 6,-1, 9,-1, 9,2, 6,2, 6,0.6, 3.6,0.6, 3.6,3),  // coordonnées du mât et de la cible
          new FormeFeu(),
          new FormeDroit());
    feu=f;
  }
    boolean  cli=false;
        int temps=0;

  void draw() {
     
       if (millis()-temps>=500) { cli=!cli; temps=millis(); }     
}
  void dessiner() {
    formes[0].dessiner(GRIS_FONCE);              // cible et mat
    formes[1].dessiner(feu);                      // feu
    formes[2].dessiner(couleur);                 // voie
                                                 // for (Forme f : retraits) f.dessiner(GRIS_FOND);// dessin des retraits
  }
  Pave manoeuvrer(boolean b) {                   // pour manoeuvres par clic
    switch (feu) {
      case ROUGE:  feu=VERT; break; P
      case VERT:   feu=ROUGE; break;
      case VIOLET: feu=BLANC; break;
      case BLANC:  feu=VIOLET ; break;
      case ROUGE_FONCE:  feu=JAUNE; break;
      case JAUNE:   feu=ROUGE_FONCE; break;
    }
    return this;
  }
}

PaveSignalPn

class PaveSignalPn extends Pave {
  int feuPn;                                        // couleur du feu pour le tco

  PaveSignalPn(int f) {                            // constructeur
    super(new FormeSimple(),                       // coordonnées de la cible
          new FormeFeu(),
          new FormeDroit());
    feuPn=f;
  }
    boolean  cli=false;
     int temps=0;

  void dessiner() {
    formes[1].dessiner(GRIS_FONCE);              // cible
    formes[1].dessiner(cli?GRIS:feuPn);   // feu
    formes[2].dessiner(couleur);                 // voie
  }
  Pave manoeuvrer(boolean b) {                   // pour manoeuvres par clic
    switch (feuPn) {
      case GRIS:  feuPn=ROUGE; break;
      case ROUGE:  feuPn=GRIS; break;
    }
    return this;
  }
}

Comme le dit Pierre, il me faut mettre: 
Pour éteindre le feu :   feuPn=GRIS    dans manoeuvrer() et Pour allumer le feu :     feuPn=couleur   dans manoeuvrer()
Faut-il conserver l'ensemble du "switch" ou faire autrement ?

Cordialement,
 Dominique,
Titre: Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 24, 2023, 01:54:03 pm
Bonjour

    boolean  cli=false;
     int temps=0;

cela n'a rien à faire dans  PaveSignalPn, cela empêche de clignoter

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 24, 2023, 04:27:47 pm
bonjour,

j'ai enlevé:  "boolean  cli=false; int temps=0; "              dans PaveSignalPn,

et à la ligne              "void dessiner()......
                                   formes[1].dessiner(cli?GRIS:feuPn)"

il me dit: "cli" n'existe pas.
Bon ,je m'accroche, je relis pour tenter de comprendre pas à pas, je me motive, une virgule mal placée ou autre, merci Pierre,
Cordialement,
Dominique


Titre: Re : Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 24, 2023, 05:40:11 pm
j'ai enlevé:  "boolean  cli=false; int temps=0; "              dans PaveSignalPn,
Ils devraient être juste devant le  draw() !!!

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 24, 2023, 05:49:46 pm
je l'ai mis dans le paragraphe:
class PaveSignal avec le draw    comme ceci:

    boolean  cli=false;
        int temps=0;
  void draw() {
       if (millis()-temps>=500) { cli=!cli; temps=millis(); }     
                           
et
dans class PaveSignalPn, il a été enlevé
Titre: Re : Re : TCO avec Processing 4.2
Posté par: Pierre59 le avril 24, 2023, 06:09:30 pm
    boolean  cli=false;
        int temps=0;
  void draw() {
       if (millis()-temps>=500) { cli=!cli; temps=millis(); }     

Non cela ne va pas. les 4 ligne ci dessus sont à mettre à la place du draw() dans le premier onglet !!!

et doivent êtres enlevées du  PaveSignal

Pierre
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 24, 2023, 06:30:12 pm
Dans le 1er onglet "ossature de Tcos" avec les constantes... puis les variables...
il y a:

void draw() {
  background(GRIS_FOND);      // couleur du fond
  tco.dessiner();             // dessin du tco
 
Titre: Re : TCO avec Processing 4.2
Posté par: Dom59 le avril 24, 2023, 06:37:40 pm
YES, c'est bon,
l'élève progresse,
Merci Pierre