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

Pages: 1 ... 8 9 [10] 11 12 ... 14
136
C'est déjà bien de m'avoir fait une série de tests, merci m'sieur !

Tu n'as pas de problème avec le 471 dans la ligne d'alimentation de la voie ? J'avais fait un essai et j'avais un truc bizarre avec le MEGA qui délirait....je vais refaire un test. J'allais te demander si tu avais bien mis PWM sur 1 puisque pas branché (sur ta photo) sur l'Arduino mais comme la led du LM est allumée je suppose que oui (et ça m'étonnerait que tu ais oublié un détail aussi évident....)

137
Débuter / Re : Information générale
« le: mars 15, 2021, 01:11:11 pm »
Bonjour Jean (et  bienvenu sur le forum)

Le plus simple reste de poser vos questions de façon concrete et le plus documenté (références) possible pour faciliter la prise en main du sujet. Le sujet est "compatible" avec la finalité du forum et il y a des gens qui ont les compétences ici. La remarque de Dominique & de Michel, je pense, est surtout relative à la question de l'intéret porté : le sujet est intéressant dans l'absolu, mais comme chacun a ses préoccupations et que ce projet est relativement volumineux, "rentrer dans le projet pour vous aider" peut nécessiter un temps qu'il appartiendra à chacun de décider ou pas de vous consacrer.

En tout état de cause, de l'énergie que vous mettrez à faciliter ce parcours aux autres dépendra probablement la capacité de chacun à vous aidez. Je suis de ceux là mais ils sont nombreux sur le forum dans mon cas...

Donc à vous de jouer : posez le plus efficacement possible vos questions très ciblées et allons-y pas à pas....et on verra ou ça nous mène ! ;)

138
Bibliothèques / Re : DccToolkit / SystemToolkit
« le: mars 15, 2021, 12:04:51 pm »
Allez, une dernière pour la matinée : les  écritures de CV sont validées ainsi que les commandes de fonctions.

139
Bibliothèques / Re : DccToolkit / SystemToolkit
« le: mars 15, 2021, 09:36:31 am »
Je vous met en pièce jointe deux nouvelles release améliorées des bibliothèques, qui integrent pas mal de correctifs et de nouvelles fonctions. Il y a notamment un premier morceau d'implémentation du protocole de commande DCC++ ce qui permet, en assemblant les classes comme il faut, d'utiliser DecoderPro pour dialoguer avec l'équipement.

Voici les deux sketchs utiles mis à jour :

Test de lecture des CV
#include <SignalGenerator.h>
#include <TrackDriver.h>

#include <ACS712CurrentSensor.h>
#include <Max471CurrentSensor.h>

// Create a current sensor reading on A0 with VCC = 5.0 volts
//ACS712CurrentSensor currentSensor(A0, 5000);
Max471CurrentSensor currentSensor(A0, 5000);

// Create a signal generator using timer 1, allowed to issue service command
SignalGenerator generator(1,12, true);

// Create a track driver using previous generator & current sensor
TrackDriver driver(11,&generator, &currentSensor);

