How to simultaneously use a servo and a step motor on one Arduino Board.

Hi,

I'm using an Elegoo Uno board (functionally the exact same as an Arduino board) to control a step motor and a servomotor at the same time. I'm trying to get the step motor to run continuously, spinning a small turntable, and the servo arm is controlled by a potentiometer to be able to rotate at will.

How can I make these programs run at the same time? As in have the turntable not stop spinning, yet still be able to control the servo with a potentiometer? Is this possible?

Btw I'm not an experienced coder, I didn't write either of these codes.

This is Knob from the basic Arduino examples
/*
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott http://people.interaction-ivrea.it/m.rinott

modified on 8 Nov 2013
by Scott Fitzgerald

*/

#include <Servo.h>

Servo myservo; // create servo object to control a servo

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin

void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}

Nikodem Bartnik wrote this step motor code in his video
28BYJ-48 stepper motor and ULN2003 Arduino (Quick tutorial for beginners)
//Written By Nikodem Bartnik - nikodembartnik.pl
#define STEPPER_PIN_1 9
#define STEPPER_PIN_2 10
#define STEPPER_PIN_3 11
#define STEPPER_PIN_4 12
int step_number = 0;
void setup() {
pinMode(STEPPER_PIN_1, OUTPUT);
pinMode(STEPPER_PIN_2, OUTPUT);
pinMode(STEPPER_PIN_3, OUTPUT);
pinMode(STEPPER_PIN_4, OUTPUT);

}

void loop() {

OneStep(false);
delay(2);

}

void OneStep(bool dir){
if(dir){
switch(step_number){
case 0:
digitalWrite(STEPPER_PIN_1, HIGH);
digitalWrite(STEPPER_PIN_2, LOW);
digitalWrite(STEPPER_PIN_3, LOW);
digitalWrite(STEPPER_PIN_4, LOW);
break;
case 1:
digitalWrite(STEPPER_PIN_1, LOW);
digitalWrite(STEPPER_PIN_2, HIGH);
digitalWrite(STEPPER_PIN_3, LOW);
digitalWrite(STEPPER_PIN_4, LOW);
break;
case 2:
digitalWrite(STEPPER_PIN_1, LOW);
digitalWrite(STEPPER_PIN_2, LOW);
digitalWrite(STEPPER_PIN_3, HIGH);
digitalWrite(STEPPER_PIN_4, LOW);
break;
case 3:
digitalWrite(STEPPER_PIN_1, LOW);
digitalWrite(STEPPER_PIN_2, LOW);
digitalWrite(STEPPER_PIN_3, LOW);
digitalWrite(STEPPER_PIN_4, HIGH);
break;
}
}else{
switch(step_number){
case 0:
digitalWrite(STEPPER_PIN_1, LOW);
digitalWrite(STEPPER_PIN_2, LOW);
digitalWrite(STEPPER_PIN_3, LOW);
digitalWrite(STEPPER_PIN_4, HIGH);
break;
case 1:
digitalWrite(STEPPER_PIN_1, LOW);
digitalWrite(STEPPER_PIN_2, LOW);
digitalWrite(STEPPER_PIN_3, HIGH);
digitalWrite(STEPPER_PIN_4, LOW);
break;
case 2:
digitalWrite(STEPPER_PIN_1, LOW);
digitalWrite(STEPPER_PIN_2, HIGH);
digitalWrite(STEPPER_PIN_3, LOW);
digitalWrite(STEPPER_PIN_4, LOW);
break;
case 3:
digitalWrite(STEPPER_PIN_1, HIGH);
digitalWrite(STEPPER_PIN_2, LOW);
digitalWrite(STEPPER_PIN_3, LOW);
digitalWrite(STEPPER_PIN_4, LOW);

}
}
step_number++;
if(step_number > 3){
step_number = 0;
}
}

Thank you!

Please use code tags when posting code.

Before attempting to combine codes, get each program running to your satisfaction independently, and make sure that you understand what each line does. You will need that understanding in order to make a combined program.

You will not be able to use delay() if you want several things to be happening "at once". Study this Blink Without Delay tutorial to learn how to avoid it.

Awesome, thank you!!

Change this part:

  OneStep(false);
  delay(2);

to this:

  static unsigned long lastStepTime = 0;
  unsigned long currentTime = millis();
  // Step every 2 milliseconds
  if (currentTime - lastStepTime >= 2)
  {
    lastStepTime = currentTime;
    OneStep(false);
  }

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.