diff --git a/upravlenie.py b/upravlenie.py new file mode 100644 index 0000000..10f9014 --- /dev/null +++ b/upravlenie.py @@ -0,0 +1,115 @@ +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