Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Dominique

Pages: 1 ... 60 61 [62] 63 64 ... 170
916
Les réseaux / Re : Projet Dominique
« le: août 18, 2020, 03:09:24 pm »
A ce stade, je pense que chacun pourra adapter cette méthode à le représentation de son propre réseau.

J'aborderai plus tard l'intégration du TCO graphique avec le reste du gestionnaire.

A suivre...

917
Les réseaux / Re : Projet Dominique
« le: août 18, 2020, 02:59:44 pm »
Donc le tracé de mon réseau sur un écran graphique est constitué de multiples segments de droite et d'arcs.

Les bibliothèques UTFT nous donnent tout ce qu'il faut :
#include <UTFT.h>
#include <UTFT_Geometry.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>
#include <UTFT_SdRaw.h>
#include <SdFat.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];

// CTE TFT LCD/SD Shield for Arduino Due       : <display model>,25,26,27,28
UTFT           myGLCD(CTE50,25,26,27,28);
UTFT_Geometry  geo(&myGLCD);
UTouch         myTouch(6,5,32,3,2);
UTFT_Buttons   myButtons(&myGLCD, &myTouch);


int max_x, max_y;
int kolor[16] = {VGA_WHITE,VGA_RED,VGA_GREEN,VGA_BLUE,VGA_SILVER,VGA_GRAY,VGA_MAROON,
VGA_YELLOW,VGA_OLIVE,VGA_LIME,VGA_AQUA,VGA_TEAL,VGA_NAVY,VGA_FUCHSIA,VGA_PURPLE,VGA_BLACK};
int kolori[4] = {VGA_WHITE,VGA_RED,VGA_GREEN,VGA_BLUE};

int K_fond = VGA_SILVER; // indice 4
int K_trace = VGA_GRAY;
int K_ferme = VGA_BLACK;
int K_ouvert = K_trace;
int K_iti = VGA_WHITE;
int K_occ = VGA_RED;

Donc il faut comencer par des routines graphiques de segment en d'arc :
///////////////////////// ROUTINES GRAPHIQUES ////////////////////////
// barre horizontale long=+/-, vers droite s1 l>0 ou gauche si l<0
void drawbarreH(int x, int y, int l) {
  myGLCD.fillRect(x,y-2,x+l,y+2);
}
// barre verticale long=+/-, vers droite s1 l>0 ou gauche si l<0
void drawbarreV(int x, int y, int l) {
  myGLCD.fillRect(x-2,y,x+2,y+l);
}

Maintenant interviennent le papier, le crayon et la calculatrice pour déterminer les paramêtres de ces fonctions appelées dans chaque aiguille et chaque zone.

C'est bien le but de ce dessin renseigné soigneusement :


918
Les réseaux / Re : Projet Dominique
« le: août 18, 2020, 02:52:03 pm »
Vu le nombre d'objets aiguilles (21) et zones (47), autant passer en C++.

Leurs classes sont définies au début du fichier :
// classe de base AIGUILLE Graphique

class GAiguille {
public:
  boolean etat=true; // directe (true) ou deviee (false)
  int no;       // numéro de l'aiguille
  int nz;       // le numéro de Zone ou est l'aiguille
 
  GAiguille(int n, int z) { no=n; nz=z; } // constructeur utilisé

  boolean directe() { return etat; }  // méthode de test
  boolean deviee()  { return !etat; } // méthode de test
  void directer() {etat=true;}   // mettre l'aiguille en position directe
  void devier()   {etat=false;}  // mettre l'aiguille en position deviee
  virtual void tracer(int c); // TCO c= couleur K_ouvert ou K_iti ou Kocc selon etat, K_ferme selon !etat
};
 
// classe de base ZONE Graphique

class GZone {
public:
   boolean etat=false; // libre (false) ou occupé (true)
   int no; // le numero de la zone pour commander l'electronique ( TCO, relais, ... )
   int na=-1; // le numéro de l'aiguille dans la zone, sinon -1
   int nb=-1; // le numéro de l'aiguille dans la zone, sinon -1

   GZone(int n) { no=n; } // constructeur mini
   GZone(int n,int a) { no=n; na=a; } // constructeur   OPTION
   GZone(int n,int a,int b) {no=n; na=a; nb=b;} // constructeur   OPTION
 
   void occuper() {etat=true;} // appelée par la rétrosignalisation lors de l'occupation d'une zone
   void liberer() {etat=false;} // appelée par la rétrosignalisation lors de la liberation d'une zone
   virtual void tracer(int c, boolean s); // TCO c= couleur K_ouvert ou K_iti ou Kocc selon etat, K_ferme selon !etat
};


