Untitled

 avatar
unknown
python
5 months ago
4.8 kB
3
Indexable
import pygame
import serial
import os
import time
from datetime import datetime

# Konfiguracja portu szeregowego
SERIAL_PORT = '/dev/ttyACM0'  # Sprawdź poprawny port (np. /dev/ttyUSB0)
BAUD_RATE = 115200  # Prędkość transmisji szeregowej
arduino = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
time.sleep(2)  # Czekaj na inicjalizację Arduino

# Inicjalizacja Pygame
pygame.init()
screen = pygame.display.set_mode([240, 160])

# Konfiguracja kamery
from picamera import PiCamera
camera = PiCamera()
camera.resolution = (1280, 720)
camera.framerate = 25

record = 0  # Zmienna do śledzenia stanu nagrywania

# Prędkości i dynamika
MAX_SPEED = 255
ACCELERATION_STEP = 10  # Krok przyspieszania
BRAKING_STEP = 30       # Krok hamowania
current_speed_left = 0
current_speed_right = 0
target_speed_left = 0
target_speed_right = 0

def send_motor_commands(speed_left, speed_right):
    """
    Wysyła prędkości do Arduino przez port szeregowy.
    """
    try:
        message = f"{int(speed_left)},{int(speed_right)}\n"
        arduino.write(message.encode())
        print(f"Wysłano dane: {message.strip()}")
    except Exception as e:
        print(f"Błąd komunikacji z Arduino: {e}")

def adjust_speed():
    """
    Płynnie reguluje prędkość w kierunku docelowym.
    """
    global current_speed_left, current_speed_right
    # Silnik lewy
    if current_speed_left < target_speed_left:
        current_speed_left += ACCELERATION_STEP
        if current_speed_left > target_speed_left:
            current_speed_left = target_speed_left
    elif current_speed_left > target_speed_left:
        current_speed_left -= BRAKING_STEP
        if current_speed_left < target_speed_left:
            current_speed_left = target_speed_left

    # Silnik prawy
    if current_speed_right < target_speed_right:
        current_speed_right += ACCELERATION_STEP
        if current_speed_right > target_speed_right:
            current_speed_right = target_speed_right
    elif current_speed_right > target_speed_right:
        current_speed_right -= BRAKING_STEP
        if current_speed_right < target_speed_right:
            current_speed_right = target_speed_right

    # Wyślij zaktualizowane prędkości do Arduino
    send_motor_commands(current_speed_left, current_speed_right)

try:
    # Główna pętla programu
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:  # Wyjście z programu
                    running = False
                elif event.key == pygame.K_s:  # Wyłączenie systemu
                    os.system('sudo shutdown now')
                elif event.key == pygame.K_r:  # Rozpoczęcie nagrywania
                    if record == 0:
                        record = 1
                        moment = datetime.now()
                        camera.start_recording(f'/home/pi/Videos/vid_{moment.hour:02d}_{moment.minute:02d}_{moment.second:02d}.mjpg')
                elif event.key == pygame.K_t:  # Zakończenie nagrywania
                    if record == 1:
                        record = 0
                        camera.stop_recording()
                elif event.key == pygame.K_UP:  # Jazda do przodu
                    target_speed_left = MAX_SPEED
                    target_speed_right = MAX_SPEED
                elif event.key == pygame.K_DOWN:  # Jazda do tyłu
                    target_speed_left = -MAX_SPEED
                    target_speed_right = -MAX_SPEED
                elif event.key == pygame.K_LEFT:  # Skręt w lewo
                    target_speed_left = -MAX_SPEED // 2
                    target_speed_right = MAX_SPEED // 2
                elif event.key == pygame.K_RIGHT:  # Skręt w prawo
                    target_speed_left = MAX_SPEED // 2
                    target_speed_right = -MAX_SPEED // 2
                elif event.key == pygame.K_SPACE:  # Zatrzymanie
                    target_speed_left = 0
                    target_speed_right = 0

            elif event.type == pygame.KEYUP:
                # Zatrzymanie tylko po zwolnieniu klawiszy strzałek
                if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
                    target_speed_left = 0
                    target_speed_right = 0

        # Płynna regulacja prędkości
        adjust_speed()

        time.sleep(0.05)  # Krótki czas na aktualizację (20 Hz)

finally:
    # Zatrzymanie silników i sprzątanie
    send_motor_commands(0, 0)
    if record == 1:
        camera.stop_recording()
    arduino.close()
    print("Program zakończony.")
Editor is loading...
Leave a Comment