Índice general Foros Digital, Electricidad e Informática Problema con TCO y LZV200

Problema con TCO y LZV200

Moderador: 241-2001


Nota 12 Dic 2023 20:56

Desconectado
Mensajes: 303
Ubicación: Tres Cantos (Madrid)
Registrado: 30 Abr 2009 22:42
Hola:
Una vez solventado el problema con la Z21f, ahora tengo otro problema con el TCO.
Tengo un TCO con Arduino Mega y WpressNet (lo baje de una página de internet) que gobierna, mediante pulsadores, la posición de 11 servos para desvíos, también a base de Arduino Nano.
El sistema funcionaba correctamente tanto con el Multimause como con la consola DR5000 de Dijikreij, pero al conectarla a la Lenz LZV200 no logro funcione,
Del programa no se ha modificado nada y, lo curioso es que si que ejecuta el paro de emergencia. En el Serial Monitor aparece el movimiento, tanto si lo mando desde el TCO como desde el mando LH101 o el multimaus; y en el osciloscopio veo salir la trama del Mega hacia el XpressNet.
Adjunto el programa por si veis donde puede radicar el problema


//**************************************************//
// //
// Programme pour réaliser le TCO //
// du pupitre DEMO //
// avec carte Arduino MEGA 2560 //
// //
// TCO pour module Demo Aiguillage //
// //
// UAICF Nevers-Vauzelles //
// http://modelisme58.free.fr //
// //
// Novembre 2015 - Vers 1.3 //
// //
//**************************************************//

//-------------------------------------------------------------------------
// Bibliothèques nécessaires

//----------------------------------------------------------------------------
#include <XpressNet.h>
XpressNetClass XpressNet;

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

#if SerialDEBUG
#include <SoftwareSerial.h>
SoftwareSerial Debug(19, 18); // 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, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11}; // Adresse DCC des aiguillages, la premiere adresse 0 correspond arret d'urgence
int Bt[] = { 23, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51}; // Bornes de la carte ARDUINO

int NbreBoutons = 25; // Nbre total de boutons
int NbrePoussoirs = 24; // Nbre d'aiguillages commandés par Bouton Poussoir
int NbreLevier = 0; // 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 + 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");
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;

}

Nota 13 Dic 2023 15:14

Desconectado
Mensajes: 751
Ubicación: Salamanca
Registrado: 12 Ene 2012 14:44
Lo más prudente es actualizar la librería XpessNet.h a la última versión y desde la fuente más original posible, que creo que es:

https://github.com/Digital-MoBa/XpressNet de Phillip Gahtow.

Si eso no resuelve el problema entonces quizá estemos ante un cambio en el protocolo del XpressNet que en febrero de 2022 evolucionó de la versión 3.6 a la versión 4.0.

Si alguien puede ayudar en esto, estaría bien publicar aquí una comparativa de las diferencias o alguna pista al respecto (*). Creo que de momento el protocolo v.4.0 solo ha sido divulgado por Lenz en alemán.

https://www.lenz-elektronik.de/src/pdf/Lenz_XpressNet_Doku.pdf

Gracias.

(*) ¿Son las indicaciones en color azul del protocolo v.4.0 las únicas modificaciones respecto de la v.3.6?
Saludos

[Multimaus + GenLi-S88 + +z21f. + RocRail (MacOsX)]
H0 Renfe, sin catenaria


Volver a Digital, Electricidad e Informática

Síguenos en Facebook Síguenos en Youtube Síguenos en Instagram Feed - Nuevos Temas
©2017   -   Información Legal