Hi guys,
I'm working on a program to test turnout motors for model railroads. The Arduino controls these motors via relays and receives feedback via photocouplers.
I use Serial.print() to keep track of the number of succesful operations. However, This connection is often interrupted and won't start again. Please tell me, if you find any flaws in my code that might cause this problem.
// ports:
#define COIL_A 12 // relays for turnout motors
#define COIL_B 10
#define COIL_C 8
#define COIL_D 6
#define OPTOS 4 // activates input of photocouplers using a relay
#define RM_A 9 // outputs of photocouplers
#define RM_B 11
#define RM_C 5
#define RM_D 7
// durations:
#define T_ON 250 // turn on motors
#define T_REC 250 // recharge capacitors
#define T_DISC 400 // downtime
#define T_OPTO 100 // activate photocouplers
// other:
#define IS 1 // frequency of messages
#define IMAX 100 // number of cycles
int i = 0;
int j = 0;
void setup(){
pinMode(COIL_A, OUTPUT);
pinMode(COIL_B, OUTPUT);
pinMode(COIL_C, OUTPUT);
pinMode(COIL_D, OUTPUT);
pinMode(OPTOS, OUTPUT);
pinMode(RM_A, INPUT_PULLUP);
pinMode(RM_B, INPUT_PULLUP);
pinMode(RM_C, INPUT_PULLUP);
pinMode(RM_D, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Betriebsbereit."); // This means "ready".
}
void loop(){
// Activate A and C
delay(400);
digitalWrite(COIL_A, HIGH);
delay(T_ON);
digitalWrite(COIL_A, LOW);
delay(T_REC);
digitalWrite(COIL_C, HIGH);
delay(T_ON);
digitalWrite(COIL_C, LOW);
// Read results for A and C
delay(T_REC);
digitalWrite(OPTOS, HIGH);
delay(T_OPTO);
if(HIGH == digitalRead(RM_A)){
error('A');
}else if(HIGH == digitalRead(RM_C)){
error('C');
}
digitalWrite(OPTOS, LOW);
// Activate B and D
delay(400);
digitalWrite(COIL_B, HIGH);
delay(T_ON);
digitalWrite(COIL_B, LOW);
delay(T_REC);
digitalWrite(COIL_D, HIGH);
delay(T_ON);
digitalWrite(COIL_D, LOW);
// Read results for B and D
delay(T_REC);
digitalWrite(OPTOS, HIGH);
delay(T_OPTO);
if(HIGH == digitalRead(RM_B)){
error('B');
}else if(HIGH == digitalRead(RM_D)){
error('D');
}
digitalWrite(OPTOS, LOW);
// keeping track of the number of cycles
i++;
j++;
if (IS == j){
Serial.print("i = ");
Serial.println(i);
j = 0;
}
if (i >= IMAX){
// Message to show up when a series is completed
Serial.println("Versuch abgeschlossen.");
Serial.print("Erfolgreiche Schaltvorgaenge: ");
Serial.println(i);
Serial.end();
while(true){
// do nothing
}
}
}
void error(char k){
// Messages to show up as soon as a motor fails
Serial.print("Endschalter leitet nicht:");
Serial.println(k);
Serial.println("Versuch angehalten.");
Serial.print("Erfolgreiche Schaltvorgänge: ");
Serial.println(i);
Serial.end();
while(true){
// do nothing
}
}
When I start the program, the Serial Monitor looks like this:
Betriebsbereit.
i = 1
i = 2
i = 3
However, after some time has passed, no new text will show up on the Serial Monitor. Sometimes it goes as far as i = 60, sometimes it stops just after "Betriebsbereit.". But whatever happens, the Arduino continues its program and keeps toggling the relays. But I do not receive any feedback. So if a motor breaks, I do not know how long it worked before. Any help appreciated. Thanks.