Merge branch 'master' of http://git.pirogov.ai/Ilya_Chis/Diplom
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 4.7 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 4.0 MiB |
@@ -0,0 +1,98 @@
|
||||
import RPi.GPIO as GPIO
|
||||
import serial
|
||||
import time
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.animation import FuncAnimation
|
||||
import keyboard
|
||||
|
||||
# Настройки GPIO
|
||||
IN1 = 23
|
||||
IN2 = 24
|
||||
IN3 = 17
|
||||
IN4 = 27
|
||||
ENA = 26
|
||||
ENB = 19
|
||||
|
||||
GPIO.setwarnings(False)
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
GPIO.setup(IN1, GPIO.OUT)
|
||||
GPIO.setup(IN2, GPIO.OUT)
|
||||
GPIO.setup(IN3, GPIO.OUT)
|
||||
GPIO.setup(IN4, GPIO.OUT)
|
||||
GPIO.setup(ENA, GPIO.OUT)
|
||||
GPIO.setup(ENB, GPIO.OUT)
|
||||
|
||||
# Параметры для лидара
|
||||
lidar_port = '/dev/ttyUSB1' # Убедитесь, что это правильный порт
|
||||
baud_rate = 115200
|
||||
|
||||
# Настройка серийного соединения
|
||||
ser = serial.Serial(lidar_port, baud_rate, timeout=1)
|
||||
|
||||
# Параметры скорости
|
||||
speed = 10 # Регулируйте скорость по необходимости
|
||||
GPIO.output(ENA, speed)
|
||||
GPIO.output(ENB, speed)
|
||||
|
||||
# Функции управления движением
|
||||
def move_forward():
|
||||
GPIO.output(IN1, GPIO.HIGH)
|
||||
GPIO.output(IN2, GPIO.LOW)
|
||||
GPIO.output(IN3, GPIO.HIGH)
|
||||
GPIO.output(IN4, GPIO.LOW)
|
||||
print("Робот движется вперед")
|
||||
|
||||
def move_backward():
|
||||
GPIO.output(IN1, GPIO.LOW)
|
||||
GPIO.output(IN2, GPIO.HIGH)
|
||||
GPIO.output(IN3, GPIO.LOW)
|
||||
GPIO.output(IN4, GPIO.HIGH)
|
||||
print("Робот движется назад")
|
||||
|
||||
def stop():
|
||||
GPIO.output(IN1, GPIO.LOW)
|
||||
GPIO.output(IN2, GPIO.LOW)
|
||||
GPIO.output(IN3, GPIO.LOW)
|
||||
GPIO.output(IN4, GPIO.LOW)
|
||||
print("Робот остановлен")
|
||||
|
||||
def read_lidar_data():
|
||||
try:
|
||||
line = ser.readline().decode('utf-8', errors='ignore').strip()
|
||||
if line:
|
||||
print(f"Считанные данные от лидара: {line}") # Отладка
|
||||
return line # Вернем считанные данные
|
||||
else:
|
||||
print("Нет данных")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"Ошибка чтения данных от лидара: {e}")
|
||||
return None
|
||||
|
||||
# Визуализация карты препятствий
|
||||
def update_plot(frame):
|
||||
data = read_lidar_data() # Получаем данные от лидара
|
||||
if data is not None:
|
||||
# Логика для визуализации данных
|
||||
# Вставьте здесь ваш код для построения карты препятствий
|
||||
pass # Замените на свою логику
|
||||
|
||||
# Основной цикл
|
||||
def main():
|
||||
print("Нажмите 'W' для запуска автономного движения и ' ' (пробел) для остановки.")
|
||||
while True:
|
||||
if keyboard.is_pressed('w'):
|
||||
move_forward()
|
||||
print("Автономное движение включено")
|
||||
if keyboard.is_pressed('s'):
|
||||
move_backward()
|
||||
if keyboard.is_pressed(' '):
|
||||
stop()
|
||||
print("Автономное движение остановлено")
|
||||
# Добавьте паузу, чтобы избежать высокой загрузки CPU
|
||||
time.sleep(0.1)
|
||||
|
||||
# Запуск программы
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
After Width: | Height: | Size: 3.4 MiB |
|
After Width: | Height: | Size: 3.8 MiB |
|
After Width: | Height: | Size: 2.9 MiB |
|
After Width: | Height: | Size: 3.4 MiB |
@@ -0,0 +1,115 @@
|
||||
import RPi.GPIO as GPIO
|
||||
import time
|
||||
import keyboard
|
||||
|
||||
# Настройка пинов
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
|
||||
# Пины для управления моторами
|
||||
IN1 = 17
|
||||
IN2 = 27
|
||||
IN3 = 22
|
||||
IN4 = 23
|
||||
|
||||
# Пины для управления скоростью (PWM)
|
||||
ENA = 18
|
||||
ENB = 19
|
||||
|
||||
# Настройка пинов как выходов
|
||||
GPIO.setup(IN1, GPIO.OUT)
|
||||
GPIO.setup(IN2, GPIO.OUT)
|
||||
GPIO.setup(IN3, GPIO.OUT)
|
||||
GPIO.setup(IN4, GPIO.OUT)
|
||||
GPIO.setup(ENA, GPIO.OUT)
|
||||
GPIO.setup(ENB, GPIO.OUT)
|
||||
|
||||
# Создание ШИМ (PWM) на пинах ENA и ENB с частотой 1000 Гц
|
||||
pwm_a = GPIO.PWM(ENA, 1000)
|
||||
pwm_b = GPIO.PWM(ENB, 1000)
|
||||
|
||||
# Старт ШИМ с нулевой скоростью (0% скважности)
|
||||
pwm_a.start(0)
|
||||
pwm_b.start(0)
|
||||
|
||||
# Функции управления
|
||||
def move_forward(speed):
|
||||
GPIO.output(IN1, GPIO.HIGH)
|
||||
GPIO.output(IN2, GPIO.LOW)
|
||||
GPIO.output(IN3, GPIO.HIGH)
|
||||
GPIO.output(IN4, GPIO.LOW)
|
||||
pwm_a.ChangeDutyCycle(speed)
|
||||
pwm_b.ChangeDutyCycle(speed)
|
||||
print(f"Moving forward at speed {speed}")
|
||||
|
||||
def move_backward(speed):
|
||||
GPIO.output(IN1, GPIO.LOW)
|
||||
GPIO.output(IN2, GPIO.HIGH)
|
||||
GPIO.output(IN3, GPIO.LOW)
|
||||
GPIO.output(IN4, GPIO.HIGH)
|
||||
pwm_a.ChangeDutyCycle(speed)
|
||||
pwm_b.ChangeDutyCycle(speed)
|
||||
print(f"Moving backward at speed {speed}")
|
||||
|
||||
def move_left(speed):
|
||||
GPIO.output(IN1, GPIO.LOW)
|
||||
GPIO.output(IN2, GPIO.HIGH)
|
||||
GPIO.output(IN3, GPIO.HIGH)
|
||||
GPIO.output(IN4, GPIO.LOW)
|
||||
pwm_a.ChangeDutyCycle(speed)
|
||||
pwm_b.ChangeDutyCycle(speed)
|
||||
print(f"Turning left at speed {speed}")
|
||||
|
||||
def move_right(speed):
|
||||
GPIO.output(IN1, GPIO.HIGH)
|
||||
GPIO.output(IN2, GPIO.LOW)
|
||||
GPIO.output(IN3, GPIO.LOW)
|
||||
GPIO.output(IN4, GPIO.HIGH)
|
||||
pwm_a.ChangeDutyCycle(speed)
|
||||
pwm_b.ChangeDutyCycle(speed)
|
||||
print(f"Turning right at speed {speed}")
|
||||
|
||||
def stop():
|
||||
GPIO.output(IN1, GPIO.LOW)
|
||||
GPIO.output(IN2, GPIO.LOW)
|
||||
GPIO.output(IN3, GPIO.LOW)
|
||||
GPIO.output(IN4, GPIO.LOW)
|
||||
pwm_a.ChangeDutyCycle(0)
|
||||
pwm_b.ChangeDutyCycle(0)
|
||||
print("Stopped")
|
||||
|
||||
try:
|
||||
speed = 50 # Начальная скорость (50% ШИМ)
|
||||
print("Use W/A/S/D to move and adjust speed, release key to stop")
|
||||
|
||||
while True:
|
||||
# Проверка нажатия клавиш для движения
|
||||
if keyboard.is_pressed('w'):
|
||||
move_forward(speed)
|
||||
elif keyboard.is_pressed('s'):
|
||||
move_backward(speed)
|
||||
elif keyboard.is_pressed('a'):
|
||||
move_left(speed)
|
||||
elif keyboard.is_pressed('d'):
|
||||
move_right(speed)
|
||||
else:
|
||||
# Если ни одна из клавиш не нажата, остановить моторы
|
||||
stop()
|
||||
|
||||
# Регулировка скорости
|
||||
if keyboard.is_pressed('q'): # Уменьшение скорости
|
||||
speed = max(0, speed - 10)
|
||||
print(f"Speed decreased to {speed}%")
|
||||
time.sleep(0.1)
|
||||
elif keyboard.is_pressed('e'): # Увеличение скорости
|
||||
speed = min(100, speed + 10)
|
||||
print(f"Speed increased to {speed}%")
|
||||
time.sleep(0.1)
|
||||
|
||||
time.sleep(0.05) # Небольшая задержка для плавного опроса клавиш
|
||||
|
||||
except KeyboardInterrupt:
|
||||
stop() # Остановка моторов при прерывании программы
|
||||
finally:
|
||||
pwm_a.stop()
|
||||
pwm_b.stop()
|
||||
GPIO.cleanup() # Очистка конфигурации GPIO
|
||||