Auteur Sujet: DCC++ BaseStation  (Lu 154106 fois)

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3039
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #45 le: août 29, 2016, 07:14:23 pm »
Je viens de tester à l'instant la lecture du CV 1 (adresse DCC) et c'est bon, ma loco a bien l'adresse 18.

DCCpp-VV V0.10 du 9/08/2016

<iDCC++ BASE STATION FOR ARDUINO NANO / ARDUINO MOTOR SHIELD: V-1.2.1+ / Aug 15 2016 19:04:05>
<N0: SERIAL><p1><rm123|123|1 18><p0>
adresse DCC : 18

D'ailleurs j'ai ajouté cette lecture de l'adresse DCC dans le Setup : c'est donc automatique au démarrage

Mon matériel : Nano + LMD18200 + Max471

Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #46 le: août 29, 2016, 07:24:50 pm »
Dominique,

C'est quoi "rm" au début du return ? Et tu as envoyé quoi comme texte ?

Merci

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3039
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #47 le: août 29, 2016, 08:46:22 pm »
Ah oui, la réponse est dans le fil d'à coté :

http://forum.locoduino.org/index.php?topic=46.msg1862#msg1862

Il y a le code de la version DCC++ que j'ai modifiée pour ajouter la fonction discover() qui fait une lecture de CV (le N°1 pour l'adresse DCC) sur la voie principale au moment du Setup().

Bonne "découverte"
Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #48 le: août 30, 2016, 07:30:10 am »
Bonjour Dominique,

Oui j'ai regardé ton code. Les seules différences sont que tu es sur la voie principale et moi sur la voie de programmation et que tu utilises un LMD18200 et moi un Pololu !

Je vais commencer par changer le booster pour tester. J'ai 16 V (en HO) à l'entrée du booster, cela est correct, non ?

Je fais de nouveaux tests ce matin et fais le retour.

Merci

Christophe

DDEFF

  • Hero Member
  • *****
  • Messages: 760
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #49 le: août 30, 2016, 08:45:22 am »
Votre discussion est passionnante  ;D ;D

En tant que béotien du DCC, j'aimerais savoir si on peut tester le CV1 ... en roulant ?  :P
(Je sens que je viens de dire une grosse C.)

Denis
"Ce n'est pas le puits qui est trop profond, c'est ta corde qui est trop courte" (proverbe chinois)

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #50 le: août 30, 2016, 08:59:06 am »
Bonjour Denis,

Non pas en roulant, c'est ce que disait Dominique.

Par contre, il s'est "fabriqué" une méthode :

void SerialCommand::discover() {
  commandString[0] = '1';
  parse(commandString);
  commandString[0] = 'r';
  commandString[1] = ' ';
  commandString[2] = '1';
  commandString[3] = ' ';
  commandString[4] = '1';
  commandString[5] = '2';
  commandString[6] = '3';
  commandString[7] = ' ';
  commandString[8] = '1';
  commandString[9] = '2';
  commandString[10] = '3';
  parse(commandString);
  commandString[0] = '0';
  parse(commandString);
}

"r" dans commandString[0] = 'r'; est créé ad hoc (n'existe pas à l'origine) qu'il "parse" avec une méthode pour la voie principale (qui est similaire à la méthode pour la voie de programmation)

case 'r':     // <r CV CALLBACKNUM CALLBACKSUB>
/*   
 *    reads a Configuration Variable from the decoder of an engine on the main track
 *   
 *    CV: the number of the Configuration Variable memory location in the decoder to read from (1-1024)
 *    CALLBACKNUM: an arbitrary integer (0-32767) that is ignored by the Base Station and is simply echoed back in the output - useful for external programs that call this function
 *    CALLBACKSUB: a second arbitrary integer (0-32767) that is ignored by the Base Station and is simply echoed back in the output - useful for external programs (e.g. DCC++ Interface) that call this function
 *   
 *    returns: <r CALLBACKNUM|CALLBACKSUB|CV VALUE)
 *    where VALUE is a number from 0-255 as read from the requested CV, or -1 if read could not be verified
*/   
      mRegs->readCV_Main(com+1);
      break;

On voit case 'r' au début et  mRegs-> en fin (pour la voie principale)

Le tout appelé dans le setup pour faire apparître l'adresse dans le moniteur série :

mainRegs.addressDccToDiscover = 3;
  SerialCommand::discover(); // dcc adress found is stored in readCV_Main()
  Serial.println();
  Serial.print("adresse DCC : ");Serial.println(mainRegs.addressDccToDiscover);

Voilà.

Christophe


Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3039
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #51 le: août 30, 2016, 09:25:57 am »
Et d'ailleurs, je sais que ce n'est pas très élégant de programmer un string caractère par caractère :

  commandString[0] = 'r';
  commandString[1] = ' ';
  commandString[2] = '1';
  commandString[3] = ' ';
  commandString[4] = '1';
  commandString[5] = '2';
  commandString[6] = '3';
  commandString[7] = ' ';
  commandString[8] = '1';
  commandString[9] = '2';
  commandString[10] = '3';
  parse(commandString);

D'autres méthodes intégrant la chaîne complète ont été rejetées par le compilateur.

Avez-vous des suggestions ?
Cordialement,
Dominique

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3039
  • 100% Arduino et N
    • Voir le profil
Re : Re : DCC++ BaseStation
« Réponse #52 le: août 30, 2016, 09:39:15 am »

En tant que béotien du DCC, j'aimerais savoir si on peut tester le CV1 ... en roulant ?  :P
(Je sens que je viens de dire une grosse C.)

Denis

Mais non, mais non ;)