Ces classes définissent les fonctions qu'il faudra appeler par le gestionnaire en fonction des occupations, libérations, manœuvres d'aiguilles, tracés graphiques.
Ces classes de base servent de modèle aux classes spécifiques de chaque zone et chaque aiguille.

Les classes aiguille sont dénommées GA0 à GA20.
par exemple :
class GA0: public GAiguille {
  public:
  GA0(int n,int z):GAiguille(n,z) { no=n; nz=z; } // constructeur utilisé
  void tracer(int c);   
};
void GA0::tracer(int c) {
  if (etat) {//droit
    myGLCD.setColor(K_ferme);
    geo.drawArc(90, 358, 38, 0, 45, 5);
    myGLCD.setColor(c);
    drawbarreH(90, 320, 27);
  }
  else {     // devié
    myGLCD.setColor(K_ferme);
    drawbarreH(90, 320, 27);
    myGLCD.setColor(c);
    geo.drawArc(90, 358, 38, 0, 45, 5);
  }
}
GAiguille* Ga0 = new GA0(0,26); // a0  est dans la zone z26

On voit que le dessin d'une aiguille est la combinaison de segments de droite et d'arc avec 2 cas différents selon que l'aiguile est droite ou déviée.

De même, les classes zones sont dénommées de GZ0 à GZ46.
Par exemple :
class GZ2 : public GZone {
  public:
  //GZone(int n) { no=n; } // constructeur mini
  GZ2(int n,int a):GZone(n,a) { no=n; na=a; } // constructeur   OPTION
  //GZone(int n,int a,int b) {no=n; na=a; nb=b;} // constructeur   OPTION
  void tracer(int c,boolean s); // TCO c= couleur K_ouvert ou K_iti ou Kocc selon etat, K_ferme selon !etat
};
void GZ2::tracer(int c, boolean s) {
  myGLCD.setColor(c);
  Ga15->tracer(c);
  if (Ga15->directe()) {drawbarreH(547, 72, 26);}
  myGLCD.setColor(K_trace);
  if (Ga15->deviee()) {drawbarreH(547, 72, 26);} // Z2 contient a15
}
GZone* Gz2 = new GZ2(2,15); 

On remarque ici, dans la zone 2 qu'il y a une aiguille 15, d'ou les appels aux fonctions graphiques de l'aiguille 15.

A la fin, pour manupuler les objets, les tables d'objets indexées sont créees :
////////////////////////// table des aiguilles

GAiguille* tableGA[MaxAig]= {
  Ga0, Ga1, Ga2, Ga3, Ga4, Ga5, Ga6, Ga7, Ga8, Ga9, Ga10, Ga11,
  Ga12, Ga13, Ga14, Ga15, Ga16, Ga17, Ga18, Ga19, Ga20 };
 
/////////////////// TABLE DES ZONES /////////////////

GZone* tableGZ[MaxZone]=  { 
    Gz0, Gz1, Gz2, Gz3, Gz4, Gz5, Gz6, Gz7, Gz8, Gz9, Gz10, Gz11, Gz12, Gz13, Gz14, Gz15,
    Gz16, Gz17, Gz18, Gz19, Gz20, Gz21, Gz22, Gz23, Gz24, Gz25, Gz26, Gz27, Gz28, Gz29, Gz30,
    Gz31, Gz32, Gz33, Gz34, Gz35, Gz36, Gz37, Gz38, Gz39, Gz40, Gz41, Gz42, Gz43, Gz44, Gz45, Gz46  };
   
   
void drawallzones(int k) {
  for (int i=0; i<MaxZone; i++)
 {
  tableGZ[i]->tracer(k, true);
 }
}
////////////////////////////////////////////////////////////////////////////////////

On remarque la fonction drawallzones() qui sert à aficher l'ensemble du circuit au démarrage et lors des rafraichissements d'écran.


919
Les réseaux / Re : Projet Dominique
« le: août 18, 2020, 02:35:19 pm »
Pour continuer la description de mon réseau, j'aborde maintenant le TCO graphique que j'ai intégré au gestionnaire des circulations. Ce gestionnaire tourne sur un DUE avec une interface CAN. Il reçoit donc tous les messages de rétrosignalisation, ainsi que ceux de la traction. Je n'aborde pas ici le fonctionnement du gestionnaire (encore en chantier) mais seulement l'onglet Graphiques.h du programme gestionnaire graphique-tactile sur DUE que je donne en PJ : (Graphiques.h).

Il y a 1360 lignes !
C'est normal, vu le nombre de zones (47) et d'aiguilles (21).

Mais cela nécessite des explications que je vais donner progressivement :

Le tracé réel de mon réseau est à peu près ceci (RéseauDBReel.jpg)

