Ajout CV standards
This commit is contained in:
+35
-1
@@ -13,4 +13,38 @@ Basé sur un arduino nano, la partie électronique est constituée de :
|
|||||||
Principe, sur réception de commande accessoire DCC :
|
Principe, sur réception de commande accessoire DCC :
|
||||||
- Mise en route 'strobe' ON/OFF
|
- Mise en route 'strobe' ON/OFF
|
||||||
- Mise en route 'moteur pale' ON/OFF
|
- Mise en route 'moteur pale' ON/OFF
|
||||||
- Action sur le servo Up et Down ON/OFF/OFF
|
- Action sur le servo Up et Down ON/OFF/OFF
|
||||||
|
|
||||||
|
Le décodeur répond par défaut sur l'adresse 1
|
||||||
|
|
||||||
|
## Note
|
||||||
|
|
||||||
|
Sur les réseaux ferroviaires miniatures en DCC, il n'y a pas d'adresse unique par défaut universelle, mais la convention la plus répandue chez la majorité des fabricants est de livrer leurs décodeurs d'accessoires (aiguillages, signaux, accessoires de décor) sur l'adresse 1.
|
||||||
|
|
||||||
|
Certains modules multi- Sorties (Notre cas car on a bseoin de 3 informations) reçoivent par défaut le premier groupe d'adresses (ex. sorties 1 à 4).
|
||||||
|
|
||||||
|
Pour modifier son adresse ?
|
||||||
|
|
||||||
|
La norme NMRA prévoit deux méthodes principales pour régler l'adresse d'un accessoire :
|
||||||
|
|
||||||
|
1. Via les CVs (Configuration Variables)
|
||||||
|
|
||||||
|
Pour la plupart des décodeurs modernes réglables par CV, l'adresse principale n'est pas stockée dans un seul CV, mais est répartie sur deux CVs distincts pour pouvoir dépasser la valeur 255 (comme pour l'adresse longue des locomotives) :
|
||||||
|
|
||||||
|
- CV 513 (Adresse basse / Decoder Address LSB)
|
||||||
|
- CV 521 (Adresse haute / Decoder Address MSB)
|
||||||
|
|
||||||
|
Attention à l'adressage par sortie / par décodeur :
|
||||||
|
|
||||||
|
Selon les marques, certains décodeurs attribuent une adresse par boîtier (4 sorties regroupées), tandis que d'autres permettent d'attribuer une adresse individuelle à chaque sortie. Sur les décodeurs gérant chaque sortie séparément, les CVs d'adresses individuelles sont souvent organisés par blocs de CVs spécifiques (consultez la notice du fabricant).
|
||||||
|
|
||||||
|
|
||||||
|
Récapitulatif des CVs standards NMRA pour accessoires (S-9.2.2)
|
||||||
|
|
||||||
|
| CV | Description |
|
||||||
|
| -------- | ------------------------------------------- |
|
||||||
|
| CV 513 | Adresse d'accessoire (Bits de poids faible) |
|
||||||
|
| CV 521 | Adresse d'accessoire (Bits de poids fort) |
|
||||||
|
| CV 519 | Version du décodeur (Lecture seule) |
|
||||||
|
| CV 520 | Identifiant fabricant (Lecture seule) |
|
||||||
|
| CV 512/8 | Reset d'usine (Écrire la valeur 8 réinitialise souvent le décodeur à l'adresse 1) |
|
||||||
|
|||||||
+71
-3
@@ -3,28 +3,48 @@
|
|||||||
#include <NmraDcc.h>
|
#include <NmraDcc.h>
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
// Affectation des PINs Arduino
|
||||||
#define DCC_SIGNAL_PIN 2
|
#define DCC_SIGNAL_PIN 2
|
||||||
#define LED_PIN 3
|
#define LED_PIN 3
|
||||||
#define PWM_PIN 5
|
#define PWM_PIN 5
|
||||||
#define SERVO_PIN 6
|
#define SERVO_PIN 6
|
||||||
|
|
||||||
|
// Valeurs des CV (Configuration Variables)
|
||||||
|
#define CV_ADDRESS_LSB 513
|
||||||
|
#define CV_ADDRESS_MSB 521
|
||||||
#define CV_PALES_SPEED 100
|
#define CV_PALES_SPEED 100
|
||||||
#define CV_MAX_UP 101
|
#define CV_MAX_UP 101
|
||||||
#define CV_MAX_DOWN 102
|
#define CV_MAX_DOWN 102
|
||||||
|
|
||||||
|
// Valeurs par défaut des CV
|
||||||
#define DEFAULT_PALES_SPEED 255
|
#define DEFAULT_PALES_SPEED 255
|
||||||
#define DEFAULT_MAX_UP 180
|
#define DEFAULT_MAX_UP 180
|
||||||
#define DEFAULT_MAX_DOWN 0
|
#define DEFAULT_MAX_DOWN 0
|
||||||
|
#define DEFAULT_ADDRESS 1
|
||||||
#define VITESSE 20 // Temps en millisecondes entre chaque pas de servo
|
#define VITESSE 20 // Temps en millisecondes entre chaque pas de servo
|
||||||
|
|
||||||
#define EEPROM_SIG_ADDR 0
|
#define EEPROM_SIG_ADDR 0
|
||||||
#define EEPROM_SIG_VALUE 0xA5
|
#define EEPROM_SIG_VALUE 0xA5
|
||||||
|
#define DIY_MANUFACTURER_ID 13
|
||||||
|
|
||||||
|
struct DCCAccessoryConfig {
|
||||||
|
byte Sig; // Signature pour vérifier la validité de la structure (0x45)
|
||||||
|
byte ManufacturerID; // Manufacturer ID (0-255)
|
||||||
|
byte Version; // Version of the accessory decoder (0-255)
|
||||||
|
|
||||||
|
int address; // From 1 to 2044
|
||||||
|
byte MotorSpeed; // Speed of the motor (0-255)
|
||||||
|
byte ServoMaxUp; // Maximum position for servo up (0-180)
|
||||||
|
byte ServoMaxDown; // Maximum position for servo down (0-180)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
NmraDcc Dcc;
|
NmraDcc Dcc;
|
||||||
Servo servoMotor;
|
Servo servoMotor;
|
||||||
uint8_t PalesSpeed = DEFAULT_PALES_SPEED;
|
uint8_t PalesSpeed = DEFAULT_PALES_SPEED;
|
||||||
uint8_t ServoMaxUp = DEFAULT_MAX_UP;
|
uint8_t ServoMaxUp = DEFAULT_MAX_UP;
|
||||||
uint8_t ServoMaxDown = DEFAULT_MAX_DOWN;
|
uint8_t ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||||
|
uint16_t currentAddress = DEFAULT_ADDRESS;
|
||||||
int STROBE_ON = 0;
|
int STROBE_ON = 0;
|
||||||
int HelicoUP = 0;
|
int HelicoUP = 0;
|
||||||
int currentServoPos = 90;
|
int currentServoPos = 90;
|
||||||
@@ -54,9 +74,34 @@ void notifyCVChange(uint16_t CV, uint8_t Value)
|
|||||||
ServoMaxUp = Value;
|
ServoMaxUp = Value;
|
||||||
} else if (CV == CV_MAX_DOWN) {
|
} else if (CV == CV_MAX_DOWN) {
|
||||||
ServoMaxDown = Value;
|
ServoMaxDown = Value;
|
||||||
|
} else if (CV == CV_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_LSB) {
|
||||||
|
currentAddress = (currentAddress & 0xFF00) | Value;
|
||||||
|
if (CV == CV_ADDRESS_LSB) {
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, Value);
|
||||||
|
} else {
|
||||||
|
Dcc.setCV(CV_ADDRESS_LSB, Value);
|
||||||
|
}
|
||||||
|
} else if (CV == CV_ADDRESS_MSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
|
||||||
|
currentAddress = (currentAddress & 0x00FF) | ((Value & 0x07) << 8);
|
||||||
|
if (CV == CV_ADDRESS_MSB) {
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, Value & 0x07);
|
||||||
|
} else {
|
||||||
|
Dcc.setCV(CV_ADDRESS_MSB, Value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t notifyCVValid (uint16_t CV, uint8_t Writable)
|
||||||
|
{
|
||||||
|
if (CV == CV_PALES_SPEED || CV == CV_MAX_UP || CV == CV_MAX_DOWN ||
|
||||||
|
CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB ||
|
||||||
|
CV == CV_ACCESSORY_DECODER_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notifie la réinitialisation des valeurs par défaut de la CV.
|
* Notifie la réinitialisation des valeurs par défaut de la CV.
|
||||||
*/
|
*/
|
||||||
@@ -65,6 +110,8 @@ void notifyCVResetFactoryDefault()
|
|||||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||||
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
||||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
|
||||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +125,9 @@ void loadCvDefaultsIfNeeded()
|
|||||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||||
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
||||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
|
||||||
|
|
||||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,6 +152,24 @@ void loadCvFromDcc()
|
|||||||
if (ServoMaxDown == 0) {
|
if (ServoMaxDown == 0) {
|
||||||
ServoMaxDown = DEFAULT_MAX_DOWN;
|
ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t addrLo = Dcc.getCV(CV_ADDRESS_LSB);
|
||||||
|
uint8_t addrHi = Dcc.getCV(CV_ADDRESS_MSB) & 0x07;
|
||||||
|
uint16_t address = ((uint16_t)addrHi << 8) | addrLo;
|
||||||
|
if (address == 0) {
|
||||||
|
addrLo = Dcc.getCV(CV_ACCESSORY_DECODER_ADDRESS_LSB);
|
||||||
|
addrHi = Dcc.getCV(CV_ACCESSORY_DECODER_ADDRESS_MSB) & 0x07;
|
||||||
|
address = ((uint16_t)addrHi << 8) | addrLo;
|
||||||
|
}
|
||||||
|
if (address == 0) {
|
||||||
|
address = DEFAULT_ADDRESS;
|
||||||
|
}
|
||||||
|
currentAddress = address;
|
||||||
|
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, addrLo);
|
||||||
|
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, addrHi);
|
||||||
|
Dcc.setCV(CV_ADDRESS_LSB, addrLo);
|
||||||
|
Dcc.setCV(CV_ADDRESS_MSB, addrHi);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,9 +219,9 @@ void setup()
|
|||||||
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
|
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Initialise le décodeur DCC avec l'adresse 10 et les fonctionnalités de décodeur d'accessoires et de mode d'adresse de sortie.
|
// Initialise le décodeur DCC en mode accessoire avec filtrage d'adresse sur l'adresse DCC courante.
|
||||||
Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0);
|
Dcc.init(MAN_ID_DIY, 10, FLAGS_MY_ADDRESS_ONLY | FLAGS_DCC_ACCESSORY_DECODER | FLAGS_OUTPUT_ADDRESS_MODE, 0);
|
||||||
// Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées.
|
|
||||||
loadCvDefaultsIfNeeded();
|
loadCvDefaultsIfNeeded();
|
||||||
loadCvFromDcc();
|
loadCvFromDcc();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user