Ajout CV de programmation
This commit is contained in:
+47
-15
@@ -7,34 +7,62 @@
|
|||||||
#define PWM_PIN 5
|
#define PWM_PIN 5
|
||||||
#define SERVO_PIN 6
|
#define SERVO_PIN 6
|
||||||
|
|
||||||
// Parametres mécaniques
|
#define CV_PALES_SPEED 100
|
||||||
#define PALES_SPEED 255 // Définir la vitesse maximale des pales (PWM)
|
#define CV_MAX_UP 101
|
||||||
#define MAX_UP 180 // Position maximale du servo
|
#define CV_MAX_DOWN 102
|
||||||
#define MAX_DOWN 0 // Position minimale du servo
|
|
||||||
|
#define DEFAULT_PALES_SPEED 255
|
||||||
|
#define DEFAULT_MAX_UP 180
|
||||||
|
#define DEFAULT_MAX_DOWN 0
|
||||||
|
|
||||||
NmraDcc Dcc;
|
NmraDcc Dcc;
|
||||||
Servo servoMotor;
|
Servo servoMotor;
|
||||||
int STROBE_ON=0;
|
uint8_t PalesSpeed = DEFAULT_PALES_SPEED;
|
||||||
int HelicoUP=0
|
uint8_t ServoMaxUp = DEFAULT_MAX_UP;
|
||||||
|
uint8_t ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||||
|
int STROBE_ON = 0;
|
||||||
|
int HelicoUP = 0;
|
||||||
|
|
||||||
|
struct CVPair
|
||||||
|
{
|
||||||
|
uint16_t CV;
|
||||||
|
uint8_t Value;
|
||||||
|
};
|
||||||
|
|
||||||
|
CVPair FactoryDefaultCVs[] = {
|
||||||
|
{CV_PALES_SPEED, DEFAULT_PALES_SPEED},
|
||||||
|
{CV_MAX_UP, DEFAULT_MAX_UP},
|
||||||
|
{CV_MAX_DOWN, DEFAULT_MAX_DOWN},
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t FactoryDefaultCVIndex = 0;
|
||||||
|
|
||||||
|
void notifyCVAck(void)
|
||||||
|
{
|
||||||
|
// Si le contrôleur demande un ACK de programmation CV, on peut utiliser une LED ou un signal dédié.
|
||||||
|
digitalWrite(LED_PIN, HIGH);
|
||||||
|
delay(6);
|
||||||
|
digitalWrite(LED_PIN, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void notifyCVResetFactoryDefault()
|
||||||
|
{
|
||||||
|
FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs) / sizeof(CVPair);
|
||||||
|
}
|
||||||
|
|
||||||
void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower)
|
void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower)
|
||||||
{
|
{
|
||||||
// Exemple de mappage des adresses DCC vers les sorties du projet
|
|
||||||
if (Addr == 1) {
|
if (Addr == 1) {
|
||||||
// Utiliser l'adresse DCC 1 pour indiquer si le strobe est activé ou non
|
|
||||||
STROBE_ON = Direction;
|
STROBE_ON = Direction;
|
||||||
} else if (Addr == 2) {
|
} else if (Addr == 2) {
|
||||||
// Mise en marche des pales
|
analogWrite(PWM_PIN, Direction ? PalesSpeed : 0);
|
||||||
analogWrite(PWM_PIN, Direction ? PALES_SPEED : 0);
|
|
||||||
} else if (Addr == 3) {
|
} else if (Addr == 3) {
|
||||||
// TODO à changer pour une commande lente du servo, par exemple en utilisant un timer pour faire un mouvement progressif
|
|
||||||
HelicoUP = Direction;
|
HelicoUP = Direction;
|
||||||
//servoMotor.write(Direction ? 180 : 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void notifyDccSigOutputState(uint16_t Addr, uint8_t State)
|
void notifyDccSigOutputState(uint16_t Addr, uint8_t State)
|
||||||
{
|
{
|
||||||
// Exemple simple : utiliser un signal DCC pour piloter la LED
|
|
||||||
digitalWrite(LED_PIN, State ? HIGH : LOW);
|
digitalWrite(LED_PIN, State ? HIGH : LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,9 +85,13 @@ void setup()
|
|||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
Dcc.process();
|
Dcc.process();
|
||||||
|
|
||||||
|
if (FactoryDefaultCVIndex && Dcc.isSetCVReady()) {
|
||||||
|
FactoryDefaultCVIndex--;
|
||||||
|
Dcc.setCV(FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value);
|
||||||
|
}
|
||||||
|
|
||||||
if (STROBE_ON) {
|
if (STROBE_ON) {
|
||||||
// STROBE_ON -> 2 clignotements rapides de 100ms séparés de 1s
|
|
||||||
// @TODO: Ajouter un timer pour ne pas bloquer le loop() et permettre à DCC de continuer à fonctionner
|
|
||||||
digitalWrite(LED_PIN, HIGH);
|
digitalWrite(LED_PIN, HIGH);
|
||||||
delay(100);
|
delay(100);
|
||||||
digitalWrite(LED_PIN, LOW);
|
digitalWrite(LED_PIN, LOW);
|
||||||
|
|||||||
Reference in New Issue
Block a user