Arduino NEMA stepper control with Joystick and Limit Switches

//Arduino NEMA stepper control with Joystick and Limit Switches

Control a Stepper Motor with an Arduino, Joystick, Easy Driver 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.


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);

Just copy the above Sketch code you want to use above in your Arduino IDE software to program your Arduino.

By | 2018-02-23T17:10:26+00:00 October 11th, 2015|Tutorials|


  1. Paul Cabrelli November 9, 2018 at 9:49 am - Reply

    Hi All, I am really new to this. But one of my pet projects to do is eventually a camera slider. This seems a fab tutorial, and I have followed the others related to it. But the wiring diagram for the Limit Switches does not seem to correct. There seems to be no power going to the limit switches. The Commons are together on one breadboard bus-bar, but the two power are on different breadboard bus-bars. So not to sure then where the limit switches are being powered from? Please help


    Paul Cabrelli

    • brainy-bits November 9, 2018 at 12:28 pm - Reply

      You are correct, when making the connection diagram I made a mistake. The power wires from the switches should be connected together and then connect to the 5V from the Arduino. I will update the diagram soon to reflect this. Thank you for pointing that out!

  2. Shaark October 1, 2018 at 11:55 am - Reply

    I need to rotate the guide with a sequence forward and reverse with one home limit switch
    Can you pls upload the code. No inputs like joysticks.

  3. Roger Stephenson June 15, 2018 at 9:22 pm - Reply

    To add a second axis can the sections of code just be duplicated with the changes to the additional code to reflect the second axis as needed? Say this code shown above represents the X axis and all the duplicate code represents the Y axis, could one use the same parameters with appropriate unique designators? I am building a telescope pointing device (not really a mount) and have the mechanical side all sorted. I also have a Nano and 2 Easy Divers. All I need is to write and test the code, which seems straightforward, unless I need to alter my thinking from the current paradigm in my old skull. Thanks!

  4. Art May 31, 2018 at 10:03 am - Reply

    Can the Easy driver be replaced with the DRV8825 driver without any coding changes necessary.

  5. Alfred April 27, 2018 at 4:25 pm - Reply

    Thank you for share this project with us!
    Very good explained and code included ….. perfect for an Beginner like me. Please let me ask: In your wiring diagram is an stepper control included by “A3967” – Is it possible to Change to stepper driver “A4988”? What for changes are for this needed?
    Thank you very much for your friendly Suppor

  6. Jim Sauer April 27, 2018 at 1:35 pm - Reply

    Pretty much exactly what I need for my project. Is there a way to substitute a DPDT switch for the joystick? I’m a newbie.

    • David Myhill May 8, 2018 at 9:55 am - Reply

      Thats what Im looking for maybe a 3 way switch or 3 individual switches to control speed (slow medium fast). I can do it using the centre button of the joystick but not sure how to write code for each button. I need to be able to reference the speed without being able to see the motor (using in a telescope motorised focuser.

      Any help greatly appreciated.

Leave A Comment