We are using Arduino Uno to control an animatronic. It does not have servos, only air-powered cylinders, LED lights and sound. The program was working fine until we added an idle show (movements that happen without a trigger). The sketch now glitches frequently. It will either freeze, rapid fire during the show, the main will partially go off, or the main will go off when there is no trigger. (All relating to the main show that originally worked just fine).
We have verified power requirements are correct.
We have debugged.
It did the entire show without a trigger once (printed this)
We are unsure what is happening in the code. Attaching the code we are currently using. Any help would be awesome!
[code]
/* 2022.02.02-v1 */
int PIN_TRIGGER = 3;
int SOUND_OUTPUT = 2;
int MAIN_OUTPUT = 13;
int EYES_OUTPUT = 12;
int LARMUP_OUTPUT = 11;
int RARMUP_OUTPUT = 10;
int LELBOWUP_OUTPUT = 9;
int RELBOWUP_OUTPUT = 8;
int LARMTURN_OUTPUT = 7;
int RARMTURN_OUTPUT = 6;
int MOUTH_OUTPUT = 5;
int HEADTURN_OUTPUT = 4;
void setup()
{
Serial.begin(9600);
Serial.println("setup(): start");
pinMode(PIN_TRIGGER, INPUT);
pinMode(MAIN_OUTPUT, OUTPUT);
digitalWrite(MAIN_OUTPUT, HIGH);
pinMode(EYES_OUTPUT, OUTPUT);
digitalWrite(EYES_OUTPUT, HIGH);
pinMode(LARMUP_OUTPUT, OUTPUT);
digitalWrite(LARMUP_OUTPUT, HIGH);
pinMode(RARMUP_OUTPUT, OUTPUT);
digitalWrite(RARMUP_OUTPUT, HIGH);
pinMode(LELBOWUP_OUTPUT, OUTPUT);
digitalWrite(LELBOWUP_OUTPUT, HIGH);
pinMode(RELBOWUP_OUTPUT, OUTPUT);
digitalWrite(RELBOWUP_OUTPUT, HIGH);
pinMode(LARMTURN_OUTPUT, OUTPUT);
digitalWrite(LARMTURN_OUTPUT, HIGH);
pinMode(RARMTURN_OUTPUT, OUTPUT);
digitalWrite(RARMTURN_OUTPUT, HIGH);
pinMode(MOUTH_OUTPUT, OUTPUT);
digitalWrite(MOUTH_OUTPUT, HIGH);
pinMode(HEADTURN_OUTPUT, OUTPUT);
digitalWrite(HEADTURN_OUTPUT, HIGH);
pinMode(SOUND_OUTPUT, OUTPUT);
digitalWrite(SOUND_OUTPUT, HIGH);
Serial.println("setup(): settle ...");
delay(2000);
Serial.println("setup(): done");
}
void prop_reset()
{
Serial.println("prop_reset(): start");
digitalWrite(MAIN_OUTPUT, HIGH);
digitalWrite(EYES_OUTPUT, HIGH);
digitalWrite(LARMUP_OUTPUT, HIGH);
digitalWrite(RARMUP_OUTPUT, HIGH);
digitalWrite(LELBOWUP_OUTPUT, HIGH);
digitalWrite(RELBOWUP_OUTPUT, HIGH);
digitalWrite(LARMTURN_OUTPUT, HIGH);
digitalWrite(RARMTURN_OUTPUT, HIGH);
digitalWrite(MOUTH_OUTPUT, HIGH);
digitalWrite(HEADTURN_OUTPUT, HIGH);
digitalWrite(SOUND_OUTPUT, HIGH);
Serial.println("prop_reset(): settle ...");
delay(500);
Serial.println("prop_reset(): done");
}
int LOOP_DELAY = 50;
bool delay_trigger(int sleep)
{
int countdown = sleep;
Serial.print("delay_trigger(");
Serial.print(sleep);
Serial.println("): start");
do {
delay(LOOP_DELAY);
if (digitalRead(PIN_TRIGGER) == HIGH) {
Serial.println("delay_trigger(): end (triggered)");
return true;
}
countdown -= LOOP_DELAY;
} while (countdown > 0);
Serial.println("delay_trigger(): end (timeout)");
return false;
}
void prop_idle()
{
Serial.println("prop_idle(): start");
while ( true ) {
digitalWrite(EYES_OUTPUT,LOW); //ON
if (delay_trigger(150)) {
break;
}
digitalWrite(HEADTURN_OUTPUT,LOW); //ON
if (delay_trigger(4500)) {
break;
}
digitalWrite(EYES_OUTPUT,HIGH); //OFF
if (delay_trigger(3000)) {
break;
}
digitalWrite(EYES_OUTPUT,LOW); //ON
if (delay_trigger(150)) {
break;
}
digitalWrite(HEADTURN_OUTPUT,HIGH); //OFF
if (delay_trigger(4500)) {
break;
}
digitalWrite(EYES_OUTPUT,HIGH); //OFF
if (delay_trigger(3000)) {
break;
}
}
Serial.println("prop_idle(): reset");
prop_reset();
Serial.println("prop_idle(): end");
}
void prop_show()
{
Serial.println("prop_show(): start");
digitalWrite(MAIN_OUTPUT, LOW); //ON
digitalWrite(MOUTH_OUTPUT, LOW); //ON
digitalWrite(SOUND_OUTPUT, LOW); //ON
delay(1000);
digitalWrite(EYES_OUTPUT, LOW); //ON
delay(500); //1500
digitalWrite(LARMUP_OUTPUT, LOW); //ON
digitalWrite(SOUND_OUTPUT, HIGH); //OFF
delay(500); //2000
digitalWrite(RARMUP_OUTPUT, LOW); //ON
delay(650);
digitalWrite(EYES_OUTPUT, HIGH); //OFF //2650
digitalWrite(LARMTURN_OUTPUT, LOW); //ON
digitalWrite(LELBOWUP_OUTPUT, LOW); //ON
delay(250);
digitalWrite(EYES_OUTPUT, LOW); //ON
delay(250); //3150
digitalWrite(RARMTURN_OUTPUT,LOW); //ON
digitalWrite(HEADTURN_OUTPUT, LOW); //ON
delay(500);
digitalWrite(EYES_OUTPUT, HIGH); //OFF
delay(250);
digitalWrite(EYES_OUTPUT, LOW); //ON
delay(250); //4150
digitalWrite(MAIN_OUTPUT, HIGH); //OFF
digitalWrite(RELBOWUP_OUTPUT,LOW); //ON
digitalWrite(LELBOWUP_OUTPUT,HIGH); //OFF
delay(600); //4750
digitalWrite(MOUTH_OUTPUT, HIGH); //OFF
digitalWrite(LARMTURN_OUTPUT,HIGH); //OFF
digitalWrite(HEADTURN_OUTPUT,HIGH); //OFF
delay(250);
digitalWrite(MAIN_OUTPUT, LOW); //ON
delay(250); //5250
digitalWrite(RELBOWUP_OUTPUT,HIGH); //OFF
digitalWrite(MOUTH_OUTPUT, LOW); //ON
digitalWrite(RARMTURN_OUTPUT,HIGH); //OFF
delay(750); //6000
digitalWrite(LELBOWUP_OUTPUT, LOW); //ON
delay(300);
digitalWrite(EYES_OUTPUT, HIGH); //OFF
delay(300); //6600
digitalWrite(EYES_OUTPUT, LOW); //ON
digitalWrite(HEADTURN_OUTPUT,LOW); //ON
digitalWrite(LARMTURN_OUTPUT,LOW); //ON
digitalWrite(RARMUP_OUTPUT, HIGH); //OFF
delay(750); //7350
digitalWrite(MOUTH_OUTPUT, HIGH); //OFF
digitalWrite(LARMUP_OUTPUT, HIGH); //OFF
delay(400); //7750
digitalWrite(MOUTH_OUTPUT, LOW); //ON
digitalWrite(RARMUP_OUTPUT, LOW); //ON
delay(500); //8250
digitalWrite(LARMUP_OUTPUT, LOW); //ON
delay(500); //8750
digitalWrite(HEADTURN_OUTPUT,HIGH); //OFF
digitalWrite(LARMTURN_OUTPUT,HIGH); //OFF
digitalWrite(RARMTURN_OUTPUT,LOW); //ON
delay(1000); //9750
digitalWrite(HEADTURN_OUTPUT,LOW);//ON
digitalWrite(RELBOWUP_OUTPUT,LOW); //ON
delay(250);
digitalWrite(EYES_OUTPUT, HIGH); //OFF
delay(250); //10250
digitalWrite(MAIN_OUTPUT, HIGH); //OFF
digitalWrite(EYES_OUTPUT, LOW); //ON
digitalWrite(RARMUP_OUTPUT, HIGH); //OFF
delay(350); //10600
digitalWrite(LARMTURN_OUTPUT,LOW); //ON
digitalWrite(LARMUP_OUTPUT, HIGH); //OFF
digitalWrite(RARMTURN_OUTPUT,HIGH); //OFF
delay(650); //11250
digitalWrite(MAIN_OUTPUT, LOW); //ON
digitalWrite(HEADTURN_OUTPUT,HIGH); //OFF
digitalWrite(MOUTH_OUTPUT, HIGH); //OFF
delay(500); //11750
digitalWrite(MOUTH_OUTPUT, LOW); //ON
delay(750);
digitalWrite(EYES_OUTPUT, HIGH); //OFF
delay(250); //12750
digitalWrite(EYES_OUTPUT, LOW); //ON
digitalWrite(RARMUP_OUTPUT, LOW); //ON
delay(500); //13250
digitalWrite(LARMUP_OUTPUT, LOW); //ON
delay(500); //13750
digitalWrite(LARMTURN_OUTPUT,HIGH); //OFF
digitalWrite(RARMTURN_OUTPUT,LOW); //ON
digitalWrite(HEADTURN_OUTPUT,LOW); //ON
delay(750); //14500
digitalWrite(HEADTURN_OUTPUT,HIGH); //OFF
digitalWrite(LARMUP_OUTPUT, HIGH); //OFF
digitalWrite(RARMTURN_OUTPUT,HIGH); //OFF
digitalWrite(RARMUP_OUTPUT, HIGH); //OFF
delay(500); //15000
digitalWrite(MOUTH_OUTPUT, HIGH); //OFF
digitalWrite(MAIN_OUTPUT, HIGH); //OFF
digitalWrite(RELBOWUP_OUTPUT, HIGH); //OFF
digitalWrite(LELBOWUP_OUTPUT, HIGH); //OFF
digitalWrite(EYES_OUTPUT, HIGH); //OFF
Serial.println("prop_show(): reset");
prop_reset();
Serial.println("prop_show(): done");
}
void loop()
{
Serial.println("loop(): start");
prop_idle();
prop_show();
Serial.println("loop(): done");
}
[/code]