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

Pages: 1 ... 8 9 [10] 11 12 ... 58
136
Bonjour Laurent,

Version 3V "sensitive"
V = 3V
R = 60r
I = U/R = 3/60 = 0.020A = 20mA ( pile bien ca!! pile la reco de 20mA) ca passe sans transistor.

Ne pas ajouter de R en plus de la bobine du relais car on a alors au borne de celui ci un diviseur de tension...

Le hic de la seconde solution si "parfaite" c est la dispo du relais "Sensitiv". >"T' en a pas t'es marron!" alors qu'avec un transistor toutes les versions vont bien!

Bon j'ai trouvé des 3v sensitive en bistable sur E-bay. J'en ai commandé 10 on verra bien ! Du coup plus de transistor.

https://www.ebay.fr/itm/266166991968

137
Bus CAN / Re : Question mise en place CAN dans la centrale DCC
« le: février 05, 2024, 06:48:57 pm »
Dans le fichier :
Test_CommCan_LaBox_2/Test_CommCan_LaBox_2.ino

tu as tous les exemples pour les envois de commande. Tu peux recopier tous les fichiers sur un ESP32 équipé du CAN pour envoyer ces messages et relier avec un autre ESP32 (en CAN) pour la Box:

Les principales fonctions pour commander des locomotives dans le loop :

void loop() {
  /*------------------------------------------------------------------
   Serie de commandes envoyées a LaBox pour tests
  --------------------------------------------------------------------*/

  // Power on
  laBox.setPower(on);
  delay(100);

  // Test des differentes fonctions du decodeur
  for (byte i = 0; i <= 28; i++) {
    // Activation
    loco->fn[i] = on;
    laBox.setFunction(loco, i);
    delay(1000);

    // Desactivation
    loco->fn[i] = off;
    laBox.setFunction(loco, i);
    delay(100);
  }

  // Active les feux et le bruit de la locomotive
  laBox.toggleFunction(loco, 0);
  laBox.toggleFunction(loco, 1);
  delay(1000);

  // Programmation de CV POM
  // WRITE CV on MAIN   <CAB CV VALUE>
  laBox.writeCVByteMain(loco, 63, 75);
  delay(100);

  // Avant 25
  loco->speed = 25;
  loco->direction = 1;
  laBox.setThrottle(loco);
  delay(15000);

  // Arret de la locomotive
  loco->speed = 0;
  laBox.setThrottle(loco);
  delay(5000);

  // Avant 50
  loco->speed = 50;
  laBox.setThrottle(loco);
  delay(15000);

  // Arriere 50
  laBox.toggleThrottleDir(loco);
  delay(15000);

  // Arriere 75
  loco->speed = 75;
  laBox.setThrottle(loco);
  delay(15000);

  // emergency stop
  laBox.emergency();
  delay(1000);

  // power off
  laBox.setPower(off);
  delay(5000);
}

Petit réglage auparavant dans le setup :

void setup() {
  Serial.begin(115200);
  CanMsg::setup();

  loco->address = 65;

  xTaskCreatePinnedToCore(&recepCan, "recepCan", 2 * 1024, NULL, 5, NULL, 0);
}

On dit ici que la loco a l'adresse 65, il faut mettre une adresse qui correspond à la loco testée

Christophe


138
Bus CAN / Re : Re : Re : Question mise en place CAN dans la centrale DCC
« le: février 05, 2024, 04:12:10 pm »
Pour la partie message CAN, j'ai bien parcouru les fichiers .cpp et .h , assez compliqué de s'y retrouver.
Un peu plus abordable en regardant le code qui envoie automatiquement des ordres à la centrale mais je ne comprend pas tout quand même:
Par contre, jai passé un peu de temps avec la bibliotheque ACAN et je visualise assez bien la structure d'un message.
Pourrais tu m'indiquer quelle structure de données a tu choisis pour commander Labox?

