top of page

Safari browser sometimes has issues displaying images...

I.e: *you have to click on the images to see them...

For a better browsing experience on Brainy-Bits

Please use Chrome, Edge or Firefox browser.

  • Writer's pictureBrainy-Bits

Arduino NEMA stepper control with Joystick and Limit Switches


Since we made the tutorial on how to control a stepper motor using an analog joystick, we’ve gotten a lot of request on how to have the stepper move when moving the joystick and not move back to the center.

So in this tutorial we will do just that, but also add some limit switches and add the ability to adjust the speed.

The limit switches will be used to limit the travel of the stepper.

To control the speed we will use the switch included on the joystick module to set the speed.



EasyDriver Stepper Driver

Amazon usa

Amazon canada

Joystick Module

Amazon usa

Amazon canada

Stepper Motor NEMA 17

Amazon usa

Amazon canada

These are Amazon affiliate links...

They don't cost you anything and it helps me keep the lights on

if you buy something on Amazon. Thank you!



Here are the connections:

Pin 9 is connected to Steps pin on Easy Driver Pin 8 is connected to Direction pin Pin 10 is connected to MS1 pin Pin 11 is connected to MS2 pin Pin 12 is connected to SLEEP pin

Pin A0 connected to joystick X-axis Pin 4 is connected to the joystick Key or switch pin

Pint 2 and 3 are connected to the OUT pin of the Limit Switches

The Ground and Voltage pins of the Easy Driver are connected to a 1 Amp 12V power supply.

We are also using a small breadboard to split the Ground and Voltage connections of the various devices



The code we are using does not require any libraries, but you could use one to control the Stepper motor to give you more options if you want.

By checking the analog value of the X-axis of the joystick we know which direction to move the stepper motor. 512 is center, zero is full left and 1023 is full right.

So in our code we check if the analog value is higher than 712 to detect a right movement and a value lower than 312 will indicate a move to the left.

We than check the condition of the limit switches, and if there are not activated, we proceed to move the motor.

Using the Switch Case function, we change the delay to control the speed when we press down on the joystick switch.

As always, please check out the tutorial video to have more information.

#define step_pin 9  // Pin 9 connected to Steps pin on EasyDriver
#define dir_pin 8   // Pin 8 connected to Direction pin
#define MS1 10       // Pin 10 connected to MS1 pin
#define MS2 11       // Pin 11 connected to MS2 pin
#define SLEEP 12     // Pin 12 connected to SLEEP pin

#define X_pin A0    // Pin A0 connected to joystick x axis
#define Joy_switch 4  // Pin 4 connected to joystick switch

#define Limit01 2  // Pin 2 connected to Limit switch out
#define Limit02 3  // Pin 3 connected to Limit switch out

int step_speed = 10;  // Speed of Stepper motor (higher = slower)

void setup() {
   pinMode(MS1, OUTPUT);
   pinMode(MS2, OUTPUT);
   pinMode(dir_pin, OUTPUT);
   pinMode(step_pin, OUTPUT);
   pinMode(SLEEP, OUTPUT);
   pinMode(Limit01, INPUT);
   pinMode(Limit01, INPUT);
   pinMode(Joy_switch, INPUT_PULLUP);
   digitalWrite(SLEEP, HIGH);  // Wake up EasyDriver
   delay(5);  // Wait for EasyDriver wake up

/* Configure type of Steps on EasyDriver:
// MS1 MS2
// LOW LOW = Full Step //
// HIGH LOW = Half Step //
// LOW HIGH = A quarter of Step //
// HIGH HIGH = An eighth of Step //

   digitalWrite(MS1, LOW);      // Configures to Full Steps
   digitalWrite(MS2, LOW);    // Configures to Full Steps

void loop() {
  if (!digitalRead(Joy_switch)) {  //  If Joystick switch is clicked
    delay(500);  // delay for deboucing
    switch (step_speed) {  // check current value of step_speed and change it
      case 1:
        step_speed=10;  // slow speed
      case 3:
        step_speed=1;  // fast speed
      case 10:
        step_speed=3;  // medium speed
  if (analogRead(X_pin) > 712) {  //  If joystick is moved Left
    if (!digitalRead(Limit01)) {}  // check if limit switch is activated
      else {  //  if limit switch is not activated, move motor clockwise
        digitalWrite(dir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(step_pin, HIGH);
        digitalWrite(step_pin, LOW);
    if (analogRead(X_pin) < 312) {  // If joystick is moved right
    if (!digitalRead(Limit02)) {}  // check if limit switch is activated
      else {  //  if limit switch is not activated, move motor counter clockwise
        digitalWrite(dir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(step_pin, HIGH);
        digitalWrite(step_pin, LOW);





Copy the above Sketch code in your Arduino IDE software to program your Arduino.


Recent Posts

See All

All my content is and will always be Free.

If you feel that my Videos / Tutorials are helping, and you would like to contribute...

 You can toss some coins in the Tip Jar via PayPal.

Select amount then click the “Donate” button.

bottom of page