Les couleurs correspondent à l'altitude (bleu en bas, vert au milieu et rouge en haut).

Mais pour caser tout cela dans un écran 5 pouces, j'ai replié les grandes longueurs dans le milieu entre les 2 gares, afin de permettre la visualisation plus confortable des occupations (MonResauTypeTCO.png).


Maintenant, pour programmer tous les segments et arcs qui constituent les 21 aiguilles et les 47 zones (qui incluent parfois une ou plusieurs aiguilles), il faut determiner les coordonnées graphiques de tous les éléments graaphiques, ce qui est fastidieux et donne ceci (tracéDB0.png)


Je vais expliquer le code dans une réponse suivante ...

En ce qui concerne le matériel utilisé : j'ai combiné un Arduino DUE avec un écran 5 pouces et la carte d'interface Sainsmart comme présenté dans la page suivante :
https://www.ebay.com/itm/5-inch-800x480-TFT-LCD-Resistive-Touch-Shield-for-Arduino-Due-MEGA-2560-Library/291874076554?

920
Attention, pour la version qui supporte l’ESP32, j’ai aussi apporté des modifications qui permettent la lecture des CVs, notamment pour la lecture de l’adresse d’un décodeur.
Voir : https://forum.locoduino.org/index.php?topic=922.msg10754#msg10754

Je vais regarder ces modifications de Jérôme.

Et je pourrai les tester sur la platine LaBox dès que j’aurai un moment la semaine prochaine.

