Changement comportement
This commit is contained in:
@@ -11,3 +11,4 @@ build_flags =
|
|||||||
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
arduino-libraries/Servo@^1.1.9
|
arduino-libraries/Servo@^1.1.9
|
||||||
|
mrrwa/NmraDcc@^2.0.17
|
||||||
|
|||||||
+52
-22
@@ -1,42 +1,72 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Servo.h>
|
#include <Servo.h>
|
||||||
|
#include <NmraDcc.h>
|
||||||
|
|
||||||
#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
|
||||||
|
|
||||||
|
// Parametres mécaniques
|
||||||
|
#define PALES_SPEED 255 // Définir la vitesse maximale des pales (PWM)
|
||||||
|
#define MAX_UP 180 // Position maximale du servo
|
||||||
|
#define MAX_DOWN 0 // Position minimale du servo
|
||||||
|
NmraDcc Dcc;
|
||||||
Servo servoMotor;
|
Servo servoMotor;
|
||||||
volatile bool dccSignalReceived = false;
|
int STROBE_ON=0;
|
||||||
|
int HelicoUP=0
|
||||||
|
|
||||||
void IRAM_ATTR handleDccSignal() {
|
void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower)
|
||||||
dccSignalReceived = true;
|
{
|
||||||
|
// Exemple de mappage des adresses DCC vers les sorties du projet
|
||||||
|
if (Addr == 1) {
|
||||||
|
// Utiliser l'adresse DCC 1 pour indiquer si le strobe est activé ou non
|
||||||
|
STROBE_ON = Direction;
|
||||||
|
} else if (Addr == 2) {
|
||||||
|
// Mise en marche des pales
|
||||||
|
analogWrite(PWM_PIN, Direction ? PALES_SPEED : 0);
|
||||||
|
} 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;
|
||||||
|
//servoMotor.write(Direction ? 180 : 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup() {
|
void notifyDccSigOutputState(uint16_t Addr, uint8_t State)
|
||||||
pinMode(DCC_SIGNAL_PIN, INPUT);
|
{
|
||||||
|
// Exemple simple : utiliser un signal DCC pour piloter la LED
|
||||||
|
digitalWrite(LED_PIN, State ? HIGH : LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
pinMode(LED_PIN, OUTPUT);
|
pinMode(LED_PIN, OUTPUT);
|
||||||
pinMode(PWM_PIN, OUTPUT);
|
pinMode(PWM_PIN, OUTPUT);
|
||||||
|
|
||||||
servoMotor.attach(SERVO_PIN);
|
servoMotor.attach(SERVO_PIN);
|
||||||
servoMotor.write(90); // position centrale
|
servoMotor.write(90);
|
||||||
|
|
||||||
attachInterrupt(digitalPinToInterrupt(DCC_SIGNAL_PIN), handleDccSignal, RISING);
|
#ifdef digitalPinToInterrupt
|
||||||
|
Dcc.pin(DCC_SIGNAL_PIN, 0);
|
||||||
|
#else
|
||||||
|
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop()
|
||||||
if (dccSignalReceived) {
|
{
|
||||||
dccSignalReceived = false;
|
Dcc.process();
|
||||||
|
if (STROBE_ON) {
|
||||||
// TODO: Décoder la commande DCC et piloter les sorties
|
// STROBE_ON -> 2 clignotements rapides de 100ms séparés de 1s
|
||||||
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
|
// @TODO: Ajouter un timer pour ne pas bloquer le loop() et permettre à DCC de continuer à fonctionner
|
||||||
analogWrite(PWM_PIN, digitalRead(PWM_PIN) ? 0 : 255);
|
digitalWrite(LED_PIN, HIGH);
|
||||||
servoMotor.write(0);
|
delay(100);
|
||||||
delay(250);
|
digitalWrite(LED_PIN, LOW);
|
||||||
servoMotor.write(180);
|
delay(100);
|
||||||
delay(250);
|
digitalWrite(LED_PIN, HIGH);
|
||||||
servoMotor.write(90);
|
delay(100);
|
||||||
|
digitalWrite(LED_PIN, LOW);
|
||||||
|
delay(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
delay(10);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user