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 - Pierre59

Pages: 1 ... 16 17 [18] 19
256
Vos projets / Re : Re : TCO en processing
« le: janvier 20, 2016, 11:29:20 am »
Si quelqu'un connait personnellement Monsieur PCDuino, j'aimerais bien lui parler. ;)
Mais, bon, un écran 27" plus un PCDuino pour gagner une EEPROM ...  ;D
Bonjour

J'ai utilisé un PCduino pour réaliser un petit TCO annexe pour une petite gare terminus. Le PCduino est doté d'un petit écran tactile 1024x600, qui reproduit une partie du TCO principal du réseau (juste la petite gare). Le programme est écrit en Java (j'ai plus l'habitude) mais pourrait être écrit en Processing. Le PCduino communique avec le Mac qui gère le réseau par WIFI.

Si tu veux plus d'infos sur le PCduino, il n'y a qu'a demander !

Cordialement

Pierre

PS pour le plaisir j'ai aussi mis des courbes quadratiques sur les pavés de dessin de réseau, voir la palette sur le fichier joint.


257
Vos projets / Re : TCO en processing
« le: janvier 01, 2016, 10:27:53 am »
Bonjour et bonne année

Si tu comptes utiliser le PC que pour le TCO, un mini PC genre PCduino serait plus adapté, il supporte Processing et l'Arduino.

Pour la ressemblance entre Processing et Arduino c'est normal car Arduino a été inspiré par Processing.

Des pavés TJD ou TJS un peu plus longs (1.5) cela posera des problèmes pour retrouver dans quel pavé on fait un click de souris, pour manoeuvrer un aiguille ou pour choisir un itinéraire par exemple.

Quand j'ai écrit, vite fait, le programme je voulais surtout tester les opérations de rotation et de symétrie, permettant d'avoir tous les cas possibles avec une palette très réduite, et je ne me suis pas beaucoup intéressé au graphisme des pavés que je n'aime pas trop, pas assez de différences entre les TJD, TJS et les croisements, mais je sais comment faire plus joli.

Bon courage.

Pierre

258
Vos projets / Re : TCO en processing
« le: décembre 31, 2015, 06:09:01 pm »
Bonjour

Quand j’avais vu les TCO du gestionnaire Hornby (faits de pavés standards) j’avais écrit un petit programme en Java pour faire des tests, il y a peu de paves de base nécessaires, les variantes nécessaires sont obtenues par des rotations et des symétries simples à faire. Voici un exemple de ce que cela peut donner,  voir dans les deux fichier ci joints:

- la palette des pavés possibles (ils peuvent tous êtres tournés et/ou inversés)
- un exemple de ce que l’on peut faire avec

Le graphisme peut encore être amélioré,au niveau des aiguilles et des TJD.
Je rappelle que Processing c'est du Java.

Pierre




259
Vos projets / Re : Re : Projet servo-aiguille
« le: septembre 23, 2015, 10:38:09 am »
Bonjour
Et ça peut commander l'aiguille en même temps, bien sûr ?
Et, dans l'autre sens, la position vraie de l'aiguille se retrouve sur le TCO ?

Ceci étant, je ne me vois pas utiliser un ordi pour mon train.
Mais si ça marche avec un Arduino....
Bien évidemment on peut commander les aiguilles et inversement afficher la position vraie de celle ci.

Par contre pour marcher sur un Arduino c'est pas évident :
- Processing c'est du Java et pas du C++
- C'est envisageable en C++ avec une bonne  bibliothèque graphique, mais il faudrait un gros Arduino et un grand écran

Pas évident !

Pierre


260
Vos projets / Re : Projet servo-aiguille
« le: septembre 22, 2015, 04:50:51 pm »
Bonjour

Voici un exemple processing vite fait d'une aiguille pour un TCO. Fortement inspiré de mes TCOs.

Si on clique sur la fenêtre l'aiguille change de sens.

Je joins le programme processing exécutable  et une image de mes TCO fabriquée de la même façon.

Pierre

261
Shields et Modules / Re : Carte 4 cantons DCC
« le: septembre 21, 2015, 06:20:07 pm »
Bonjour

