Python + Arduino (Управление Servo+Arduino из Python+OpenCV)

gps38region

Новичок
Пользователь
Янв 15, 2025
2
0
1
Приветствую всех ГУРУ и тех кому не безразлична данная тема.
Пытаюсь сделать трекер лица с WEBcam на Python+OpenCV --> Arduino+Servo
 

gps38region

Новичок
Пользователь
Янв 15, 2025
2
0
1
Для Ардуино написал скетч который по СОМ порту принимает команду в формате X:Y (0:0 , 180:180 , 23:56 и т.д.)

#include <Servo.h>
Servo servo[2]; // объект серво для 2х моторов

void setup() {
Serial.begin(9600); // открыть порт для связи
servo[0].attach(7, 400, 2400);
servo[1].attach(8, 400, 2400);


servo[0].write(90); //выводим серво в центр
servo[1].write(90); //выводим серво в центр
}


void loop() { // Основной цикл

if (Serial.available() > 0) { // если что то прислали

String bufString = Serial.readString(); // читаем как строку
byte dividerIndex = bufString.indexOf(':'); // ищем индекс разделителя
String buf_1 = bufString.substring(0, dividerIndex); // создаём строку с первым числом
String buf_2 = bufString.substring(dividerIndex + 1); // создаём строку со вторым числом
int val_1 = buf_1.toInt(); // преобразуем угол горизонталм
int val_2 = buf_2.toInt(); // преобразуем угол вертикали


servo[0].write(val_1); // поворот по X
servo[1].write(val_2); // поворот по Y
delay(100);
}

}

На Python написал прогу для тестов поворотов :

import time
import serial

# Configure the COM port
port = "COM8" # Replace with the appropriate COM port name
baudrate = 9600
# Open the COM port
ser = serial.Serial(port, baudrate=baudrate)
print("Serial connection established.")

try:

# Send commands to the Arduino
while True:

command = input("Enter a command ('0:0', '180:180'): ")
ser.write(command.encode())

except KeyboardInterrupt:
pass

finally:
# Close the serial connection
if ser.is_open:
command = '0:0' # zero position
ser.write(command.encode())
ser.close()

print("Serial connection closed.")

В ручном вводе значений углов Серво все отрабатывает на 100%
Но если посылки в СОМ порт из питона чаще 1.1 сек то Серво на Ардуино не отрабатывает повороты.
Хотя Серво (повороты от 0 до 180 град) совершает за 0.12 сек

Есть код для Питона с OpenCV который отслеживает лицо с WEBcam , вычисляет центр и выдает углы в СОМ порт из Питона в Ардуино что бы повернуть Серво приводы....

import numpy as np
import cv2

import serial
port = "COM8" # Replace with the appropriate COM port name
baudrate = 9600
# Open the COM port
arduino = serial.Serial(port, baudrate=baudrate)


face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

Tim=0

xi = int(capture.get(3))
cxi = int(xi/2)
yi = int(capture.get(4))
cyi = int(yi/2)

while True:
ret, frame = capture.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
eyes = eye_cascade.detectMultiScale(gray, 1.3, 5)

cv2.line(frame, (cxi,0),(cxi,yi),(120,120,120),1)
cv2.line(frame, (0,cyi),(xi,cyi),(120,120,120),1)
ct = ''

current_time0 = time.time()
for (x, y, w, h) in faces:
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
cx=int(x+w/2)
cy=int(y+h/2)
dx=int(90+cxi-cx)
dy=int(90+cyi-cy)
ct=str(dx)+':'+str(dy) # Send to COM port
cv2.circle(frame, (cx,cy), 5, (0, 0, 255) , -1) #-1
cv2.line(frame, (cxi,cyi), (cx,cy),(0, 0, 255), 3)

cv2.putText(frame, ct, (0, 20), cv2.FONT_HERSHEY_DUPLEX, 0.9, (0, 0, 250), 1)
# Send commands to the Arduino
#print(current_time0)

#if (time.time()-current_time0)>2.0:
# ser.write(f"{angle}n".encode())
print(ct)
command = ct
arduino.write(command.encode())
arduino.flush()
time.sleep(1.2)
#current_time0 = time.time()


cv2.imshow('From Camera', frame)

k = cv2.waitKey(30) & 0xFF
if k == 27:
if arduino.is_open:
command = '0:0'
arduino.write(command.encode())
arduino.close()
print("Serial connection closed.")
break

capture.release()

cv2.destroyAllWindows()

Подскажите почему у меня ограничения в 1.1 секунду на отпрвку команды из Питона в Ардуино ?
Заранее благодарю за помощь...
 

Форум IT Специалистов