2022-09-11 20:26:45 +01:00

49 lines
1.6 KiB
Python

import asyncio
import robot
class Settings:
speed = 0.7
time_interval = 0.2
async def motor_speed_loop():
left_last, right_last = robot.left_encoder.read(), robot.right_encoder.read()
while True:
await asyncio.sleep(Settings.time_interval)
left_new, right_new = robot.left_encoder.read(), robot.right_encoder.read()
left_speed = robot.ticks_to_m * (left_new - left_last) / Settings.time_interval
left_last = left_new
right_speed = robot.ticks_to_m * (right_new - right_last) / Settings.time_interval
right_last = right_new
robot.uart.write(f"{left_speed:.3f},{right_speed:.3f},0\n".encode())
async def stop_motors_after(seconds):
await asyncio.sleep(seconds)
robot.stop()
async def command_handler():
while True:
if robot.uart.in_waiting:
command = robot.uart.readline().decode().strip()
if command.startswith("M"):
Settings.speed = float(command[1:])
elif command.startswith("T"):
Settings.time_interval = float(command[1:])
elif command == "O":
robot.stop()
elif command.startswith("O"):
await asyncio.sleep(5)
asyncio.create_task(stop_motors_after(float(command[1:])))
robot.set_left(Settings.speed)
robot.set_right(Settings.speed)
elif command.startswith("?"):
robot.uart.write(f"M{Settings.speed:.1f}\n".encode())
robot.uart.write(f"T{Settings.time_interval:.1f}\n".encode())
await asyncio.sleep(3)
await asyncio.sleep(0)
try:
asyncio.create_task(motor_speed_loop())
asyncio.run(command_handler())
finally:
robot.stop()