Voila mon schéma, pour R je met 4.7K ce qui me donne environ 1mA de sensibilité.  En général j'en monte 6 ou 8 sur une plaque à bandes et je met les R sur un SIL, ce qui me permet de modifier facilement.

En pratique j'utilise un multiplexeur 74HCT151 pour regrouper les 6 ou 8 infos et les envoyer à l'Arduino, parce que j'ai beaucoup de détecteurs.

Pierre

262
Shields et Modules / Re : Carte 4 cantons DCC
« le: septembre 21, 2015, 04:11:04 pm »
Bojour

Pour les optocoupleurs j'utilise des TLP620-4, qui ont l'avantage de fonctionner en alternatif (deux leds tête bêche). La sensibilité dépend de la résistance mise sur le phototransistor, j'arrive à des sensibilités de 1mA.

Pierre

263
Vos projets / Re : Projet servo-aiguille
« le: septembre 19, 2015, 10:53:24 am »
Bonjour

Je viens de passer ton programme sur mon mac. Le port série de l'Arduino apparait bien :

5   /dev/tty.usbmodem1421

Pierre

264
Composants / Re : Etendre les entrées-sortie numériques
« le: septembre 17, 2015, 10:37:19 am »
Bonjour

Le bus I2C est fait pour connecter des circuits sur une courte distance, il est tout a fait indiqué ici. Sur un premier réseau j'utilisais des PCF8574 circuits I2C du même genre que les MCP23017 mais sur 8 bits. Je vais les réutiliser pour commander les, nombreux, feux de mes signaux lumineux, si je n'avais pas déjà ces circuits je mettrais volontiers des MCP23017. Pour les signaux mécaniques j'utilise un PCA9685 toujours sur le bus I2C, en fait c'est un module Adafruit car le PCA9685 est en CMS.

J'utilise aussi deux bus I2C pour relier toutes les cartes électroniques de mon réseau à un ordinateur, toutes ces cartes étant regroupées en un seul endroit sous le réseau.

Il y a des bibliothèques Arduino chez Adafruit pour le MCP23017 et le PCA9685.

Pierre

265
Vos projets / Re : Interface processing
« le: septembre 08, 2015, 11:55:12 am »
Bonjour

