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;
}