Skip to content

Commit 26277f3

Browse files
committed
drivers/a4988: Add A4988 stepper motor driver for esp32.
Signed-off-by: Anshuflame04 <[email protected]>
1 parent 68e3e07 commit 26277f3

File tree

3 files changed

+104
-0
lines changed

3 files changed

+104
-0
lines changed

micropython/drivers/a4988/a4988.py

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import time
2+
3+
# Constants
4+
STEPS_PER_REV = 200 # Number of steps per motor revolution
5+
MIN_DELAY = 0.001 # Minimum delay between steps (controls maximum speed)
6+
7+
# Function to enable or disable the motor driver (active low)
8+
def enable_motor(EN_PIN, enabled=True):
9+
"""Enable or disable the motor driver."""
10+
EN_PIN.value(0 if enabled else 1)
11+
12+
13+
# Function to move the motor a specific number of steps
14+
def step_motor(STEP_PIN, DIR_PIN, steps=STEPS_PER_REV, direction=1, delay=0.005):
15+
"""Move the motor a specified number of steps in the given direction."""
16+
DIR_PIN.value(direction) # Set direction (1 = forward, 0 = backward)
17+
for _ in range(steps):
18+
STEP_PIN.value(1)
19+
time.sleep(delay)
20+
STEP_PIN.value(0)
21+
time.sleep(delay)
22+
23+
24+
# Function to calculate current speed in steps per second and RPM
25+
def calculate_speed(current_delay):
26+
"""Calculate the current speed in steps per second and RPM."""
27+
if current_delay <= 0:
28+
return 0, 0
29+
steps_per_second = 1 / (2 * current_delay) # Delay is for each half-step
30+
rpm = (steps_per_second / STEPS_PER_REV) * 60 # Convert to RPM
31+
return steps_per_second, rpm
32+
33+
34+
# Function to increase motor speed by reducing delay
35+
def inc_speed(current_delay):
36+
"""Decrease delay to increase speed, respecting minimum delay limit."""
37+
new_delay = max(current_delay - 0.001, MIN_DELAY)
38+
return new_delay
39+
40+
41+
# Function to decrease motor speed by increasing delay
42+
def dec_speed(current_delay):
43+
"""Increase delay to decrease speed."""
44+
new_delay = current_delay + 0.001
45+
return new_delay
46+
47+
48+
# Function to move motor forward
49+
def forward_motion(STEP_PIN, DIR_PIN, steps=STEPS_PER_REV, delay=0.005):
50+
"""Move motor forward for a given number of steps and delay."""
51+
step_motor(STEP_PIN, DIR_PIN, steps, direction=1, delay=delay)
52+
53+
54+
# Function to move motor backward
55+
def backward_motion(STEP_PIN, DIR_PIN, steps=STEPS_PER_REV, delay=0.005):
56+
"""Move motor backward for a given number of steps and delay."""
57+
step_motor(STEP_PIN, DIR_PIN, steps, direction=0, delay=delay)
+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from machine import Pin
2+
import time
3+
import a4988 # Import functions from the A4988 motor driver module
4+
5+
# Define motor control pins
6+
DIR_PIN = Pin(12, Pin.OUT) # Direction pin
7+
STEP_PIN = Pin(14, Pin.OUT) # Step pin (controls motor steps)
8+
EN_PIN = Pin(21, Pin.OUT) # Enable pin for motor driver
9+
10+
# Define pins for switches
11+
switch_forward = Pin(26, Pin.IN) # Forward motion switch
12+
switch_backward = Pin(27, Pin.IN) # Backward motion switch
13+
speed_increase = Pin(33, Pin.IN) # Speed increase switch
14+
speed_decrease = Pin(32, Pin.IN) # Speed decrease switch
15+
16+
# Initialize motor driver
17+
a4988.enable_motor(EN_PIN, enabled=True)
18+
19+
# Set initial motor speed and debounce delay
20+
current_delay = 0.005 # Initial delay between steps for motor speed
21+
prev_speed_inc_state = 0
22+
prev_speed_dec_state = 0
23+
debounce_delay = 0.1 # Delay to avoid switch bouncing effects
24+
25+
# Main control loop
26+
while True:
27+
# Motor directional control
28+
if switch_forward.value() == 1:
29+
a4988.forward_motion(STEP_PIN, DIR_PIN, a4988.Steps, delay=current_delay)
30+
elif switch_backward.value() == 1:
31+
a4988.backward_motion(STEP_PIN, DIR_PIN, a4988.Steps, delay=current_delay)
32+
33+
# Speed increase control
34+
current_inc_state = speed_increase.value()
35+
if current_inc_state == 1 and prev_speed_inc_state == 0:
36+
current_delay = a4988.inc_speed(current_delay)
37+
prev_speed_inc_state = current_inc_state # Update state for next loop
38+
39+
# Speed decrease control
40+
current_dec_state = speed_decrease.value()
41+
if current_dec_state == 1 and prev_speed_dec_state == 0:
42+
current_delay = a4988.dec_speed(current_delay)
43+
prev_speed_dec_state = current_dec_state # Update state for next loop
44+
45+
# Small delay to debounce switch inputs and stabilize loop
46+
time.sleep(debounce_delay)

micropython/drivers/a4988/manifest.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
metadata(description="MicroPython driver for A4988 stepper motor controller", version="1.0.0")

0 commit comments

Comments
 (0)