Forums LR PRESSE

Où il est question de trains, petits et grands

  • Advertisement

TCO Xpressnet

Toutes les discussions sur l'Arduino !

Modérateur: MOD

Re: TCO Xpressnet

Publié: Mer 04 Avr 2018, 04:36 
Bonjour

Merci Sam pour le partage, et pour tous les détails et photos visibles sur le blog :applause:
J'envisage la construction d'un TCO DCC et cette solution est séduisante... :wink:

Merci également aux autres contributeurs

8)
A toute vapeur...en + du reste
Avatar de l’utilisateur
BB9004
Fécond
 
Messages: 724
Inscrit le: Jeu 09 Août 2012, 14:58
Localisation: Planète Bleue, à coté de la ville Lumière : 94
Âge: 63
Echelle pratiquée: HO
Prénom: Lionel
Club: ex CMG 92

Re: TCO Xpressnet

Publié: Lun 02 Juil 2018, 16:43 
Plume a écrit:Bonjour,

Attention, il peut y avoir un décalage d'une unité entre l'adresse saisie et celle traduite par la centrale.

Pour le vérifier, on peut utiliser un analyseur de trames DCC. On trouve sur le site http://modelisme58.free.fr/index.php/arduino.html un programme Arduino.


salut
Je reviens sur mon soucis car je ne suis toujours pas parvenue à trouver la solution à mon problème entre temps j'ai changé de central sur mon projet j'ai mis une central Digikeijs

alors pour faire simple si je réalise le mouvement de l'aiguillage depuis la Multimaus c'est ok depuis l'pad iPhone c'est bon mais pas depuis le XTCO rien peut être j'ai un problème dans mon code

un soucis d'adresse express net peut être
Arduino.[/quote]
include <XpressNet.h>
XpressNetClass XpressNet;

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define SerialDEBUG 1 //For Serial Port Debugging (Arduino Mega only)
#endif

#if SerialDEBUG
#include <SoftwareSerial.h>
SoftwareSerial Debug(0, 1); // RX, TX - Mettre sur 0 et 1 pour MEGA 2560
#endif

//-------------------------------------------------------------------------
// /|\ Variables à modifier ----------------------------------------------- /|\
// Définition des adresses des aiguillages et entrées utilisés sur la carte Arduino MEGA

