Bonjour,
Pour le moment je n'ai cablé aucun switch sur mon arduino, j'ai juste branché la liaison avec la centrale et selon la doc je devrais avoir dans la console série un affichage de l'état de centrale = 0. Hors moi j'ai 255, qui veut dire qu'il n'y a pas de communication avec la centrale.
J'ai regardé le code et j'ai l'impression qu'il se sert de l'alimentation via la centrale et le cable RJ11 pour contrôler l'état de la communication, hors pour le moment je n'ai pas branché cette alim sur l'arduino. Pensez-vous que ça puisse être cela ?
**************************************************//
// //
// 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_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,14,14,13,13,28,28,29,27,12,11}; // Adresse DCC des aiguillages
int Bt[] = {23,25,27,29,31,33,35,37,39,41,43}; // Bornes de la carte ARDUINO
int NbreBoutons = 0; // Nbre total de boutons
int NbrePoussoirs = 3; // Nbre d'aiguillages commandés par Bouton Poussoir
int NbreLevier = 4; // 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");
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;
}
Je ne peux pas tester avant demain soir c'est pour cela que je demande.
De plus puis-je brancher de VCCin de 12v et en même temps la prise USB sur l'arduino mega ?