1
Vos projets / Re : TCO arduino Xpressnet
« le: janvier 29, 2017, 09:45:49 pm »
Bonne question...... comment puis-je savoir cela ?
Le forum LOCODUINO est consacré aux discussions ayant trait à l'utilisation de l'Arduino dans les automatismes et les animations pour le train miniature. Nous avons eu récemment quelques inscriptions de personnes ayant des projets plus généraux mais surtout inapplicables au train miniature. Si votre projet ou vos questions ne concernent pas le modélisme ferroviaire, ne vous inscrivez pas, vous perdriez votre temps et nous aussi.
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.
**************************************************//
// //
// 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;
}