import RPi.GPIO as GPIO
import time
# --- Настройка GPIO ---
GPIO.setmode(GPIO.BCM) # Используем нумерацию BCM
GPIO.setwarnings(False)
# Пины драйвера L298N
# Мотор A (левый)
IN1 = 21
IN2 = 20
ENA = 18 # ШИМ
# Мотор B (правый)
IN3 = 16
IN4 = 12
ENB = 13 # ШИМ
# Настройка пинов как выходов
GPIO.setup([IN1, IN2, ENA, IN3, IN4, ENB], GPIO.OUT)
# Инициализация ШИМ для регулировки скорости
pwm_a = GPIO.PWM(ENA, 1000) # Частота 1 кГц
pwm_b = GPIO.PWM(ENB, 1000)
pwm_a.start(0)
pwm_b.start(0)
def set_motor(motor, speed):
"""
Управление двигателем.
motor: 'A' (левый) или 'B' (правый)
speed: от -100 (полный назад) до 100 (полный вперёд)
"""
speed = max(-100, min(100, speed)) # Ограничение диапазона
if motor == 'A':
pwm = pwm_a
in1, in2 = IN1, IN2
else:
pwm = pwm_b
in1, in2 = IN3, IN4
# Установка направления
if speed > 0:
GPIO.output(in1, GPIO.HIGH)
GPIO.output(in2, GPIO.LOW)
elif speed < 0:
GPIO.output(in1, GPIO.LOW)
GPIO.output(in2, GPIO.HIGH)
else:
GPIO.output(in1, GPIO.LOW)
GPIO.output(in2, GPIO.LOW)
# Установка скорости (ШИМ)
pwm.ChangeDutyCycle(abs(speed))
def stop():
"""Полная остановка обоих моторов."""
set_motor('A', 0)
set_motor('B', 0)
def forward(speed=60):
"""Движение вперёд."""
set_motor('A', speed)
set_motor('B', speed)
def backward(speed=60):
"""Движение назад."""
set_motor('A', -speed)
set_motor('B', -speed)
def turn_left(speed=60):
"""Поворот налево (левый мотор назад, правый вперёд)."""
set_motor('A', -speed)
set_motor('B', speed)
def turn_right(speed=60):
"""Поворот направо (левый мотор вперёд, правый назад)."""
set_motor('A', speed)
set_motor('B', -speed)
# --- Тестовая программа ---
if __name__ == "__main__":
try:
print("Тест моторов. Нажмите Ctrl+C для выхода.")
print("Вперёд")
forward(60)
time.sleep(2)
print("Стоп")
stop()
time.sleep(1)
print("Назад")
backward(60)
time.sleep(2)
print("Стоп")
stop()
time.sleep(1)
print("Поворот налево")
turn_left(60)
time.sleep(1.5)
print("Стоп")
stop()
time.sleep(1)
print("Поворот направо")
turn_right(60)
time.sleep(1.5)
print("Стоп")
stop()
time.sleep(1)
print("Тест завершён.")
except KeyboardInterrupt:
print("\nОстановка по Ctrl+C.")
finally:
stop()
pwm_a.stop()
pwm_b.stop()
GPIO.cleanup()
print("GPIO очищены.")