Untitled

 avatar
unknown
python
4 months ago
5.4 kB
2
Indexable
from flask import Flask, render_template, request
import RPi.GPIO as GPIO
import time
import threading

app = Flask(__name__, static_folder="static", template_folder="templates")

# Setup GPIO pins
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# Motor Pins Setup
GPIO.setup(12, GPIO.OUT)  # Left Motor Forward
GPIO.setup(32, GPIO.OUT)  # Left Motor Backward
GPIO.setup(33, GPIO.OUT)  # Right Motor Forward
GPIO.setup(35, GPIO.OUT)  # Right Motor Backward

# Limit switch pins
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # Left limit switch
GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # Right limit switch

# Set up PWM for motor speed control
left_pwm_fwd = GPIO.PWM(12, 500)
left_pwm_bwd = GPIO.PWM(32, 500)
right_pwm_fwd = GPIO.PWM(33, 500)
right_pwm_bwd = GPIO.PWM(35, 500)

left_pwm_fwd.start(0)
left_pwm_bwd.start(0)
right_pwm_fwd.start(0)
right_pwm_bwd.start(0)

# Function to scale the speed from 1-1000 to 0-100 (PWM duty cycle)
def scale_speed(speed):
    if speed < 0:
        return 0
    elif speed > 100:
        return 100
    return speed

# Function to control left motor
def control_left_motor(speed, direction):
    scaled_speed = scale_speed(speed)
    if direction == 'forward':
        left_pwm_bwd.ChangeDutyCycle(0)
        left_pwm_fwd.ChangeDutyCycle(scaled_speed)
    elif direction == 'backward':
        left_pwm_fwd.ChangeDutyCycle(0)
        left_pwm_bwd.ChangeDutyCycle(scaled_speed)

# Function to control right motor
def control_right_motor(speed, direction):
    scaled_speed = scale_speed(speed)
    if direction == 'forward':
        right_pwm_bwd.ChangeDutyCycle(0)
        right_pwm_fwd.ChangeDutyCycle(scaled_speed)
    elif direction == 'backward':
        right_pwm_fwd.ChangeDutyCycle(0)
        right_pwm_bwd.ChangeDutyCycle(scaled_speed)

# Function to read the limit switches
def read_limit_switches():
    left_pressed = GPIO.input(11) == GPIO.LOW  # Left limit switch pressed
    right_pressed = GPIO.input(13) == GPIO.LOW  # Right limit switch pressed
    return left_pressed, right_pressed

# Update motor speeds based on limit switches
def update_motor_speeds():
    global starting_speed
    left_pressed, right_pressed = read_limit_switches()

    # Print button states for debugging
    print(f"Left Limit Switch Pressed: {left_pressed}, Right Limit Switch Pressed: {right_pressed}")

    if left_pressed and right_pressed:
        # If both limit switches are pressed, move both motors at the normal speed
        control_left_motor(starting_speed, 'forward')
        control_right_motor(starting_speed, 'forward')
    elif left_pressed or right_pressed:
        # If one limit switch is pressed, speed up both motors by 50 (but don't exceed 100)
        control_left_motor(min(starting_speed - 50, 100), 'forward')
        control_right_motor(min(starting_speed - 50, 100), 'forward')
    else:
        # Neither limit switch is pressed, move both motors at the normal speed
        control_left_motor(starting_speed, 'forward')
        control_right_motor(starting_speed, 'forward')

# Variables for starting speed and delay
starting_speed = 100  # Default speed in mm/s
delay = 5            # Default delay in seconds

@app.route('/')
def index():
    # Render the page with the current values of speed and delay
    return render_template('index.html', speed=starting_speed, delay=delay)

@app.route('/set-speed', methods=['POST'])
def set_speed():
    global starting_speed
    # Get the new speed value from the form and update it
    new_speed = request.form.get('speed', type=int)
    if 1 <= new_speed <= 1000:
        starting_speed = new_speed
    return render_template('index.html', speed=starting_speed, delay=delay)

@app.route('/set-delay', methods=['POST'])
def set_delay():
    global delay
    # Get the new delay value from the form and update it
    new_delay = request.form.get('delay', type=int)
    if 1 <= new_delay <= 10:
        delay = new_delay
    return render_template('index.html', speed=starting_speed, delay=delay)

@app.route('/start')
def start_robot():
    # Simulate a delay before starting the robot
    time.sleep(delay)
    
    # Start the robot with the set starting speed
    left_speed = starting_speed
    right_speed = starting_speed
    control_left_motor(left_speed, 'forward')
    control_right_motor(right_speed, 'forward')

    # Start a background thread to check limit switches and adjust speeds
    threading.Thread(target=monitor_limit_switches).start()

    return f"Robot started with speed {starting_speed} mm/s and delay {delay} seconds!"

@app.route('/stop')
def stop_robot():
    control_left_motor(0, 'forward')
    control_right_motor(0, 'forward')
    return "Robot stopped!"

@app.route('/shutdown')
def shutdown():
    left_pwm_fwd.stop()
    left_pwm_bwd.stop()
    right_pwm_fwd.stop()
    right_pwm_bwd.stop()
    GPIO.cleanup()
    return "System shutdown!"

# Function to continuously monitor limit switches in the background
def monitor_limit_switches():
    while True:
        update_motor_speeds()  # Update motor speeds based on limit switches
        time.sleep(0.2)  # Delay for 0.2 seconds

if __name__ == '__main__':
    try:
        app.run(host='0.0.0.0', port=5001)
    except KeyboardInterrupt:
        GPIO.cleanup()



Editor is loading...
Leave a Comment