Introduction: How to Wirelessly Control a NEMA 17 Stepper Motor With an ESP32 and an A4988 Driver Board
In this tutorial, you’ll learn how to control a NEMA 17 stepper motor with an ESP32 and an A4988 driver board.
Supplies
What You Will Need With Link
For the power supply i use this adafruit HUSB238 USB Type C Power Delivery Dummy Breakout. But you can use any 12v power supply but it has to be less than 1.2 amps or it will break the A4988 driver board
Step 1: Installing Libraries
For this you will need 1 libraries the AccelStepper to download this go to Tools>Manage Libraries or you can press Ctrl+Shift+I once you open library manager type in AccelStepper and download the one by Mike McCauley
Step 2: Wiring Diagram
You can use a capacitor but it is not required
Step 3: Code
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <AccelStepper.h>
const char *ssid = "SSID-HERE";
const char *password = "PASSWORD-HERE";
AsyncWebServer server(80);
// Define stepper motor connections and steps per revolution
#define motorStep 14
#define motorDir 12
#define motorEnable 4
AccelStepper stepper(1, motorStep, motorDir);
void setup() {
// Set up serial communication
Serial.begin(115200);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: http://");
Serial.println(WiFi.localIP());
// Initialize stepper motor
stepper.setMaxSpeed(1000.0);
stepper.setAcceleration(500.0);
// Define web server routes
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", "<html><body><h1>Stepper Motor Control</h1><p><a href=\"/forward500\">Forward 500</a></p><p><a href=\"/backward500\">Backward 500</a></p><p><a href=\"/backward2000\">Backward 2000</a></p><p><a href=\"/forward2000\">Forward 2000</a></p></body></html>");
});
server.on("/forward500", HTTP_GET, [](AsyncWebServerRequest *request){
stepper.move(500);
stepper.runToPosition();
request->send(200, "text/html", "<html><body><h1>Stepper Motor Control</h1><p><a href=\"/forward500\">Forward 500</a></p><p><a href=\"/backward500\">Backward 500</a></p><p><a href=\"/backward2000\">Backward 2000</a></p><p><a href=\"/forward2000\">Forward 2000</a></p></body></html>");
});
server.on("/backward500", HTTP_GET, [](AsyncWebServerRequest *request){
stepper.move(-500);
stepper.runToPosition();
request->send(200, "text/html", "<html><body><h1>Stepper Motor Control</h1><p><a href=\"/forward500\">Forward 500</a></p><p><a href=\"/backward500\">Backward 500</a></p><p><a href=\"/backward2000\">Backward 2000</a></p><p><a href=\"/forward2000\">Forward 2000</a></p></body></html>");
});
server.on("/backward2000", HTTP_GET, [](AsyncWebServerRequest *request){
stepper.move(-2000);
stepper.runToPosition();
request->send(200, "text/html", "<html><body><h1>Stepper Motor Control</h1><p><a href=\"/forward500\">Forward 500</a></p><p><a href=\"/backward500\">Backward 500</a></p><p><a href=\"/backward2000\">Backward 2000</a></p><p><a href=\"/forward2000\">Forward 2000</a></p></body></html>");
});
server.on("/forward2000", HTTP_GET, [](AsyncWebServerRequest *request){
stepper.move(-2000);
stepper.runToPosition();
request->send(200, "text/html", "<html><body><h1>Stepper Motor Control</h1><p><a href=\"/forward500\">Forward 500</a></p><p><a href=\"/backward500\">Backward 500</a></p><p><a href=\"/backward2000\">Backward 2000</a></p><p><a href=\"/forward2000\">Forward 2000</a></p></body></html>");
});
// Start server
server.begin();
}
void loop() {
// Handle any necessary background tasks
stepper.run();
}
Step 4: How the Code Works
Network Credentials
Insert your network credentials on the following variables.
const char *ssid = "SSID-HERE";
const char *password = "PASSWORD-HERE";
Motor Speed
stepper.setMaxSpeed(1000.0);
stepper.setAcceleration(500.0);
You can set the max speed and acceleration by changing the number in this line
Web Server
By defualt i added 4 modes but you can add as many ad you want
server.on("/forward2000", HTTP_GET, [](AsyncWebServerRequest *request){
stepper.move(-2000);
stepper.runToPosition();
request->send(200, "text/html", "<html><body><h1>Stepper Motor Control</h1><p><a href=\"/forward500\">Forward 500</a></p><p><a href=\"/backward500\">Backward 500</a></p><p><a href=\"/backward2000\">Backward 2000</a></p><p><a href=\"/forward2000\">Forward 2000</a></p></body></html>");
});
to change how far the motor moves change the stepper.move command
stepper.move(-2000);
Step 5: Uploading the Code
After inserting your network credentials upload the code to your board.
If you have an ESP32 you should select ESP32 in the Tools> Board menu.
After that, select the COM port in Tools > Port.
Finally, upload the code.
After successfully uploading the code to the board, open the Serial Monitor at a baud rate of 115200. Press the RST button so that it restarts the board and it starts running the code.
You will see a link go to that link in your browser and you will be able to control the NEMA 17 with an ESP32.
Step 6: Help
If You Need Any Help Or Have Any Questions Post A Comment Below Or Join My Discord Server https://discord.gg/Cq7tSEfaC2