Hi there, I am using arduino to open/close the hatch of a model kit using servo SG90 motor. I wrote the code and everything works fine with my old 3rd party arduino UNO board (the one you can see in my video, the on the left). Unfortunately I put a pin into a wrong place and the old board was not working anymore.
I bought a new arduino R4. I uploaded the same code. But the servo motor does not rotate as smooth as before. It now rotates in interval as you can see in the video. Does anybody know why this happens? Thank you for your help.Servo moving at interval
#define LED_O 3
#define LED_G 4
#define LED_R 5
#define LED_W 6
#define OnOffBUTTON_PIN 13
#define HatchBUTTON 12
#define LED_B1 2
#define LED_B2 7
#include <Servo.h>
Servo myservo;
byte OnOffbuttonState;
byte lastOnOffButtonState = LOW;
byte lastMoveButtonState = LOW;
unsigned long lastTimeOnOffButtonStateChanged = 0;
unsigned long lastMoveButtonStateChange = 0;
int CurrentOperation = 0; // to define current operation status
int gearinitialposition = 24; // hatch open related parameters
int lastgearPosition = gearinitialposition;
int gearPosition = gearinitialposition;
int gearPositionLimit = 145;
int gearturnAmount = 1;
unsigned long gearturnDelay = 50;
unsigned long gearstartWaitTime = 6000;
unsigned long gearendWaitTime = 6000;
unsigned long lastTimegearmove = 0;
unsigned long gearstartWaitTimea = 4500;
int brightness_w = 0; // white led related parameters
int fadeAmount_w = 1;
int limit_w = 80; // white led maximum brightness
unsigned long LastTime_w = 0; // last time white led brightness changes
unsigned long fadeInterval_w = 100; // time interval between white led brightness changes
unsigned long led_wStartWaitTime = 10000;
unsigned long led_wEndWaitTime = 10000;
unsigned long LastTime_g = 0; // green led related parameters
unsigned long flashInterval_g = 100;
unsigned long led_gStartWaitTime = 5000;
unsigned led_gEndWaitTime = 5000;
int NumberOfFlashLimit_g = 25;
int NumberOfFlash_g = 0;
int brightness_r = 0; // red led related parameters
unsigned long LastTime_r = 0;
int fadeAmount_r = 1;
int limit_r = 50;
unsigned long fadeInterval_r = 10;
unsigned long led_rStartWaitTime = gearstartWaitTime - 3000;
unsigned long led_rEndWaitTime = gearendWaitTime - 3000;
int led_rFlashCount = 0;
int led_rFlashCountLimit = 20;
int brightness_o = 0; // orange led related parameters
unsigned long LastTime_o = 0;
unsigned long led_oStartWaitTime = 15000;
unsigned long led_oEndWaitTime = 3000;
int fadeAmount_o = 1;
int limit_o = 50;
unsigned long fadeInterval_o = 15;
unsigned long LastTime_b1 = 0; // blue leds related parameters
unsigned long LastTime_b2 = 0;
unsigned long flashInterval_b = 500;
unsigned long led_b2Delay = flashInterval_b / 2 - 100;
unsigned long led_b1StartWaitTime = 5000;
unsigned long led_b1EndWaitTime = 5000;
unsigned long flashInterval_b1 = 5000;
unsigned long LastTimeB1Flash = 0;
unsigned long LastTimeB2Flash = LastTimeB1Flash + led_b2Delay;
int NumberOfFlashLimit_b = 25;
int NumberOfFlash_b1 = 0;
int NumberOfFlash_b2 = 0;
void setup() {
pinMode(LED_W, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(LED_O, OUTPUT);
pinMode(LED_B1, OUTPUT);
pinMode(LED_B2, OUTPUT);
pinMode(OnOffBUTTON_PIN, INPUT);
pinMode(HatchBUTTON, INPUT);
Serial.begin(9600);
myservo.attach(11);
myservo.write(gearinitialposition); // set servo angle to initial position
digitalWrite(LED_G, LOW); // turn all led off
digitalWrite(LED_R, LOW);
digitalWrite(LED_B1, LOW);
digitalWrite(LED_B2, LOW);
analogWrite(LED_W, brightness_w);
analogWrite(LED_O, brightness_o);
}
void loop() {
OnOffbuttonState = digitalRead(OnOffBUTTON_PIN);
lastMoveButtonState = digitalRead(HatchBUTTON);
Serial.print(LastTime_b1);
Serial.print(" ");
Serial.print(" ");
Serial.print(" ");
Serial.print(" ");
Serial.print(" ");
Serial.println(LastTime_b2);
if (CurrentOperation == 0 // Conditions to change to Stage 1 - pending input from On-Off button
&& OnOffbuttonState == HIGH
&& lastMoveButtonState == LOW) {
lastTimeOnOffButtonStateChanged = millis();
CurrentOperation = 1;
}
if (CurrentOperation == 1 // Conditions to change to Stage 2 - pending input to open hatch
&& OnOffbuttonState == HIGH
&& lastMoveButtonState == HIGH
&& lastgearPosition == gearPositionLimit) {
lastMoveButtonStateChange = millis();
CurrentOperation = 2;
led_rFlashCount = 0;
}
if (CurrentOperation == 1 // Conditions to change to Stage 4
&& OnOffbuttonState == LOW
&& lastMoveButtonState == LOW
&& lastgearPosition == gearPositionLimit
&& led_rFlashCount >= led_rFlashCountLimit) {
lastTimeOnOffButtonStateChanged = millis();
CurrentOperation = 4;
brightness_r = 0;
fadeAmount_r = 1;
led_rFlashCount = 0;
}
if (CurrentOperation == 2 // Conditions to change to Stage 3
&& OnOffbuttonState == HIGH
&& lastMoveButtonState == LOW
&& lastgearPosition == gearinitialposition) {
lastMoveButtonStateChange = millis();
CurrentOperation = 3;
led_rFlashCount = 0;
}
if (CurrentOperation == 3 // Conditions to change to Stage 4
&& OnOffbuttonState == LOW
&& lastMoveButtonState == LOW
&& lastgearPosition == gearPositionLimit) {
lastTimeOnOffButtonStateChanged = millis();
CurrentOperation = 4;
led_rFlashCount = 0;
}
if (CurrentOperation == 3 // Conditions to change back to Stage 2
&& OnOffbuttonState == HIGH
&& lastMoveButtonState == HIGH
&& lastgearPosition == gearPositionLimit) {
lastMoveButtonState = millis();
CurrentOperation = 2;
led_rFlashCount = 0;
}
if (CurrentOperation == 4 // Conditions to change to Stage 0
&& OnOffbuttonState == LOW
&& lastgearPosition == gearinitialposition
&& brightness_w == 0
&& brightness_o == 0
&& led_rFlashCount >= led_rFlashCountLimit) {
lastTimeOnOffButtonStateChanged = millis();
CurrentOperation = 0;
brightness_r = 0;
fadeAmount_r = 1;
led_rFlashCount = 0;
NumberOfFlash_b1 = 0;
NumberOfFlash_b2 = 0;
digitalWrite(LED_B1, LOW);
digitalWrite(LED_B2, LOW);
}
//
//
//
if (OnOffbuttonState == HIGH // Orange light starts flashing
&& millis() - lastTimeOnOffButtonStateChanged > led_oStartWaitTime) {
if (millis() - LastTime_o > fadeInterval_o
&& brightness_o >= 0
&& brightness_o <= limit_o) {
analogWrite(LED_O, brightness_o);
brightness_o = brightness_o + fadeAmount_o;
LastTime_o = millis();
if (brightness_o == 0 || brightness_o == limit_o) {
fadeAmount_o = -fadeAmount_o;
}
}
}
if (OnOffbuttonState == LOW && brightness_o != 0) {
if (millis() - LastTime_o > fadeInterval_o
&& brightness_o > 0
&& brightness_o <= limit_o) {
analogWrite(LED_O, brightness_o);
brightness_o = brightness_o + fadeAmount_o;
LastTime_o = millis();
if (brightness_o == limit_o) {
fadeAmount_o = -fadeAmount_o;
}
}
}
if (OnOffbuttonState == LOW && brightness_o == 0) { // Orange light ends flashing
analogWrite(LED_O, brightness_o);
fadeAmount_o = 1;
}
//
//
//
if (CurrentOperation != 0) { // Blue light flashing
if (millis() - LastTimeB1Flash > flashInterval_b1) {
if (millis() - LastTime_b1 > flashInterval_b && NumberOfFlash_b1 < NumberOfFlashLimit_b) {
if (digitalRead(LED_B1) == HIGH) {
digitalWrite(LED_B1, LOW);
} else {
digitalWrite(LED_B1, HIGH);
}
LastTime_b1 = millis();
NumberOfFlash_b1 = NumberOfFlash_b1 + 1;
}
}
if (millis() - LastTimeB2Flash > flashInterval_b1 + led_b2Delay) {
if (millis() - LastTime_b2 > flashInterval_b && NumberOfFlash_b2 < NumberOfFlashLimit_b) {
if (digitalRead(LED_B2) == HIGH) {
digitalWrite(LED_B2, LOW);
} else {
digitalWrite(LED_B2, HIGH);
}
LastTime_b2 = millis();
NumberOfFlash_b2 = NumberOfFlash_b2 + 1;
}
}
if (NumberOfFlash_b1 == NumberOfFlashLimit_b && NumberOfFlash_b2 == NumberOfFlashLimit_b) {
digitalWrite(LED_B1, HIGH);
digitalWrite(LED_B2, HIGH);
LastTimeB1Flash = millis();
LastTimeB2Flash = millis() + led_b2Delay;
NumberOfFlash_b1 = 0;
NumberOfFlash_b2 = 0;
}
}
//
//
//
if (CurrentOperation == 1) { // Stage 1 - lights on and hatch opens
if (millis() - lastTimeOnOffButtonStateChanged > led_rStartWaitTime) {
if (millis() - LastTime_r > fadeInterval_r
&& brightness_r >= 0
&& brightness_r <= limit_r
&& led_rFlashCount < led_rFlashCountLimit) {
analogWrite(LED_R, brightness_r);
brightness_r = brightness_r + fadeAmount_r;
LastTime_r = millis();
if (brightness_r == 0 || brightness_r == limit_r) {
fadeAmount_r = -fadeAmount_r;
led_rFlashCount = led_rFlashCount + 1;
}
}
}
if (led_rFlashCount >= led_rFlashCountLimit) {
brightness_r = 0;
analogWrite(LED_R, brightness_r);
digitalWrite(LED_G, HIGH);
}
if (OnOffbuttonState == HIGH) {
if (millis() - lastTimeOnOffButtonStateChanged > gearstartWaitTime) {
if (gearPosition <= gearPositionLimit && millis() - lastTimegearmove > gearturnDelay) {
gearPosition = gearPosition + gearturnAmount;
myservo.write(gearPosition);
lastgearPosition = gearPosition;
lastTimegearmove = millis();
}
if (lastgearPosition > gearPositionLimit) {
lastgearPosition = gearPositionLimit;
}
}
if (millis() - lastTimeOnOffButtonStateChanged > led_wStartWaitTime) {
if (brightness_w == 0) {
analogWrite(LED_W, fadeAmount_w);
LastTime_w = millis();
brightness_w = brightness_w + fadeAmount_w;
}
if (brightness_w > 0 && brightness_w <= limit_w) {
if (millis() - LastTime_w > fadeInterval_w) {
analogWrite(LED_W, brightness_w);
brightness_w = brightness_w + fadeAmount_w;
LastTime_w = millis();
}
}
if (brightness_w > limit_w) {
brightness_w = limit_w;
}
}
}
}
//
//
//
if (CurrentOperation == 2) { // Stage 2 - red lights flash and hatch closes
if (millis() - lastMoveButtonStateChange > gearstartWaitTimea) {
if (gearPosition >= gearinitialposition && millis() - lastTimegearmove > gearturnDelay) {
gearPosition = gearPosition - gearturnAmount;
myservo.write(gearPosition);
lastgearPosition = gearPosition;
lastTimegearmove = millis();
}
if (lastgearPosition < gearinitialposition) {
lastgearPosition = gearinitialposition;
}
}
if (millis() - lastMoveButtonStateChange > led_rStartWaitTime) {
digitalWrite(LED_G, LOW);
if (millis() - LastTime_r > fadeInterval_r
&& brightness_r >= 0
&& brightness_r <= limit_r
&& led_rFlashCount < led_rFlashCountLimit) {
analogWrite(LED_R, brightness_r);
brightness_r = brightness_r + fadeAmount_r;
LastTime_r = millis();
if (brightness_r == 0 || brightness_r == limit_r) {
fadeAmount_r = -fadeAmount_r;
led_rFlashCount = led_rFlashCount + 1;
}
}
}
if (led_rFlashCount >= led_rFlashCountLimit) {
brightness_r = 0;
analogWrite(LED_R, brightness_r);
digitalWrite(LED_G, HIGH);
}
}
//
//
//
if (CurrentOperation == 3) { // Stage 3 - red lights flash and hatch opens again
if (millis() - lastMoveButtonStateChange > gearstartWaitTimea) {
if (gearPosition <= gearPositionLimit && millis() - lastTimegearmove > gearturnDelay) {
gearPosition = gearPosition + gearturnAmount;
myservo.write(gearPosition);
lastgearPosition = gearPosition;
lastTimegearmove = millis();
}
if (lastgearPosition > gearPositionLimit) {
lastgearPosition = gearPositionLimit;
}
}
if (millis() - lastMoveButtonStateChange > led_rStartWaitTime) {
digitalWrite(LED_G, LOW);
if (millis() - LastTime_r > fadeInterval_r
&& brightness_r >= 0
&& brightness_r <= limit_r
&& led_rFlashCount < led_rFlashCountLimit) {
analogWrite(LED_R, brightness_r);
brightness_r = brightness_r + fadeAmount_r;
LastTime_r = millis();
if (brightness_r == 0 || brightness_r == limit_r) {
fadeAmount_r = -fadeAmount_r;
led_rFlashCount = led_rFlashCount + 1;
}
}
}
if (led_rFlashCount >= led_rFlashCountLimit) {
brightness_r = 0;
analogWrite(LED_R, brightness_r);
digitalWrite(LED_G, HIGH);
}
}
//
//
//
if (CurrentOperation == 4) { // Stage 4 - lights out and hatch closes
if (millis() - lastTimeOnOffButtonStateChanged > led_rEndWaitTime) {
digitalWrite(LED_G, LOW);
if (millis() - LastTime_r > fadeInterval_r
&& brightness_r >= 0
&& brightness_r <= limit_r
&& led_rFlashCount < led_rFlashCountLimit) {
analogWrite(LED_R, brightness_r);
brightness_r = brightness_r + fadeAmount_r;
LastTime_r = millis();
if (brightness_r == 0 || brightness_r == limit_r) {
fadeAmount_r = -fadeAmount_r;
led_rFlashCount = led_rFlashCount + 1;
}
}
}
if (led_rFlashCount >= led_rFlashCountLimit) {
brightness_r = 0;
analogWrite(LED_R, brightness_r);
}
if (OnOffbuttonState == LOW) {
if (millis() - lastTimeOnOffButtonStateChanged > gearendWaitTime) {
if (gearPosition >= gearinitialposition && millis() - lastTimegearmove > gearturnDelay) {
gearPosition = gearPosition - gearturnAmount;
myservo.write(gearPosition);
lastgearPosition = gearPosition;
lastTimegearmove = millis();
}
if (lastgearPosition < gearinitialposition) {
lastgearPosition = gearinitialposition;
}
}
if (millis() - lastTimeOnOffButtonStateChanged > led_wEndWaitTime) {
if (brightness_w > 0) {
if (millis() - LastTime_w > fadeInterval_w) {
brightness_w = brightness_w - fadeAmount_w;
analogWrite(LED_W, brightness_w);
LastTime_w = millis();
}
}
}
}
}
}