int Aig[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // Adresse DCC des aiguillages
int Bt[] = {43, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41}; // Bornes de la carte ARDUINO

int NbreBoutons = 0; // Nbre total de boutons
int NbrePoussoirs = 0; // Nbre d'aiguillages commandés par Bouton Poussoir
int NbreLevier = 10; // Nbre d'aiguillages commandés par Bouton Levier

#define XNetAddress 15 // Adresse de la souris XpressNet : 2 souris Xpressnet ne pourront pas avoir la même adresse
// Valeur entre 1 et 31

// /|\ Fin des variables à modifier --------------------------------------- /|\
//-------------------------------------------------------------------------

//-------------------------------------------------------------------------
// Définition des variables et constantes

int BtEtat[100] ;
int BtEtatAncien[100] ;

byte Led = 13;
int DCCEtat;
long previousMillis = 0;

#define XNetSRPin 3 // Max485 Bus du driver relié à la borne de l'Arduino

//-------------------------------------------------------------------------
// Initialisation du programme
void setup() {

delay(1000);

NbreBoutons = NbrePoussoirs + NbrePoussoirs + NbreLevier + 1;

for (int i = 0; i < NbreBoutons; i++)
{
BtEtat[i] = 2;
BtEtatAncien[i] = 1;
pinMode(Bt[i], INPUT_PULLUP);
}
pinMode(Led, OUTPUT);

delay(100);

Serial.begin(9600);
Serial.println("UAICF Nevers-Vauzelles - http://modelisme58.free.fr"&#41;;
Serial.println("Octobre 2015 - Vers 1.2");

XpressNet.start(XNetAddress, XNetSRPin);
XpressNet.setPower(csNormal);

Serial.print(" --> Etat Centrale DCC = ");
Serial.println(XpressNet.getPower());
Serial.println("");

for (int i = 0; i < NbreBoutons; i++)
{
BtEtat[i] = digitalRead(Bt[i]);
Serial.print(" Borne Arduino : "); Serial.print(Bt[i]); Serial.print(" | Etat = "); Serial.println(BtEtat[i]);
delay (10);
}

XpressNet.receive();

Serial.println("--- Initialisation des positions des Aiguillages avec bouton a levier uniquement ---");
// Uniquement pour les aiguillages commandés par un bouton à levier
for (int i = NbrePoussoirs * 2 + 1; i < NbrePoussoirs * 2 + NbreLevier + 1; i++)
{
if (BtEtat[i] != BtEtatAncien[i])
{
Serial.print(" Aiguillage ayant l'adresse DCC "); Serial.print(Aig[i]);
Serial.print(" (Borne "); Serial.print(Bt[i]);
BtEtatAncien[i] = BtEtat[i] ;
XpressNet.setTrntPos (0x0, Aig[i] - 1, BtEtat[i] );
delay (200);
XpressNet.setTrntPos (0x0, Aig[i] - 1, BtEtat[i] );
delay (750);
}
}
Serial.println("--- Fin Initialisation des positions des Aiguillages ---");
Serial.println("--- Fin initialisation du programme ---"); Serial.println(" ");
digitalWrite(Led, HIGH);

}

//-------------------------------------------------------------------------
// Programme fonctionnant en boucle

void loop() {

// Récupére l'état des entrées
for (int i = 0; i < NbreBoutons; i++)
{
BtEtat[i] = digitalRead(Bt[i]);
delay (1);
}

XpressNet.receive();

unsigned long currentMillis = millis();

// --- Commande pour Arret d'Urgence --------------------------------------------

if (BtEtat[0] == 0 && DCCEtat == 0)
{
XpressNet.setHalt();
delay (500);
if (DCCEtat == 0)
{
digitalWrite(Led, LOW);
Serial.println(" ");
Serial.println(" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ");
Serial.println(" !!! --- Arret d'Urgence --- !!! ");
delay (1000);
previousMillis = currentMillis;
}
}

if (BtEtat[0] == 0 && DCCEtat > 0 && (currentMillis - previousMillis > 5000) )
{
XpressNet.setPower(csNormal);
delay (500);
if (DCCEtat > 0)
{
digitalWrite(Led, HIGH);
Serial.println(" ");
Serial.println(" --- DCC Ok --- ");
previousMillis = currentMillis;
}
}

// Envoie de la commande DCC pour accessoires si changement de l'état des entrées

if (DCCEtat == 0) // Si pas d'arrêt d'urgence d'enclenché
{
// --- Commande pour Boutons à levier --------------------------------------------
for (int i = NbrePoussoirs * 2 + 1; i < NbrePoussoirs * 2 + NbreLevier + 1; i++)
{
if (BtEtat[i] != BtEtatAncien[i])
{
Serial.print("Aiguillage ayant l'adresse DCC "); Serial.print(Aig[i]);
Serial.print(" (Arduino "); Serial.print(Bt[i]);
BtEtatAncien[i] = BtEtat[i] ;
XpressNet.setTrntPos (0x0, Aig[i] - 1, BtEtat[i] );
delay (10);
}
}


// --- Commande pour Boutons Poussoirs --------------------------------------------
// Commande Position 1
for (int i = 1; i < NbrePoussoirs * 2 + 1; i = i + 2)
{
if (BtEtat[i] != BtEtatAncien[i] && BtEtat[i] == 0 && BtEtat[i + 1] == 1)
{
Serial.print("Aiguillage ayant l'adresse DCC "); Serial.print(Aig[i]);
Serial.print(" (Arduino "); Serial.print(Bt[i]);
BtEtatAncien[i] = 0;
BtEtatAncien[i + 1] = 1;
XpressNet.setTrntPos (0x0, Aig[i] - 1, 0 );
delay (1);
}
}

// Commande Position 2
for (int i = 2; i < NbrePoussoirs * 2 + 2; i = i + 2)
{
if (BtEtat[i] != BtEtatAncien[i] && BtEtat[i] == 0 && BtEtat[i - 1] == 1)
{
Serial.print("Aiguillage ayant l'adresse DCC "); Serial.print(Aig[i]);
Serial.print(" (Arduino "); Serial.print(Bt[i]);
BtEtatAncien[i] = 0;
BtEtatAncien[i - 1] = 1;
XpressNet.setTrntPos (0x0, Aig[i] - 1, 1 );
delay (10);
}
}
}
// Fin de l'envoi de la commande DCC pour accessoires si changement de l'état des entrées

}
//-------------------------------------------------------------------------
// Message pour débogage

void notifyTrnt(uint8_t Adr_High, uint8_t Adr_Low, uint8_t Pos)
{
Serial.print(") ---> Position = ");
Serial.println(Pos, DEC);
}

//-------------------------------------------------------------------------
void notifyXNetPower (uint8_t State)
{
Serial.print(" --> Etat Centrale DCC = ");
Serial.println(State, HEX);
DCCEtat = State;

}
VNS-87
Causant
 
Messages: 204
Inscrit le: Dim 30 Mars 2014, 19:05
Localisation: Lille
Echelle pratiquée: HO
Club: Lille modelisme

Re: TCO Xpressnet

Publié: Sam 22 Sep 2018, 12:28 
Plume aurais tu une idée du problème ?

le montage Arduino change bien la position de l'aiguille sur la multimouse mais pas les servos
Hors les servos change bien de position avec la multimouse
VNS-87
Causant
 
Messages: 204
Inscrit le: Dim 30 Mars 2014, 19:05
Localisation: Lille
Echelle pratiquée: HO
Club: Lille modelisme

Re: TCO Xpressnet

Publié: Sam 22 Sep 2018, 15:30 
sam95 a écrit:Bonjour,

Voila j'ai réalisé un TCO à base d'arduino, il se branche sur la borne slave de la roco multimaus.

Je découvre bien tard ce sujet intéressant qui m'a "interpellé", car j'ai moi-même réalisé un "TCO" avec la carte "XCBUS TCO" de Paco Cañada. J'ai une centrale Lenz et une commande LH90.

Image


Voici le "TCO" :

Image


Mes aiguillages sont commandés par des micro servos, eux-mêmes pilotés par des décodeurs ESU Switchpilot Servo.

Image


Il y a un "relais programmable" (micro-automate) Telemecanique (à droite sur la première image) pour gérer les itinéraires. Ma solution est un peu limitée et fait "old style" par rapport à la tienne, mais ça fonctionne assez bien.

Dans ta vidéo de présentation, tu dis à un moment : "On entend le servo grogner parce que je n'ai pas réussi à l'antiparasiter convenablement".

Or j'ai le même problème : mes servos ne grognent pas vraiment, mais "chantent" plutôt en fin de course (note musicale). Je n'ai jamais trouvé pourquoi, mais je ne pensais pas à un parasitage. J'ai résolu (enfin, si l'on veut) ce problème en coupant momentanément l'alimentation (15 V CA, indépendante du bus DCC) des décodeurs avec un bouton poussoir de type fermé au repos. Une impulsion suffit. Mais ce n'est évidemment pas très satisfaisant.

Penses-tu qu'il y ait un inconvénient à laisser les servos "chanter" ? Et à quoi penserais-tu pour les antiparasiter ?
Avatar de l’utilisateur
Gibi
Prolixe
 
Messages: 1665
Inscrit le: Ven 27 Jan 2017, 02:44
Âge: 67
Echelle pratiquée: HO
Prénom: Bernard

Précédent

Retour vers Arduino

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 4 invité(s)