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


import RPi.GPIO as GPIO
import pygame
import sys
import time

# ============ GPIO ============
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

# Каждый мотор — пара пинов (IN1, IN2) одного канала L298N.
# ENA/ENB предполагаются замкнутыми джампером (полная скорость).
MOTOR_A = (20, 16)   # левый мотор
MOTOR_B = (26, 19)   # правый мотор

ALL_MOTORS = [MOTOR_A, MOTOR_B]

# Сброс и инициализация пинов
GPIO.cleanup()
for motor in ALL_MOTORS:
    for pin in motor:
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, GPIO.LOW)


# ============ Управление моторами ============
def set_motor(motor, direction):
    """direction: +1 вперёд, -1 назад, 0 стоп"""
    in1, in2 = motor
    if direction > 0:
        GPIO.output(in1, GPIO.HIGH)
        GPIO.output(in2, GPIO.LOW)
    elif direction < 0:
        GPIO.output(in1, GPIO.LOW)
        GPIO.output(in2, GPIO.HIGH)
    else:
        GPIO.output(in1, GPIO.LOW)
        GPIO.output(in2, GPIO.LOW)


def stop_all():
    for motor in ALL_MOTORS:
        set_motor(motor, 0)


def drive(left_dir, right_dir):
    """left_dir / right_dir: -1, 0, +1"""
    set_motor(MOTOR_A, left_dir)
    set_motor(MOTOR_B, right_dir)


def sign(value):
    if value > 0:
        return 1
    if value < 0:
        return -1
    return 0


# ============ Джойстик ============
pygame.init()
pygame.joystick.init()

if pygame.joystick.get_count() == 0:
    print("Джойстик не найден")
    GPIO.cleanup()
    pygame.quit()
    sys.exit(1)

joystick = pygame.joystick.Joystick(0)
joystick.init()
print(f"Джойстик: {joystick.get_name()}")

# ============ Настройки ============
DEADZONE = 0.2   # мёртвая зона стика
LOOP_HZ  = 50    # частота опроса, Гц
PERIOD   = 1.0 / LOOP_HZ

# ============ Основной цикл ============
try:
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                raise KeyboardInterrupt

        # Ось Y: вверх = -1, вниз = +1 -> инвертируем
        y = -joystick.get_axis(1)   # вперёд = +1, назад = -1
        x =  joystick.get_axis(0)   # вправо = +1, влево = -1

        # Мёртвая зона
        if abs(y) < DEADZONE: y = 0.0
        if abs(x) < DEADZONE: x = 0.0

        # Дифференциальный привод (танк)
        left  = max(-1.0, min(1.0, y + x))
        right = max(-1.0, min(1.0, y - x))

        drive(sign(left), sign(right))

        time.sleep(PERIOD)

except KeyboardInterrupt:
    pass
finally:
    stop_all()
    GPIO.cleanup()
    pygame.quit()
    sys.exit(0)