import machine
import utime
# Define pin numbers
trig_pin = 2 # Trig pin of ultrasonic sensor
echo_pin = 3 # Echo pin of ultrasonic sensor
button_pin = 4 # Pin for the push button
step_pin = 5 # Step pin for the stepper motor driver
dir_pin = 6 # Direction pin for the stepper motor driver
enable_pin = 7 # Enable pin for the stepper motor driver
# Setup ultrasonic sensor
trig = machine.Pin(trig_pin, machine.Pin.OUT)
echo = machine.Pin(echo_pin, machine.Pin.IN)
# Setup push button
button = machine.Pin(button_pin, machine.Pin.IN, machine.Pin.PULL_DOWN)
button_pressed = False
last_button_state = 0
# Setup stepper motor driver
step = machine.Pin(step_pin, machine.Pin.OUT)
dir = machine.Pin(dir_pin, machine.Pin.OUT)
enable = machine.Pin(enable_pin, machine.Pin.OUT)
# Function to measure distance using ultrasonic sensor
def measure_distance():
trig.value(1)
utime.sleep_us(10)
trig.value(0)
while echo.value() == 0:
pulse_start = utime.ticks_us()
while echo.value() == 1:
pulse_end = utime.ticks_us()
pulse_duration = pulse_end - pulse_start
distance = (pulse_duration * 0.0343) / 2 # Speed of sound is approximately 343 meters/second
return distance
# Function to control stepper motor steps and direction
def control_stepper(distance):
# Map distance to the number of steps
steps = int((distance / max_distance) * max_steps)
# Set stepper motor direction based on button press
dir.value(0 if not button_pressed else 1)
# Enable the stepper motor driver
enable.value(0)
# Generate steps
for _ in range(steps):
step.value(1)
utime.sleep_us(500) # Adjust delay as needed
step.value(0)
utime.sleep_us(500) # Adjust delay as needed
# Disable the stepper motor driver
enable.value(1)
# Main loop
max_distance = 50 # Adjust this value based on your specific requirements
max_steps = 200 # Adjust this value based on your stepper motor specifications
direction_change_threshold = 0.5 # Time delay between button presses to avoid multiple changes
last_button_press_time = utime.ticks_ms()
while True:
# Measure distance
distance = measure_distance()
# Check button press
current_button_state = button.value()
if current_button_state == 1 and last_button_state == 0:
current_time = utime.ticks_ms()
if utime.ticks_diff(current_time, last_button_press_time) > direction_change_threshold:
button_pressed = not button_pressed
last_button_press_time = current_time
# Update last button state
last_button_state = current_button_state
# Control stepper motor based on distance and button press
control_stepper(distance)
# Print information
print("Distance: {:.2f} cm".format(distance))
print("Stepper Motor Steps: {}".format(int((distance / max_distance) * max_steps)))
print("Direction: {}".format("Forward" if not button_pressed else "Reverse"))
# Add a small delay to avoid excessive printing
utime.sleep(0.1)