void readCV(byte cv)
{
  Serial.print("CV ");
  Serial.print(cv);
  Serial.print(" = ");

  byte value;
  if (driver.readCV(cv, &value))
  {
    Serial.println(value);
  }
  else
  {
    Serial.print(value);
    Serial.println(" : Failed to read !");
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println("Initializing !");

  // Start all the stuff : DCC signal is there and running starting from here
  driver.start();
  driver.powerOn();

  Serial.println("Initialization done !");
}

int x = 1;
bool up = true;

void loop()
{
  delay(500);

  if (up)
    readCV(x++);
  else
    readCV(x--);

  if (x <= 1)
    up = true;
  if (x >= 140)
    up = false;
}

Sketch de test avec DecoderPRO en USB

NOTE 1 : les fonctions sont partiellement implémentées. Ne pas faire d'écriture de CV pour le moment pour ne pas perturber vos décodeurs, "au cas ou" : je n'ai pas encore assez testé cette partie.

NOTE 2 : Le code pour la partie ethernet n'est pas encore au point...mais je bosse dessus...donc ne l'activez pas (compilation conditionnée par les defines DCC_ETHERNET_xxx)

// Do not remove the include below

#include "DuinoBaseStation.h"

#include "SystemToolkit.h"
#include "DccToolkit.h"

// Create a current sensor reading on A0 with VCC = 5.0 volts
//ACS712CurrentSensor currentSensor(A0, 5000);
Max471CurrentSensor currentSensor(A0, 5000);

// Create a signal generator using timer 1, pin 12 which is OUTPUT COMPARE B
// for timer 1 on MEGA for example
SignalGenerator generator(1, 12, true);

// Create a track driver using previous generator & current sensor, also using
// pin 11 to switch track power ON/OFF
TrackDriver driver(11, &generator, &currentSensor);

// Create a command stream using USB serial port
SerialPortCommandStream usbStream;

// Create a command parser using the stream and our single track driver
CommandParser usbParser(&usbStream, &driver, NULL);

#if defined(DCC_ETHERNET_WIZNET_5100_ENABLED) || defined(DCC_ETHERNET_WIZNET_5200_ENABLED) || defined(DCC_ETHERNET_WIZNET_5500_ENABLED)
// Create a command stream using ETHERNET port
SocketCommandStream ipStream;

// Create a command parser using the stream and our single track driver
CommandParser ipParser(&ipStream, &driver, NULL);
#endif

void setup()
{
driver.start();
usbParser.start();
#if defined(DCC_ETHERNET_WIZNET_5100_ENABLED) || defined(DCC_ETHERNET_WIZNET_5200_ENABLED) || defined(DCC_ETHERNET_WIZNET_5500_ENABLED)
ipParser.start();
#endif
}

void loop()
{
usbParser.run();
#if defined(DCC_ETHERNET_WIZNET_5100_ENABLED) || defined(DCC_ETHERNET_WIZNET_5200_ENABLED) || defined(DCC_ETHERNET_WIZNET_5500_ENABLED)
ipParser.run();
#endif
}

140
Bibliothèques / Re : DccToolkit / SystemToolkit
« le: mars 14, 2021, 08:28:50 pm »
Non, une erreur de ma part : sur un UNO, le timer 1  n'implémente pas le COMPARE "C", seulement compare A et B.
Je vais corriger ça. ;)

141
Bibliothèques / Re : DccToolkit / SystemToolkit
« le: mars 14, 2021, 05:39:35 pm »
Oui j'ai déjà commit la meme correction.

Normalement tu peux utiliser autre chose qu'un mega : il y a les éléments de compilation conditionnelle qui vont bien.

142
Bon j'arrive au meme résultat avec un MAX471 en mesure du courant d'alimentation de la carte moteur finalement.

J'avais un problème sur la conversion des échantillons en valeur mA.

Allez pour la petite histoire : les int sont sur 16 bits ! Ca fait tellement longtemps que je ne manipule plus que du 32 ou 64 bits dans mon quotidien, j'étais loin de me douter que sur ces CPU le int de base était encore réglé à 16 bits !
J'avais des dépassements de capacité qui me donnaient des valeurs bidons, forcément !

Donc avec mon code actuel (je viens de pousser sur GITLAB), j'arrive à lire 100% des CV de mon échantillon de test avec :

