Untitled

 avatar
unknown
python
5 months ago
3.3 kB
3
Indexable
import serial
import time
import keyboard

# Konfiguracja portu szeregowego
SERIAL_PORT = '/dev/ttyACM0'  # Sprawdź port Arduino za pomocą `ls /dev/tty*`
BAUD_RATE = 115200  # Prędkość transmisji szeregowej

# Inicjalizacja połączenia szeregowego z Arduino
arduino = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
time.sleep(2)  # Czekaj na inicjalizację Arduino

# Prędkość początkowa i zakres
current_speed1 = 0
current_speed2 = 0
TARGET_SPEED_STEP = 10  # Krok zmiany prędkości
MAX_SPEED = 255  # Maksymalna prędkość

def send_motor_commands(speed1, speed2):
    """
    Wyślij komendy do Arduino przez port szeregowy.
    - speed1, speed2: -255 do 255 (prędkości silników, znak określa kierunek)
    """
    try:
        message = f"{speed1},{speed2}\n"
        arduino.write(message.encode())
        print(f"Wysłano dane: {message.strip()}")
    except Exception as e:
        print(f"Błąd komunikacji: {e}")

def gradually_change_speed(target_speed1, target_speed2):
    """
    Stopniowo zmieniaj prędkość do zadanej wartości.
    - target_speed1, target_speed2: docelowe prędkości dla silników.
    """
    global current_speed1, current_speed2

    # Zmieniaj prędkość silnika 1
    if current_speed1 < target_speed1:
        current_speed1 = min(current_speed1 + TARGET_SPEED_STEP, target_speed1)
    elif current_speed1 > target_speed1:
        current_speed1 = max(current_speed1 - TARGET_SPEED_STEP, target_speed1)

    # Zmieniaj prędkość silnika 2
    if current_speed2 < target_speed2:
        current_speed2 = min(current_speed2 + TARGET_SPEED_STEP, target_speed2)
    elif current_speed2 > target_speed2:
        current_speed2 = max(current_speed2 - TARGET_SPEED_STEP, target_speed2)

    send_motor_commands(current_speed1, current_speed2)

def stop_motors():
    """Zatrzymaj oba silniki."""
    global current_speed1, current_speed2
    current_speed1 = 0
    current_speed2 = 0
    send_motor_commands(0, 0)

if __name__ == "__main__":
    try:
        print("Sterowanie robotem za pomocą strzałek:")
        print("↑: Do przodu, ↓: Do tyłu, ←: W lewo, →: W prawo, Spacja: Stop")

        while True:
            if keyboard.is_pressed('up'):  # Strzałka w górę
                gradually_change_speed(MAX_SPEED, MAX_SPEED)

            elif keyboard.is_pressed('down'):  # Strzałka w dół
                gradually_change_speed(-MAX_SPEED, -MAX_SPEED)

            elif keyboard.is_pressed('left'):  # Strzałka w lewo
                gradually_change_speed(-MAX_SPEED, MAX_SPEED)

            elif keyboard.is_pressed('right'):  # Strzałka w prawo
                gradually_change_speed(MAX_SPEED, -MAX_SPEED)

            elif keyboard.is_pressed('space'):  # Spacja - zatrzymanie
                stop_motors()

            else:
                # Jeśli żaden klawisz nie jest naciśnięty, stopniowo zmniejsz prędkość
                gradually_change_speed(0, 0)

            time.sleep(0.05)  # Krótkie opóźnienie dla płynniejszej zmiany
    except KeyboardInterrupt:
        # Obsługa przerwania programu (Ctrl+C)
        print("\nZatrzymywanie silników i wyłączanie programu...")
        stop_motors()
Editor is loading...
Leave a Comment