J'ai regardé Processing, cela ressemble beaucoup plus à du Java qu'a du C++ (par exemple au niveau des objets et de l'héritage). Mais cela peut être intéressant pour dialoguer entre un PC (Mac) et un Arduino, par exemple pour utiliser la souris et l'écran pour un TCO, ou un gros programme de contrôle d'un réseau.

Pierre

266
Vos projets / Re : Nouveau projet : un petit locodrome
« le: juillet 12, 2015, 11:15:38 am »
Bonjour

Voici comment je vois les signaux (signaux lumineux et BAL)
- CR est un carré avec ralentissement
- CRR est un carré avec rappel de ralentissement
- S est un sémaphore

Pierre


267
Vos projets / Re : Nouveau projet : un petit locodrome
« le: juillet 12, 2015, 09:44:54 am »
Bonjour

Je suppose que l'ovale est banalisé.
Après les coupures, il faudrait savoir quels signaux on veut mettre :
- juste des sémaphores et un cantonnement
- des sémaphores et des carrés pour protéger les aiguilles, et un BAL
après cela on peut préciser les limites des cantons (quelles zones).

Je pense que si on veut un système sûr il faut intégrer les zones avec aiguilles dans des cantons.

Cordialement

Pierre

268
Vos projets / Re : Nouveau projet : un petit locodrome
« le: juillet 12, 2015, 08:31:15 am »
Bonjour

Et les aiguilles dans quel canton sont elles ?

Pierre

269
Bonjour

Quelques réponses :

Citer
chaque zone (ou canton, mais une zone peut inclure une aiguille, pas un canton normalement)

Toujours la polémique avec les cantons. Pour moi une zone est une portion de voie (avec ou sans aiguille(s)) munie d'une détection de présence des trains. Un canton est une portion de voie entre deux sémaphores.

Cela n'exclue pas qu'il puisse y avoir plusieurs zones dans un canton, dont des zones avec aiguilles.
Sur nos réseaux un canton a généralement au moins deux zones une zone de pleine voie et une zone d'arret.

Citer
est-il possible de montrer un exemple simple ?

J'ai regardé pour extraire une toute petite partie de mon réseau, mais c'est pas évident.

Citer
les traitements des signaux remontés par les capteurs aux passage des trains appellent-ils les méthodes des objets directement ?

Les évènements issus du réseau appellent les méthodes sur les objets, par exemple l'occupation et la libération des zones appellent les méthodes occuper() et liberer() de Zone. Il faut seulement veiller que pendant le traitement d'un évènement d'autres ne soient pas pris en compte, pour que la mise à jour de l'état du réseau puisse faire complètement. Plus généralement quand on a appelé une méthode sur un objet il faut que tout ce qui en découle se fasse sans interruption  (pour préserver un état cohérent du réseau).

Pierre

270
Bonjour

Une dernière couche avant les vacances (toujours d'objet) pour les signaux. Les signaux sont très "polymorphes", c'est à dire qu'ils ont pas mal d'aspects et de comportements différents (lumineux, mécaniques, sémaphores, carrés, avertissements, …). Même façon d'écrire que pour les classes précédentes, une classe de base qui contient tout ce qui est commun, des classes dérivées pour les particularités. Sauf qu'ici on va regrouper des particularités, conduisant à de l'héritage d'héritage (pas de panique c'est tout naturel).

La première classe est la classe Signal :

typedef unsigned int typeFeux;

enum Feu {E=0,Vl=1,A=2,S=4,C=8,R=16,RR=32,M=64,Cv=128,D=256};

   
class Signal {
protected:
  typeFeux feu=E; // 16 cas possibles (16 bits)
public:
  virtual boolean ouvrir() { /* commande du signal */ return true; }
  virtual boolean fermer() { /* commande du signal */ return true; }
  boolean aubiner() {  return fermer();  }

  boolean ferme() { return feu&(S|C|Cv); }
  boolean v30() { return feu&RR; } // vitesse 30
  boolean r30() { return feu&A|R; } // ralentissement a 30
  };

  virtual typeFeux feux() { return E; }
  virtual void maj() {}
 
  virtual Signal* suivant() { return NULL; }
  virtual Signal* precedent() { return NULL; }
  virtual boolean occupe() { return false; } // occupation du canton

// methodes utilitaires
  Signal* selon(Aiguille &a,Signal &s1,Signal &s2) { return a.directe()?&s1:&s2; }

  boolean occupee(Zone &z) { return z.occupee(); }
  boolean occupees(Zone &z1,Zone &z2) { return z1.occupee() || z2.occupee(); }
  boolean occupees(Zone &z1,Zone &z2,Zone &z3) { return z1.occupee() || z2.occupee() || z3.occupee(); }
};


La classe Signal comporte une variable mémorisant l'état des feux, les valeurs des feux sont des puissances de 2 pour pouvoir faire des opérations ensemblistes (unions, intersections) facilement. Les fonctions ouvrir() et fermer() seront définies dans les classes dérivées. La fonction aubiner() ferme le signal (on pourrait éventuellement la redéfinir en cas de besoin). Les fonctions ferme(), v30() ou r30() sont des fonctions utilitaires ainsi que les fonctions occupee(s)() et la fonction selon(). Les fonctions fonctions feux() et maj() seront définies dans les classes dérivées, la fonction feux() "calcule" les feux à l'ouverture du signal, la fonction maj() est appelée par le signal suivant lors d'un changement de feux. La fonction utilitaire selon() retourne le signal suivant en fonction de la position de l'aiguille (facilité d'écriture). Les fonctions utilitaires occupee(s)() testent l'occupation du canton (utiles pour les cantons multi-zones notamment dans les gares).

Quelques classes correspondant à des signaux particuliers :

La classe Carré violet est la plus simple, pas d'interactions avec d'autre signaux. On peut aubiner le signal lors de l'occupation de la zone qui suit le signal. Cette classe peut être utilisée directement (sans faire de nouvelles classes). Pour ce type de carré on sait définir les méthodes ouvrir(), fermer() (feux() et maj() ne servent pas) :

class CarreViolet:public Signal {
  boolean ouvrir() { feu=M;  /* commande signal */ return true; }
  boolean fermer() { feu=Cv;  /* commande signal */ return true; }
};

Exemple de carré violet :

CarreViolet cv5;


La classe Carré (sans sémaphore) est plus intéressante car elle dépend d'autres signaux. On peut aubiner le signal lors de l'occupation de la zone qui suit le signal. Pour ce type de signal on sait définir les méthodes ouvrir(), fermer(), feux() et maj(), par contre les fonctions suivant() et precedent() dépendent d'un carré particulier (topologie du réseau), il faudra donc hériter de Carre pour un carré particulier. La classe Carre :

class Carre:public Signal {
  boolean ouvrir() { feu=feux(); precedent()->maj(); /* commande signal */ return true; }
  boolean fermer() { feu=C; precedent()->maj(); /* commande signal */ return true; }

  typeFeux feux() { // feux a l'ouverture
    if (suivant()->ferme()) return A; else return Vl;
  }

  void maj() { typeFeux f; // appele par le signal suivant
    if (ferme()) return; // pas de propagation si pas de changement
    f=feux(); if (f!=feu) { feu=f; precedent()->maj(); }
  }
};


Exemple de carré  particulier :

class C2:public Carre {
  virtual Signal* suivant() { return selon(a2,s1,s3); } // selon a2
  virtual Signal* precedent() { return &s1; }
};


le signal suivant dépends d'une aiguille.

La classe Sémaphore interagit avec d'autres signaux et avec des zones. Le sémaphore est fermé (aubiné) par l'occupation de la première zone du canton, lors de la libération de la dernière zone du canton ouvrir() est appelée pour mettre à jour les feux. La fonction occupe() teste l'occupation du canton (pour les cantons multi-zones). Pour ce type de signal on sait définir les méthodes ouvrir(), fermer(), feux() et maj(), par contre les fonctions suivant() et precedent() dépendent d'un sémaphore particulier, il faudra donc hériter de Semaphore pour un sémaphore particulier. La classe Semaphore :

class Semaphore:public Signal {
  boolean ouvrir() { feu=feux(); precedent()->maj(); /* commande signal */ return true; }
  boolean fermer() { feu=S; precedent()->maj(); /* commande signal */ return true; }

  typeFeux feux() { // feux a l'ouverture
    if (occupe()) return S; else // canton occupe ( precaution )
    if (suivant()->ferme()) return A; else return Vl;
  }

  void maj() { typeFeux f; // appele par le signal suivant
    if (ferme()) return; // pas de propagation si pas de changement
    f=feux(); if (f!=feu) { feu=f; precedent()->maj(); }
  }
};


Exemple de sémaphore particulier :

class S2:public Semaphore {
  virtual Signal* suivant() { return &s2; }
  virtual Signal* precedent() { return &s1; }
  virtual boolean occupe() { return occupees(za,zb,zc); } // occupation du canton (3 zones)
};

Voila avec cette façon de programmer on peut prendre en compte toutes les configurations de signal possible, j'ai sur mon réseau des carrés avec manoeuvre ou rappel de ralentissement et  en plus sémamaphore (pour les itinéraires permanents).

Je n'ai pas de classe Canton, mais cela serait possible.

Comme pour des zones et les itinéraires il manque les constructeurs (les destructeurs ne sont pas utiles ici), ce que je voudrai montrer ici c'est essentiellement l'aspect conceptuel de l'approche objet. Les classes ne sont pas exemptes d'erreurs, ni de mauvaises écritures (notamment Zone qui n'utilise pas les pointeurs où il faudrait). Bien qu'ayant enseigné, il y longtemps, le C++, j'ai beaucoup oublié (mais cela revient) car maintenant je fais du Java (je transcode ici du Java en C++), de plus je ne peux pas faire de tests, je peux juste compiler pour vérifier.

On pourrait imaginer de construire une bibliothèque de classes, mais cette bibliothèque ne pourrait pas être utilisée directement comme d'autres bibliothèques, il faudrait écrire des classes héritant des classes de la bibliothèque pour beaucoup de composants du réseau (zones, aiguilles, signaux, …), car ce sont ces classes qui définissent la topologie du réseau.

Bonnes vacances.

Pierre


Pages: 1 ... 16 17 [18] 19