* Soit  un ACS712 inséré dans la ligne d'alimentation de la voie, ce qui me permet d'envisager une mesure pour chaque voie bien séparée ;
* Soit un MAX471 (celui que tu m'as envoyé Dominique) inséré dans la ligne d'alimentation de la carte moteur, auquel cas la voie de programmation ne peut pas fonctionner de façon certaine en meme temps que la voie principale pour une carte bi-moteur comme la LS 9110 S (incertitude de mesure).

Reste à élargir l'échantillon de test !

143
Précisions : tant que le courant mesuré reste supérieur au seuil, j'attends (je laisse passer le pic), avec un maximum de 16 mesures de 50 points (soit 800 échantillons en bouche au max).

De cette manière j'évite de passer à la lecture du bit suivant du CV avant que le courant d'ACK ne soit retombé.

144
Avec l'ACS 712 on mesure le courant dans les deux sens (+/-) par rapport à VCC/2.
Avec ce composant j'ai une lecture viable du courant consommé en échantillonnant 50 points en série.

Actuellement j'ai une mesure de courant de repos (avant ACK) fiable sur une mesure.
Puis je vérifie que je vois passer un pic de courant en échantillonnant des valeurs de 50 points et en recherchant un delta (en mA) d'au moins 40 (la norme étant 60.

Je valide l'ACK si j'ai reçu un pic sur au moins une mesure (donc moyenne de 50 échantillons consécutifs > seuil).

C'est comme ça que j'obtiens le résultat actuel. J'ai 90% de readCV qui passent du premier coup.
En ajoutant 5 tentatives de lectures max pour une lecture CV donnée, j'arrive à lire le CV dans 100% des cas sur mon décodeur de test.

145
Justement : j'ai du mal pour le moment à obtenir un résultat cohérent avec un MAX471...
C'est paradoxal parce qu'il me semble  que cette bestiole est utilisée assez largement, mais par exemple dans l'article sur la station de bobyAndCo, on a bien le max471 placé dans la ligne d'alimentation de la carte L 9110 S.

Pour l'instant je bloque avec le MAX. J'arrive à mesurer du courant correctement sur un faisceau de leds de test...mais pas pour monitorer un mini pic de consommation lié à un ACK d'une loco.

Bien entendu, le composant fait le taff pour de la mesure de consommation en vue de détecter un court-circuit...mais encore une fois, j'arrive à mieux avec un ACS 712 placé en série avec le pont en H, ce malgré sa résolution plus faible (1/10ème).


146
Aux pros de l'électronique : une question naive (mais quand meme...)

Je vois des montages ou l'on place un MAX en mesure de courant sur l'alimentation de la carte moteur.

Sur carte L 9110 S il y a deux drivers moteur. Si on fait comme ça, déjà, ça veut dire qu'on ne peut pas distinguer les canaux d'une part, et que ça rend impossible l'usage de la voie de programmation quand le canal principal est actif : trop incertain...

Mais au delà j'ai un probleme de compatibilité : la carte moteur embarque deux grosses capa sans trop de surprises. 470 uF chacune.

J'ai pas fait les calculs mais....je vois pas comment ces capas ne pourraient pas absorber le "pic" de consommation de 60 mA durant 5 à 7 ms de la norme DCC, et donc "masquer" un signal ACK du décodeur....

Sauf si j'ai rien compris et qu'un truc gros comme une maison m'échappe...ou encore que je ne comprends rien à un truc aussi fondamental que ça...

Vous pouvez m'éclairer ?

147
Bibliothèques / DccToolkit / SystemToolkit
« le: mars 14, 2021, 12:02:37 pm »
Bonjour à tous

Je vous propose ci-dessous deux bibliothèques permettant de réaliser des montages notamment autour du DCC.

Pourquoi de nouvelles bibliothèques diront certains ?

Tranchons dans le vif une fois pour toute quant à cette question :
a) C'est un loisir, moi ça m'amusait de le faire, alors je l'ai fait et c'est ce qui compte le plus !
b) J'ai considéré que les bibliothèques existantes, issues de DCC++ de Gregg E Berman avait quelques lacunes, et j'ai souhaité proposer une approche beaucoup plus structurée et flexible.

Tout ceci n'enlève rien au travail de Gregg ni, plus encore, à celui de Thierry ici présent : j'ai juste une approche différente, chacun choisira la voie qui lui convient le mieux. Enfin notez que j'ai bien intégré à la fois Gregg et Thierry dans le README / Remerciements car je considère leur travail comme très important ET qu'il m'a servi de base de comparaison / reflexion / compréhension de pas mal de choses.