Par exemple, pour controler une loco,  tu ecris
CanMsg::sendMsg(0, cmde, resp, loco->address & 0xFF00, loco->address & 0x00FF, loco->speed, loco->direction);
Pourrais tu expliquer un peu en détail?
-0
-cmde : adresse d'envoi qui défini le type de message et sa priorité? ( controle loco, fonction loco, arret d'urgence,....) 
-resp : reponse mais pas bien compris
- je n'ai pas compris les adresse locos et pourquoi 2 datas
-speed/direction OK

Bonjour becbunsen,

Je te remercie de poser ces questions car je suis certain que d’autres sont comme toi mais n’osent pas poser ces questions. C’est dommage, le CAN n’est pas aussi compliqué qu’il n’y parait à condition de passer le temps nécessaire à le comprendre.

Le CAN, c’est une partie matérielle et surtout, ce qui va vous intéresser ici, une messagerie. Je vais me risquer à prendre l’analogie d’une phrase dans le langage courant. Phrase qui doit respecter une certaine structuration pour être comprise par celui ou ceux à qui elle est destinée.

La trame CAN est en quelque sorte à la communication CAN ce que la phrase est au langage avec un sujet, un verbe un complément d’objet direct…

Fondamentalement la trame CAN se divise en un identifiant (sur 11 ou 29 bits) et un champ de données dont la taille totale peut atteindre 64 bits (ou 8 octets) et que l’on divise souvent en 8 champs de 8 bits : data[0], data[1], data[n]

On est libre du nombre de champ data que l’on envoie selon nos besoins, dans certains cas on peut même n’envoyer aucune data ou jusqu’à 8 champs de 8 bits.

Le champ d’identification du message sur 11 ou 29 bits est totalement libre dans sa construction et c’est ce qui le rend parfois difficile à comprendre.

La principale règle est que, pour des questions de priorité de distribution sur le bus et de gestion des conflits entre messages qui arrivent en même temps sur le bus, ce sont les messages qui ont les identifiants les plus faibles qui sont prioritaire sur les autres.

Ainsi, le message qui aurait pour identifiant 1 est prioritaire sur l’identifiant 536 870 912 (29 bits à 1).

Si je reprends mon analogie avec le langage, il va falloir passer un peu de temps pour structurer intelligemment les informations que l’on va placer dans l’identifiant et l’ordre dans lequel on va placer ces informations.

Dans le code que j’ai proposé, on trouve cela illustré ici :

  uint16_t hash = 0x1801;

  frame.id |= prio << 25;  // Priorite
  frame.id |= cmde << 17;  // Commande
  frame.id |= resp << 16;  // Reponse : Commande = 0 / Reponse = 1
  frame.id |= hash;        // Hash
  frame.ext = true;

frame.id, dans la bibliothèque ACAN_ESP32 correspond à l’identifiant

J’ai choisi que la priorité des messages tiendrait sur 4 bits et aurait pour valeur 0 (car pour moi les messages à la centrale sont plus prioritaires que les autres sur le bus) et je place cette valeur à la position 25 sur les 29 bits de l’identifiant (que j’ai choisi long).

frame.id |= prio << 25;  // Priorite
Position 25 plus longueur de priorité 4 bits remplissent bien les bits 25 à 29 de l’identifiant

J’ai ensuite décidé que les bits qui seront lu comme des bits pour identifier quelles commandes de locomotives allaient être exécutés viendraient se positionner à partir du bit 17 de l’identifiant et tiendraient sur 8 bits.

Concernant l’information de réponse dont tu parles, j’ai jugé que cette information était très intéressante pour savoir s’il s’agissait d’une commande envoyée bit 16 à 0) ou si c’était une réponse de la centrale qui confirme qu’elle a bien reçue la commande (bit 16 à 1). Dans ce cas, la centrale confirme la réception en revoyant un message en tout point identique à celui reçu mais en changeant seulement la valeur du bit 16. Une sorte d’accusé de réception.

Nous verrons cela en détail un peu plus loin.

