Загрузка данных


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 очищены.")