Le principe de la lecture de la réponse d'un décodeur repose sur la mesure du différentiel de courant consommé. La loco doit être à l'arrêt (moteur arrêté), même si le décodeur consomme quelques dizaines de millis. Lors de la réponse, le décodeur commande le moteurs quelques millisecondes pour chaque bit, ce qui augmente la consommation de quelque 100mA (ou plus en HO) et la centrale voit bien ces bits.

Si la loco roule, il n'y aura plus de variation de consommation significative et je me demande même si le décodeur peut encore accepter la commande.

De même, cette mesure ne marche que s'il y a une seule loco sur les rails, sinon il y aurait des mélanges de bits différents et ça donnerait n'importe quoi.

Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #53 le: août 30, 2016, 06:06:27 pm »
Bonjour à tous,

Je vous disais hier que j'avais des problèmes de lectures de CV's avec la fonction < R CV CALLBACKNUM CALLBACKSUB > (lecture des CV's d'une loco sur la voie de programmation). J'ai fait depuis toute une série de tests en utilisant, d'une part un UNO puis un MEGA et le LMD18200 et la carte POLOLU. Détail des mesures en PJ.

MEGA + LMD18200 : Aucune mesure possible, retourne -1 pour tous les CV's
MEGA + POLOLU : Mesures exactes sur 2 machines avec des décodeurs peu sophistiqués (MFX et l'autre n'a que la lumière et même pas le son). Toutes les autres machines avec des décodeurs sophistiqués (ZIMO XB 401, ESU V4.0) retournent -1, lecture impossible.

A préciser que la POLOLU se met en sécurité (sur la voie de prog) dès que l'on pose une loco gourmande en énergie !

UNO+POLOLU : Mêmes résultats qu'avec le MEGA, OK pour 2 machines avec des décodeurs peu sophistiqués, toutes les autres lecture impossible et les machines "énergivores" font disjoncter la carte.

Enfin, UNO+LMD18200, je n'ai aucune mesure cohérente, les valeurs retournées sont erronées !!!

Je ne dis pas que le problème soit universel (Dominique lit ses CV's, sur la voie principale certes, mais de façon correcte) avec un LMD18200.

J'ai aussi fait des tests en variant de 16 à 20 V (en HO) mais ça n'a rien donné.

Alors si quelqu'un à des idées  :) Merci d'avance.

Christophe

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3039
  • 100% Arduino et N
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #54 le: août 30, 2016, 06:44:43 pm »
Je pense que si les résultats sont "incohérents" et, en tout cas pas = -1, cela veut dire que le soft a lu une valeur.

Si cette valeur n'est pas bonne, c'est que les bits lus ne sont pas bons.

La cause vient probablement de la mesure de courant qui doit être un peu en dessous de la limite de la lisibilité. Il faudrait regarder à l'oscillo quels sont les niveaux et les durées des bits.

Les seuls cas que j'ai testé et qui marchent sont :
  • UNO + arduino motor shield
  • Nano + LMD18200 + Max471
Cordialement,
Dominique

Tanguy

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #55 le: août 31, 2016, 11:25:49 am »
Bonjour Christophe,

dans le montage UNO + LMD18200, quelle valeur de résistance utilisez-vous pour la mesure de courant ?

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #56 le: août 31, 2016, 01:34:03 pm »
Bonjour Tanguy,

Merci pour votre aide.

En fait, j'utilise un MAX471 pour la lecture de courant. Il ne me semble pas qu'il soit nécessaire d'ajouter une résistance. Cependant, j'ai tout de même essayé puisque je me souviens que vous parliez d'une résistance dans un de vos post et j'ai donc mis 2,2 K. Mais la lecture est la même.

Comme je le disais, je fais des tests en "mélangeant" UNO et MEGA, LMD18200 et POLOLU.

Avec le LMD les résultats sont très incohérents. Avec le POLOLU plus réalistes

<r123|1|123 255>
<r123|1|123 255>
<r123|1|123 100>

Mais il n'empêche que pour la première lecture, la loco a le cv 9, pour la seconde 8 et pour la troisième 8 ???

Je n'arrive même plus à retrouver les "quelques" bons résultats que j'ai obtenus hier avec certaines configs et certaines locos.

Il y a sans doute un problème dans mon alimentation (trop fort en V ?, trop faible ?) Je suis en train d'analyser les bits pour la lecture des mesures de courant !

Amicalement

PS : Peut être pouvons nous nous tutoyer ?
« Modifié: mai 04, 2017, 05:13:58 pm par Thierry »

Tanguy

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #57 le: août 31, 2016, 02:06:04 pm »
Dans mes tests, je n'utilise pas le MAX471 mais directement la sortie dédiée du LMD18200 (current sens output).
Comme cette sortie retourne 377 μA/A consommé, la résistance est nécessaire pour convertir ce courant en tension mesurable par arduino. En jouant sur la valeur de la résistance on peut donc également jouer sur la sensibilité de détection.

Je n'ai pas testé le MAX471 mais je comprend qu'il délivre directement 1V/A. Peut-être n'est ce pas assez sensible ?

As-tu essayé de modifier le seuil de détection dans le programme DCC++ (ACK_SAMPLE_THRESHOLD dans PacketRegister.h ?



Tanguy

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #58 le: août 31, 2016, 02:22:40 pm »
Les caractéristiques de "Arduino Motor Shield" annonce une sensibilité de 1,65V/A pour la mesure de courant.

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : DCC++ BaseStation
« Réponse #59 le: août 31, 2016, 02:26:46 pm »
J'attends avant de modifier le seuil de détection car je trouve les résultats tellement éloignés de ce qu'il devraient être que je cherche d'abord ailleurs.

J'ai pourtant tout re-re-re vérifié, les câbles les paramètres de DCC++ Base !!! C'est sans doute un truc tout bête mais bon...

Mais je suis preneur de toute proposition...