Ceci étant posé (je n'y reviendrait pas : je ne suis pas là pour pinailler), parlons de choses concretes !

Ces deux librairies vous proposent des classes relativement abouties pour gérer :
  • Des mécanismes assez complexes au niveau système, de façon plus simple / générique que si vous devez vous taper chaque spécificité de chaque modèle d'arduino / chaque timer, par exemple
  • Des briques de base spécialisées et très modulaires permettant de construire des dispositifs autour du DCC, là aussi sans devoir gérer les spécificités détaillées de nombre de choses

Installation des bibliotheques

Pour le moment elles ne sont pas dans le gestionnaire officiel (ça viendra). Vous pouvez les télécharger en pièce joint de ce message. Je mettrais un rappel dans les messages suivants qui pointera vers celui-ci.

Une fois ces bibliothèques installées, vous pouvez les ajouter à votre projet.

Il y a déjà pas mal de choses implémentées MAIS pour le moment je suis en phase de test de la partie échanges DCC sur la voie. Notamment : j'ai besoin de tests significatifs de lecture de CV.

Voici un sketch qui fait le job, à adapter selon votre matériel :

#include <SignalGenerator.h>
#include <TrackDriver.h>

#include <ACS712CurrentSensor.h>
#include <Max471CurrentSensor.h>

// Create a current sensor reading on A0 with VCC = 5.0 volts
ACS712CurrentSensor currentSensor(A0, 5000);
//Max471CurrentSensor currentSensor(A0, 5000);

// Create a signal generator using timer 1, and pin 12, allowed to issue service command
SignalGenerator generator(1, 12, true);

// Create a track driver using output pin 11 and previous generator & current sensor
TrackDriver driver(11, &generator, &currentSensor);

void readCV(byte cv)
{
 byte value = 0;
 bool result = driver.readCV(cv, &value);
 Serial.print("CV ");
 Serial.print(cv);
 Serial.print(" = ");
 Serial.print(value);
 if (result)
    Serial.println(" : OK");
 else
    Serial.println(" : Failed to read !");
}

void setup()
{
  Serial.begin(115200);
  Serial.println("Initializing !");

  // Start all the stuff : DCC signal is there and running starting from here
  driver.start();

  Serial.println("Initialization done !");
}

int x = 1;
bool up = true;

void loop()
{
  delay(2000);

  if (up)
    readCV(x++);
  else
    readCV(x--);

  if (x <= 1)
    up = true;
  if (x >= 140)
    up = false;
}

Notez bien les broches utilisées :
  • La sortie 12 du MEGA va sur l'entrée DIR du shield moteur
  • La sortie 11 du MEGA va sur l'entrée PWM du shield moteur

L'usage de la sortie 12 dépend du timer utilisé. Il faut dans tous les cas utiliser le signal OUTPUT COMPARE B du timer concerné. Sur le MEGA, OC1B est sur la sortie 12. Si vous changez de timer ou d'arduino il peut y avoir besoin d'ajuster le code.

L'usage de la sortie 11 pour faire le ON/OFF de génération du signal électrique est par contre un choix arbitraire, sans relation avec des contraintes du matériel. Ca marchera avec n'importe quelle sortie digitale pour peu que vous branchiez le fil sur la pin dont le numéro est passé en parametre lors de l'instanciation de l'objet TrackDriver.

Si vous utilisez une mesure de courant à base de MAX, vous devez utiliser la bonne classe de CurrentSensor, faute de quoi ça va délirer complètement. Pour le moment ce code fonctionne chez moi avec :

  • Un ACS712 placé en coupure sur la ligne d'alimentation de la VOIE (certains montages mesurent sur la ligne d'alimentation du shield moteur)
  • ou Un Max471 placé en coupure sur la ligne d'alimentation du SHIELD MOTEUR
  • Un MEGA 2560
  • Une carte L 9110 S

148
Je vous prépare un pack sources / une enfilade dans la section "librairies" pour avancer sur le sujet les amis !

149
Ah oui : le décodeur de test que j'ai liste 140 CV dans sa doc, d'ou le IF en fin de code qui inverse la séquence...à adapter sur d'autres décodeurs

150
Bien entendu ça va etre partagé Dominique, je veux d'abord finaliser / packager un poil le truc.

