Hi,
I have problems with servo control on a Arduino Nano for manually switching turnouts on a analog model railway.
After power on, pressing one of the buttons, that servo goes with reduced speed as it should be.
Pressing another button, that servo goes high speed to endpoint, high speed to midpoint, and finally slow speed to endpoint.
That first high speed gives a short on the layout due to the frogrelay which should go on or off at midpoint.
ServoSpeed.h was made by user Korman.
I alse found another version dated 2013, but that one has the same issues with the speed.
Regards, Martin.
// servo test
#include <VarSpeedServo.h>
#define NrServos sizeof(ServoMap)
#define NrFrogs sizeof(FrogMap)
VarSpeedServo myservo;
const byte ServoMap[] = {9, 7, 5, 3};
const byte FrogMap[] = {10, 8, 6, 4};
byte ServoPos[] = {0,0,0,0};
const byte LedArduino = 13;
const int BeginPos = 45;
const int MidPos = 90;
const int EndPos = 135;
int Switchnr;
// ************************************************
void setup() {
//setup the LED
pinMode(LedArduino, OUTPUT);
digitalWrite(LedArduino, LOW);
// setup frog pins
for (byte i = 0; i < NrFrogs; i++) {
pinMode(FrogMap[i], OUTPUT);
digitalWrite(FrogMap[i], LOW);
}
// setup servo pins
for (byte i = 0; i < NrServos; i++) {
pinMode(ServoMap[i], OUTPUT);
digitalWrite(ServoMap[i], LOW);
}
} // end setup
// ************************************************
void loop() {
GetSwitch();
if (Switchnr < 8) {
Switchnr = Switchnr / 2;
digitalWrite(LedArduino, HIGH);
myservo.attach(ServoMap[Switchnr]);
if (ServoPos[Switchnr] == 1) {
myservo.slowmove(MidPos, 30);
delay(1000); //wait for servo
digitalWrite(FrogMap[Switchnr], HIGH);
myservo.slowmove(BeginPos, 30);
ServoPos[Switchnr] = 0;
}
else {
myservo.slowmove(MidPos, 30);
delay(1000);
digitalWrite(FrogMap[Switchnr], LOW);
myservo.slowmove(EndPos,30);
ServoPos[Switchnr] = 1;
}
delay(1500); // wait for servo
myservo.detach();
digitalWrite(LedArduino, LOW);
}
} // end loop
// ************************************************
void GetSwitch() {
int sensorValue;
sensorValue = analogRead(A6);
if (sensorValue < 1000) { // switch pressed?
Switchnr = map(sensorValue, 0, 1023, 0, 9);
}
else {
Switchnr = 9;
}
while (sensorValue < 1000){ // wait for switch release
delay (20); // give a-d converter some time
sensorValue = analogRead(A6);
}
}