You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.4 KiB
115 lines
3.4 KiB
import RPi.GPIO as GPIO |
|
import time |
|
import keyboard |
|
|
|
# Настройка пинов |
|
GPIO.setmode(GPIO.BCM) |
|
|
|
# Пины для управления моторами |
|
IN1 = 17 |
|
IN2 = 27 |
|
IN3 = 22 |
|
IN4 = 23 |
|
|
|
# Пины для управления скоростью (PWM) |
|
ENA = 18 |
|
ENB = 19 |
|
|
|
# Настройка пинов как выходов |
|
GPIO.setup(IN1, GPIO.OUT) |
|
GPIO.setup(IN2, GPIO.OUT) |
|
GPIO.setup(IN3, GPIO.OUT) |
|
GPIO.setup(IN4, GPIO.OUT) |
|
GPIO.setup(ENA, GPIO.OUT) |
|
GPIO.setup(ENB, GPIO.OUT) |
|
|
|
# Создание ШИМ (PWM) на пинах ENA и ENB с частотой 1000 Гц |
|
pwm_a = GPIO.PWM(ENA, 1000) |
|
pwm_b = GPIO.PWM(ENB, 1000) |
|
|
|
# Старт ШИМ с нулевой скоростью (0% скважности) |
|
pwm_a.start(0) |
|
pwm_b.start(0) |
|
|
|
# Функции управления |
|
def move_forward(speed): |
|
GPIO.output(IN1, GPIO.HIGH) |
|
GPIO.output(IN2, GPIO.LOW) |
|
GPIO.output(IN3, GPIO.HIGH) |
|
GPIO.output(IN4, GPIO.LOW) |
|
pwm_a.ChangeDutyCycle(speed) |
|
pwm_b.ChangeDutyCycle(speed) |
|
print(f"Moving forward at speed {speed}") |
|
|
|
def move_backward(speed): |
|
GPIO.output(IN1, GPIO.LOW) |
|
GPIO.output(IN2, GPIO.HIGH) |
|
GPIO.output(IN3, GPIO.LOW) |
|
GPIO.output(IN4, GPIO.HIGH) |
|
pwm_a.ChangeDutyCycle(speed) |
|
pwm_b.ChangeDutyCycle(speed) |
|
print(f"Moving backward at speed {speed}") |
|
|
|
def move_left(speed): |
|
GPIO.output(IN1, GPIO.LOW) |
|
GPIO.output(IN2, GPIO.HIGH) |
|
GPIO.output(IN3, GPIO.HIGH) |
|
GPIO.output(IN4, GPIO.LOW) |
|
pwm_a.ChangeDutyCycle(speed) |
|
pwm_b.ChangeDutyCycle(speed) |
|
print(f"Turning left at speed {speed}") |
|
|
|
def move_right(speed): |
|
GPIO.output(IN1, GPIO.HIGH) |
|
GPIO.output(IN2, GPIO.LOW) |
|
GPIO.output(IN3, GPIO.LOW) |
|
GPIO.output(IN4, GPIO.HIGH) |
|
pwm_a.ChangeDutyCycle(speed) |
|
pwm_b.ChangeDutyCycle(speed) |
|
print(f"Turning right at speed {speed}") |
|
|
|
def stop(): |
|
GPIO.output(IN1, GPIO.LOW) |
|
GPIO.output(IN2, GPIO.LOW) |
|
GPIO.output(IN3, GPIO.LOW) |
|
GPIO.output(IN4, GPIO.LOW) |
|
pwm_a.ChangeDutyCycle(0) |
|
pwm_b.ChangeDutyCycle(0) |
|
print("Stopped") |
|
|
|
try: |
|
speed = 50 # Начальная скорость (50% ШИМ) |
|
print("Use W/A/S/D to move and adjust speed, release key to stop") |
|
|
|
while True: |
|
# Проверка нажатия клавиш для движения |
|
if keyboard.is_pressed('w'): |
|
move_forward(speed) |
|
elif keyboard.is_pressed('s'): |
|
move_backward(speed) |
|
elif keyboard.is_pressed('a'): |
|
move_left(speed) |
|
elif keyboard.is_pressed('d'): |
|
move_right(speed) |
|
else: |
|
# Если ни одна из клавиш не нажата, остановить моторы |
|
stop() |
|
|
|
# Регулировка скорости |
|
if keyboard.is_pressed('q'): # Уменьшение скорости |
|
speed = max(0, speed - 10) |
|
print(f"Speed decreased to {speed}%") |
|
time.sleep(0.1) |
|
elif keyboard.is_pressed('e'): # Увеличение скорости |
|
speed = min(100, speed + 10) |
|
print(f"Speed increased to {speed}%") |
|
time.sleep(0.1) |
|
|
|
time.sleep(0.05) # Небольшая задержка для плавного опроса клавиш |
|
|
|
except KeyboardInterrupt: |
|
stop() # Остановка моторов при прерывании программы |
|
finally: |
|
pwm_a.stop() |
|
pwm_b.stop() |
|
GPIO.cleanup() # Очистка конфигурации GPIO
|
|
|