Le montage est le suivant (désolé, pas de schéma, mais c'est tout ce qu'il y a de plus classique) :
  • Arduino MEGA tout ce qu'il y a de plus habituel
  • Carte moteur L 9110
  • Alimentation 12v de labo
  • Convertisseur réglable DC/DC pour descendre le 12v à  5v pour alimenter l'arduino
  • Circuit ACS712 monté en coupure sur l'une des deux lignes allant à la voie

Rien de bien spécial donc.

Le branchement : j'utilise bien entendu un PWM de l'Arduino pour piloter le signal, peu importe lequel : 1, 3, 4 ou 5 sur le méga, pourvu que ce soit un 16 bits. Pas essayé avec un 8 bits mais le code est prévu pour (ça viendra).

Comme pour toutes les centrales DCC : sortie OUTPUT COMPARE B du timer reliée à la broche DIRECTION du shield moteur. Broche PWM du shield moteur reliée à VCC ou pilotée par une broche DIGITAL OUTPUT de l'arduino pour faire le ON/OFF de la voie de programmation.

La broche OUTPUT de l'ACS712 reliée sur A0.

Donc encore une fois, très classique.

Le code est constitué d'une ré-écriture intégrale de DCC++ inspirée à la  fois de l'original, des travaux de Thierry, mais aussi repris de zéro à partir de la version actuelle de la norme du NMRA.

Voici ce que donne le sketch principal de test : il s'agit de lire en boucle les CV du décodeur (test d'endurance).
Le truc à tourné toute la nuit sans broncher avec une de mes locos équipée d'un décodeur LaisDCC de base.

#include "DuinoBaseStation.h"

#include "SystemToolkit/SystemToolkit.h"
#include "DccToolkit/DccToolkit.h"

// Create a current sensor reading on A0 with VCC = 5.0 volts
ACS712CurrentSensor currentSensor(A0, 5000);

// Create a signal generator using timer 1, allowed to issue service mode commands
SignalGenerator generator(1, true);

// Create a track driver using previous generator & current sensor
TrackDriver driver(&generator, &currentSensor);

void readCV(byte cv)
{
Serial.print("CV ");
Serial.print(cv);
Serial.print(" = ");

byte value;
if (driver.readCV(cv, &value))
{
Serial.println(value);
}
else
{
Serial.print(value);
Serial.println(" : Failed to read !");
}
}

void setup()
{
Serial.begin(115200);
Serial.println("Initializing !");

pinMode(11, OUTPUT); // PWM compare A output enabled : Connect to PWM on motor
pinMode(12, OUTPUT); // PWM compare B output enabled  : Connect to DIR on motor

digitalWrite(11, HIGH); // Turn on power

driver.start();

Serial.println("Initialization done !");
}

int x = 1;
bool up = true;
void loop()
{
delay(2000);

        if (up)
readCV(x++);
else
readCV(x--);

if (x <= 1)
up = true;
if (x >= 140)
up = false;
}

Les deux libs SystemToolkit et DccToolkit seront bientot mises en ligne librement sous forme de package compatible avec l'IDE arduino. Bien entendu libres d'usage pour ceux qui le voudront et sous licence GPL 2 ou 3.

Je précise que la lib DccToolkit mentionne en Acknowledgement à la fois Gregg E Berman et Thierry et comporte les liens vers les projets respectifs DCC++ et lib DCCpp, sur Locoduino.

S'il y en a qui ont la possibilité (et surtout l'envie !) de participer à la mise au point en réalisant des campagnes de test sur d'autres décodeurs (donc qui ont la possibilité de réaliser sans aide le montage indiqué et si besoin de chercher un peu pour ajuster....), ils sont les bienvenus.

Quant à savoir pourquoi j'ai choisi de repartir d'une feuille blanche, je vous en parlerais quand je mettrais la lib en ligne, ce qui ne saurait tarder...

@Dominique : je pense qu'il est temps d'ouvrir un sujet dédié dans la bonne section pour la suite...je vais m'en occuper en fin de journée ce dimanche.

;)

Seb

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