J'ai eu un moment de répits (les enfants dorment) et regardé la modification de Thomas Peterreins du 28.5.2018 (sur trainboard) :
Il me semble que j'avais testé ce remplacement de loadPacket(0, resetPacket, 2, 1); par loadPacket(0,bRead,3,1); sur la version LaBox, donc pour l'ESP32 et je n'avais pas constaté d'amélioration (impossible de lire aucun CV, quelque soit le décodeur, la lecture du courant de l'impulsion de réponse ne tombant pas au moment où elle a lieu, mais c'est spécifique l'ESP32 et j'ai mis en place une ruse pour l'attraper à tous les coups).
Par acquis de conscience, je vais regarder cette modification à nouveau, bien que je n'ai pas de décodeur D&H.

En ce qui concerne la constante ACK_SAMPLE_COUNT, j'ai conservé la valeur de 500, après plusieurs tests avec une valeur inférieure et sans succès, probablement parce que l'ESP32 est bien plus rapide.

921
Citer
Y at-il des ouvrages de vulgarisation (style "Arduino pour les nuls")?.
Oui  :D

Mais, vue la quantité de matériel analogique, j’essayerai de rester en analogique en créant des circuits indépendants pilotes chacun par une manette (3 circuits pour 3 joueurs). Le pilotage sera manuel et permettra de comprendre l’électricité avant d’aborder l’électronique. Il faut monter progressivement en connaissances.

Sinon, pour jouer en digital, il faut commencer simple avec une centrale DCC++ simple comme préconisé msport, 3 manettes filaires et aucune sécurité.



922
Attention, pour la version qui supporte l’ESP32, j’ai aussi apporté des modifications qui permettent la lecture des CVs, notamment pour la lecture de l’adresse d’un décodeur.
Voir : https://forum.locoduino.org/index.php?topic=922.msg10754#msg10754

Je vais regarder ces modifications de Jérôme.

Et je pourrai les tester sur la platine LaBox dès que j’aurai un moment la semaine prochaine.

923
Présentez vous ! / Re : Réseau à l'échelle TT 1:120
« le: août 17, 2020, 10:38:22 pm »
Ce qui donne ceci (TraceDB2.jpg)


Avec les tracés en blanc pour les itinéraires "passant" en fonction des positions des aiguilles. Les segments en rouge sont ceux qui sont d'accès impossibles.

J'ai ajouté 2 rangés de boutons tactiles en haut et en bas pour commander directement n'importe quoi comme des aiguilles ou des itinéraires (avec des groupes d'aiguilles), ou lancer des simulations ou des scénarii pré-programmés.

J'ai ajouté les possibilités d'afficher les numéros de zones et d'aiguilles, ce qui est utile pour la mise au point.

C'est petit sur une écran 5 " mais très lisible (ma prochaine version sera en 7 ").

924
Présentez vous ! / Re : Réseau à l'échelle TT 1:120
« le: août 17, 2020, 10:25:53 pm »
msport avait raison : l'onglet Graphiques.h de mon programme gestionnaire graphique-tactile sur DUE compte bien 1360 lignes de code Arduino que je joins en PJ (Graphiques.h).

C'est normal, vu le nombre de zones et d'aiguilles.

Mais cela nécessite des explications que je vais donner progressivement :

Le tracé réel de mon réseau est à peu près ceci (RéseauDBReel.jpg)

Les couleurs correspondent à l'altitude (bleu en bas, vert au milieu et rouge en haut).

Mais pour caser tout cela dans un écran 5 pouces, j'ai replié les grandes longueurs dans le milieu entre les 2 gares, afin de permettre la visualisation plus confortable des occupations (MonResauTypeTCO.png).


Maintenant, pour programmer tous les segments et arcs qui constituent les 21 aiguilles et les 47 zones (qui incluent parfois une ou plusieurs aiguilles), il faut determiner les coordonnées graphiques de tous les éléments graaphiques, ce qui est fastidieux et donne ceci (tracéDB0.png)


Je vais expliquer le code dans une autre réponse...

925
Je conseille de lire d’abord les articles sur le DCC et sur l’architecture des réseaux, le cantonnement, la retrosignalisation.

Ainsi que sur les réalisations des modélistes, présentées dans ce forum.

Cela te donnera une bonne idée du travail à faire et des compétences nécessaires.

Ensuite, faire un cahier des charges pour définir l’objectif.

Citer
J'ai zéro niveau en électronique, mais j'ai vu sur des sites qu'il était possible "d'automatiser" un pont tournant jouef, et plutôt que d'acheter un pont transbordeur cc Brawa ou Heljan, chers d'occasion, il était possible de transformer un pont transbordeur AC Märklin en CC, beaucoup plus abordable.
Sur le plan de l'électronique, pour éviter ma bête noire de soudures affreuses, javais pensé (suite à des recherches internet) aux cartes pré-perforées, Shields, Optocoupleurs Arduino, Nano, Uno, Méga et d'un mode d'emploi simple et explicite. Commandes centralisées permettant de faire tourner plusieurs trains en même temps. (Peut-être deux voies avec des sens de circulation unique et opposés, mais avec des possibilités de manoeuvre: pont tournant, pont transbordeur, bouche de retournement etc...
Données perso: Du pas cher, fiable, simple, qui évitent au maxi les liaisons (tout problème lié à une connectique complexe).

Avec ça comme pré requis il est certain qu’il faut faire l’effort d’une sérieuse formation .

D’après ce que tu en auras retenu, nous pourrons répondre à tes interrogations.

926
Je crois que je vais faire un point sur ce fichier PacketRegister qui contient les fonctions « DCC » essentielles, que j’ai souvent triturées et testées.

Mais je viens juste de rentrer de vacances reposantes avec mes 6 petits enfants  ???. Laissez moi le temps de me replonger dans le sujet.


927
Présentez vous ! / Re : Re : Réseau à l'échelle TT 1:120
« le: août 13, 2020, 10:50:00 am »
Bonjour,
Sauf erreur, le TCO de Dominique fait 1350 lignes de code, c'est du Processing (langage proche de celui de l'Arduino) dédié graphismes.

Pour les boutons, il faut commencer par les exemples de la bibliothèque :
#include <TouchScreen.h>
https://github.com/adafruit/Adafruit_TouchScreen

Pas de bol c’est une erreur !
Mon TCO ci dessus est programmé à 100% en Arduino et utilise la bibliothèque graphique d’Adafruit qui contient des ordres graphiques simples. En fait j’ai présenté ce TCO dans la discussion sur processing que j’ai utilisé à un moment mais je ne veux sur mon réseau aucun ordinateur, que des Arduino.

Pour les boutons, msport a raison.

Laissez moi rentrer chez moi en fin de semaine et je publierai mon code Arduino.

Mais Christian aussi a raison : il faut bien définir ses besoins et savoir s’y tenir. Je donnerai donc aussi la recette pour partir d’un dessin de réseau et obtenir son rendu graphique correspondant. Rien de magique, juste des heures de réflexion et de papier-crayon  :P

929
Les réseaux / Re : Projet Dominique
« le: août 12, 2020, 03:42:33 pm »
Bon, je me disperse tellement que des bouts de description de mon réseau se retrouvent un peu partout dans ce forum  :o >:(

Je vais essayer de rassembler les morceaux !

930
Présentez vous ! / Re : Réseau à l'échelle TT 1:120
« le: août 12, 2020, 03:25:48 pm »
J’ai eu l’occasion de représenter mon réseau sur un écran tactile 5 pouces piloté par un Arduino Due :



Si tu veux les sources je suis disposé à les donner avec les méthodes de dessins qui vaudraient un articles à elles seules  ;D

Mais ce n’est pas sorcier !

On en parle dans cette discussion :
http://forum.locoduino.org/index.php?topic=166.msg2926#msg2926

Pages: 1 ... 60 61 [62] 63 64 ... 170