Enfin, les 16 derniers bits de poids faible de l’identifiant, j’ai choisi de les remplir avec une valeur choisie arbitrairement mais qui souvent est l’ID du nœud CAN qui expédie le message. Ici, j’ai choisi uint16_t hash = 0x1801;

Enfin, deux derniers points, avec la bibliothèque ACAN_ESP32, c’est au programmeur d’indiquer si l’identifiant est sur 29 (frame.ext = true;) ou sur 11 bits (frame.ext = false;). Ext pour extended frame format.

Le programmeur doit aussi renseigner la longueur du champ de données frame.len (en octets).

Si l’on se place maintenant dans la position du récepteur du message, c’est ce que l’on trouve dans le fichier CommandStation-EX-LaBox2/CanMsg.cpp

On voit tout d’abord que l’on « décode » l’identifiant :

if (ACAN_ESP32::can.receive(frameIn))
  {
    const uint8_t cmde = (frameIn.id & 0x1FE0000) >> 17; // Commande
    const uint8_t resp = (frameIn.id & 0x10000) >> 16;   // Commande = 0 / Reponse = 1
    const uint16_t hash = (frameIn.id & 0xFFFF);         // Hash

ensuite, sans entrer dans les détails, on voit que selon la commande envoyée (switch(cmde)), on execute l’une ou l’autre des fonctions internes à la box :

switch (cmde) // Fonction appelée
      {
      case 0xF0:
        DCC::setThrottle(loco, frameIn.data[2], frameIn.data[3]);
        xQueueSendToBack(xQueue, &frameIn, 0);
        break;
      case 0xF1:
        DCC::setFn(loco, frameIn.data[2], frameIn.data[3]); // frame.data[2] = fonction, frame.data[3] : 'on' ou 'off'
        break;
      case 0xF7:
        // WRITE CV on MAIN <w CAB CV VALUE>
        DCC::writeCVByteMain(loco, frameIn.data[2], frameIn.data[3]);
        break;
      case 0xFE:
        TrackManager::setMainPower(frameIn.data[0] ? POWERMODE::ON : POWERMODE::OFF);
        xQueueSendToBack(xQueue, &frameIn, 0);
        break;
      case 0xFF:
        DCC::setThrottle(0, 1, 1); // emergency stop
        xQueueSendToBack(xQueue, &frameIn, 0);
        break;
      }

setThrottle, commande de traction ou de e-stop dans le cas où les paramètres sont :

DCC::setThrottle(0, 1, 1); // emergency stop
Commande de mise sous tension ou d’extinction de la box :

case 0xFE:
        TrackManager::setMainPower(frameIn.data[0] ? POWERMODE::ON : POWERMODE::OFF);

La fonction  xQueueSendToBack(xQueue, &frameIn, 0); est la réponse que la commande à bien été reçue.

Voilà pour ne pas faire trop long.

Deux réponse complémentaire cependant, pourquoi ceci :

loco->address & 0xFF00, loco->address & 0x00FF, simplement pour diviser l’adresse qui peut être en 16 bits sous forme de de deux valeurs en 8 bits.

Je vois d’ailleurs qu’il y a une erreur ici puisque cela devrait être : (loco->address & 0xFF00) >> 8, loco->address & 0x00FF
Attention, ceci n'a rien à voir : Ou tout simplement si je veux controler la loco 5 à vitesse 25 en avant sans passer par la programmation objet comme dans la box: que dois-je ecrire :

ACANSettings settings (125 * 1000) ; // 125 kbit/s est la vitesse de transmission des messages sur le bus CAN.

Comme tu me sembles vouloir comprendre le CAN je te conseille de continuer à expérimenter et poser des questions et de bien lire les articles de base en particulier celui de Jean-Luc : https://www.locoduino.org/spip.php?article268

Je te conseille vraiment de réaliser (pas simplement lire) ce que présente Jean-Luc et tu auras acquis 80% de ce qu'il faut savoir.

Christophe

139
Merci encore Laurent,

Oui ça va m'aider, je vais bien poser tout cela et faire le schéma.

Pour la détection, je relisais sumidacrossing.org (http://www.sumidacrossing.org/LayoutControl/TrainDetection/) et selon lui et de nombreux modélistes, ce qui fait l'unanimité aux US c'est le NCE 5240205 Block Detector BD20 (https://tonystrains.com/product/nce-5240205-block-detector-bd20) à 16$ environ la pièce.

Mais il renvoie aussi à des solutions en DIY. On devrait donc s'en sortir de ce problème de détection sur les faibles courants.

Christophe


140
Bonjour à tous,

Je viens de publier sur le site éditorial les trois premiers articles sur le sujet des satellites autonomes. Cela permettra une lecture plus structurée. N’hésitez vraiment pas à poser des questions ou émettre des avis. Le concept de satellite autonome s’inscrit dans la lignée des satellites v1 et porte un certain nombre de concepts qui nous intéressent à Locoduino. En réagissant, c’est sur l’ensemble de ces concepts que vous apporterez votre contribution.

Christophe

141
@Laurent, bon je t'ai déjà remercié pour la même info sur un autre fil, mais abondance de politesse ne nuit pas.

Je note ce que tu dis au sujet du 3V mais est-ce que je me trompe quand je dis que sa consommation nécessitera de passer par un transistor ? Du coup, n'est il pas mieux de prendre du 5v puisqu'il y en a sur les satellites ?

Merci encore pour ton aide.

Christophe

142
Vos projets / Re : BASIC_AUTO_LOOP_REVERSER
« le: février 04, 2024, 12:04:48 am »
@Laurent, Merci beaucoup pour l'info.

143
Après avoir regardé pas mal de relais DIL, voici 2 types qui me semblent pouvoir convenir. Ce sont à chaque fois des relais bi-stables. J'ai essayé de privilégier le temps de commutation d'autant que, comme indiqué dans un précédent message, il semble nécessaire de passer par un transistor pour le commander.

1° Omron G5V-2 donné pour 7ms : https://www.tme.eu/fr/details/g5v2-5/relais-electromagnetiques-miniatures/omron-ocb/g5v-2-5vdc/
2° TE Connectivity V23079B1201B301 : https://www.tme.eu/fr/details/v23079b1201b301/relais-electromagnetiques-miniatures/te-connectivity/3-1393788-3/

Des conseils, des avis ???

Christophe

144
Hello

Voila peut être une piste à considérer:
L implémentation du LK200 de LENZ.

https://www.modelmania.eu/images/lenz/instrukcja_lenz_lk200.pdf

On y voit bien l'enchainement des bloc fonctionnels depuis le centrale vers la loop et donc la détection de présence ou d identification RC.

J'ai tendance à penser que la préconisation LENZ tient la route...

Bonjour Laurent,

J'ai regardé le document, je pense que ce que tu veux dire est que Lenz recommande de placer le détecteur Railcom à la suite de la détection de courant, c'est bien celà ?

Autrement, je suis en train de chercher pour le relais pour couper le signal DCC en cas de dépassement de seuil. De ton côté, as tu des préconisations ? Ce que je trouve moi est surtout en 5V (pas beaucoup de 3V) et même en 5v, des consommations (mini 30mA) non compatibles à une liaison directe à une pin d'ESP32. Faudra t'il passer par un transistor ? Ne va t'on pas ajouter le temps de commutation du transistor au temps de commutation du relais ?

Christophe

145
Vu que tu coupes les 2 rails il y a en fait 4 possibilités à tester :
- en faisant passer le fil gauche ou droit dans le transfo
- avant ou après le railcom.

Oui certes, mais quand on n'en sera plus que là, on ne sera pas loin du résultat... concluant ou pas !

146
Il est plus facile de visualiser et d'analyser une application électronique sous forme ce schéma de principe plutôt qu'un dessin de PCB dans lequel il faut suivre les tortueuses pistes pour savoir qui est connecté avec qui.

Peut-on avoir un schéma ?

Oui je sais que c'est plus facile pour les spécialistes d'avoir un schéma. Mais je ne suis pas très doué là dessus aussi. J'utilise Fritzing qui est assez simple et qui peut produire le PCB sans schéma. J'ai essayé EasyEDA mais j'ai beaucoup de mal, je le trouve très peu maniable, les composants "restent collés" à la souris, les liaison entre composants ne sont pas magnétisées, résultat, 3 fois sur 4 mes composants ne sont pas reliés. Je suis en train d'essayer Eagle qui est maintenant incorporé à Fusion360 mais je n'ai pas encore résolu la question des composants qui ne sont pas dans les bibliothèques (ou je ne sais pas chercher dans les bibliothèques). Bref, j'ai encore du chemin à parcourir avant de pouvoir publier de beaux schémas.

147
Aide / Re : aiguillage et capteur fc 51
« le: février 02, 2024, 10:31:39 pm »
Pour moi il est plus simple (plus souple) de choisir un Arduino qui pourra aussi assurer d'autres fonctions. Il est assez simple de détecter le signal infra rouge, de changer la valeur d'une variable d'état et commander le servo, de demander à l'Arduino d'inverser la valeur de la variable d'état au bout de x secondes et ce faisant, de commuter l'aiguille.

Fouillez un peu sur le site, c'est aussi cela le DIY, il y a pas mal d'exemples avec des capteurs (IR ou autres), temporisation, etc... Les exemples liés au PN sont certainement assez proche de ce que vous voulez faire.

Je n'ai pas beaucoup de temps actuellement mais je vous donnerai d'autres pistes et des matériels plus tard et d'autres vont certainement vous répondre.

Cherchez, posez-vos questions et l'on vous répondra.

Christophe

148
Merci Marcel,

Ce montage aussi semble intéressant car si je comprends bien, le signal est amplifié par un transistor. A tester en cas d'échec de la solution que je propose ci-dessus.

Christophe

149
Bonjour à tous,

J'ai dessiné le prototype d'un PCB (100 X 80) qui regroupe la détection Railcom, la détection par consommation de courant et un relais pour couper l'alimentation DCC.



- La partie 1 encadrée en rouge concerne Railcom.
- La partie 4 est la détection à base de ZMCT103C. C'est exactement le montage proposé par Cédric (Pyk35) ici : https://forum.locoduino.org/index.php?topic=489.msg9139#msg9139
La sortie de ce montage est exploitée par L'ESP32 avec deux objectifs, 1° - Détecter l'occupation par consommation de courant d'une locomotive ou d'un simple wagon équipé d'une résistance entre les deux roues. 2° - Actionner le relais en 5 dans le cas d'un court-circuit (courant > à 2A par exemple).
- Les fils bleus qui partent de la partie 3 correspondent au cas où la détection de courant est placée après la détection Railcom. Le DCC out de 5 serait alors injecté dans la voie.
- L'autre hypothèse à tester est d'entrer directement le DCC dans le relais en 5 (après avoir passé l'un des fils DCC au travers du ZMCT103C). La sortie du relais étant injectée dans le DCC in de la partie 1.

Bien sûr le PCB sera redessiné quand l'une ou l'autre des options d'entrée du DCC sera validée (avant Railcom ou après Railcom).

Je suis très intéressé d'avoir vos retours sur cette proposition.

Je veux bien aussi des propositions sur le choix du relais (DIL selon Laurent). J'ai fait une rapide recherche mais pour l'instant je ne trouve rien en 3,3v.

Merci d'avance pour vos contributions constructives !

Christophe


150
PS : si tu veux, je recopie et on efface l'autre.

Oui ce serait bien que tu rapatries ton fil, d'autant que le document que tu joins est intéressant. Il n'apporte pas de réponse en DIY mais pose bien les problèmes.

Oui, bien sûr, mais il faut encore en construire un. A 15 €+port, je pense que c'est cher.

C'est ce dont nous discutons sur ce fil

Pages: 1 ... 8 9 [10] 11 12 ... 58