Hola:
Desde mi ignorancia en la programación de Arduino he logrado modificar un sketch de un decóder, que encontré y no se quién lo realizó, para mover servos y, simultáneamente y con la misma dirección, actuar sobre las bobinas de un relé polarizado tipo TQ2-L2, para polarizar el corazón de los desvíos Peco. Hasta aquí todo funciona pero necesito temporizar la salida al relé para que se desconecte sobre los 500 milisegundos, y no lo logro. Ayuda por favor.
Este es el sketchs que me funciona.
//DECODER_SERVOS_Y_ACCESORIOS_PARA_POLARIZAR_CORAZON_DESVIO_CON_RELES_POLARIZADOS
// IR A configuración () PARA CONFIGURAR DIRECCIONES DCC, NÚMEROS PIN, ÁNGULOS DE SERVO
#define NUMSERVOS 1// Ingrese el número de servos aquí
#define SERVOSPEED 60 // [ms] entre actualizaciones de servo, menor es más rápido
#include <DCC_Decoder.h>
#include <Servo.h>
unsigned long timetomove;
typedef struct DCCAccessoryData {
int address; // Dirección DCC configurable por el usuario
byte outputpin; // Pin Arduino configurable por el usuario
byte outputpin2; // Pin Arduino configurable por el usuario
byte highlow; // estado outputpin: 1=HIGH, 0=LOW
byte highlow2; // estado outputpin2: 1=HIGH, 0=LOW
byte angle; // Ángulo actual de uso interno del punto de consigna del servo
byte setpoint; // Ángulo actual de uso interno del punto de consigna del servo
byte offangle; // Servo ángulo configurable por el usuario para el estado DCC = 0
byte onangle; // Servo ángulo configurable por el usuario para el estado DCC = 1
Servo servo;
};
DCCAccessoryData servo [NUMSERVOS];
void BasicAccDecoderPacket_Handler (int address, boolean activate, byte data) {
address -= 1;
address *= 4;
address += 1;
address += (data & 0x06) >> 1;
// address = address - 4 // descomenta esta línea para Roco Maus o Z21
boolean enable = (data & 0x01)? 1: 0;
for (int i = 0; i <NUMSERVOS; i ++) {
if (address == servo [i] .address) {
if (enable) servo [i] .highlow = 1;
else servo [i] .highlow = 0;
if (enable) servo [i] .highlow2 = 0;
else servo [i] .highlow2 =1;
}
}
}
void setup () {
// CONFIGURACIÓN DE SERVOS
// Copia y pega tantas veces como tengas servos
// La cantidad debe ser igual a NUMSERVOS
// No olvides incrementar el índice de la matriz
servo [0] .address = 1; // DCC direccion
servo [0] .outputpin = 13; // Pin accesorio Arduino
servo [0] .outputpin2 = 12; // Pin accesorio Arduino
servo [0] .highlow = 0; // No cambiar este valor
servo [0] .highlow2 = 0; // No cambiar este valor
servo [0] .servo.attach (4); // Arduino servo pin
servo [0] .offangle = 50; // Ángulo de servo para el estado DCC = 0
servo [0] .onangle = 100; // ángulo servo para el estado DCC = 1
DCC.SetBasicAccessoryDecoderPacketHandler (BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder (0x00, 0x00, 0);
}
void loop () {
DCC.loop (); // Llamada a la función de biblioteca que lee los datos DCC
for (byte i = 0; i <NUMSERVOS; i ++) {
if (servo [i].highlow == 1) {
digitalWrite (servo [i].outputpin, HIGH);
digitalWrite (servo [i].outputpin2, LOW);
servo [i]. highlow =1;
servo [i].setpoint = servo [i] .onangle;
}
else {
digitalWrite (servo [i].outputpin, LOW);
digitalWrite (servo [i].outputpin2, HIGH);
servo [i].setpoint = servo [i] .offangle;
}
}
// Mueve los servos cuando es timetomove
if (millis ()> timetomove) {
timetomove = millis () + (unsigned long) SERVOSPEED;
for (byte i = 0; i <NUMSERVOS; i ++) {
if (servo [i].angle <servo [i].setpoint) servo [i] .angle ++;
if (servo [i].angle> servo [i].setpoint) servo [i] .angle--;
servo [i].servo.write (servo [i].angle);
}
}
}
Saludos y gracias