Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2025 16:36:47

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

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

> Не думал что скорость работы Питона с СОМ портом такое тормознутое…

Наоборот. У привода большая инерционность по этому он не успевает начать реагировать на команду до того как придёт новая. Для начала попробуй поменять delay(100);



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Янв. 15, 2025 16:39:34)

Офлайн

#2 Янв. 15, 2025 16:55:22

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

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

gps38region
попробуй что-то типа этого, как поведет себя
  
#include <Servo.h>
Servo servo[2];  // объект серво для 2х моторов
 
void setup() {
  Serial.begin(115200);  // попробовать на максимальной скорости
  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) {
    int incomingByte = Serial.read();  // Считываем одно число из буфера
    servo[0].write(incomingByte);
    // Отправляем подтверждение обратно: 0x01 для успешного выполнения
    Serial.write(0x01);  
  }
}

  
import serial
import time
port = "COM8"
baudrate = 115200
arduino = serial.Serial(port, baudrate=baudrate, timeout=1)
test_data = [90, 45, 180, 30, 150, 120, 60]
def send_data(data):
    for value in data:
        arduino.write(bytes([value]))  # Отправка данных сразу в байтах быстрее
        # Ожидание подтверждения от Arduino
        while True:
            if arduino.in_waiting > 0:
                response = arduino.read(1)  # Чтение одного байта
                if response == b'\x01':  # Если ответ равен 0x01 (успех)
                    break
               
                  
        time.sleep(0.01)  # Небольшая задержка, чтобы избежать проблем с буфером
send_data(test_data)

Офлайн

#3 Янв. 16, 2025 06:53:05

gps38region
Зарегистрирован: 2025-01-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

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

xam1816
попробуй что-то типа этого, как поведет себя
Ну вот что на текущий момент…
Код для Ардуино подправил , в частности убрал отправку в пор с Ардуино обратно…
Так как Питон висит при чтении из СОМ порта. Синхронизация пока не работает, не могут они по простому договорится.
И так, код для Ардуино и кручу 2-Два серво сразу что бы отследить как библиотека отрабатывает на двух серво

 #include <Servo.h>
Servo servo[2];  
void setup() {
  Serial.begin(115200);  
  servo[0].attach(7, 400, 2400);
  servo[1].attach(8, 400, 2400);
 
  servo[0].write(0); 
  servo[1].write(0); 
}
void loop() {
  
  if (Serial.available() > 0) {
    int incomingByte = Serial.read();  
    servo[0].write(incomingByte);
    servo[1].write(incomingByte);
  }
}

На Питоне вот так …

 import serial
import time
port = "COM8"
baudrate = 115200
arduino = serial.Serial(port, baudrate=baudrate, timeout=1)
test_data = [0,0,0, 45,90,135,180,0,0]
def send_data(data):
    for value in data:
        arduino.write(bytes([value]))
        
        #while True:
        #    if arduino.in_waiting > 0:
        #        response = arduino.read(1)  
        #        if response == b'\x01':  
        #            break
                  
        time.sleep(0.2)  
send_data(test_data)

Закомментировал чтение из порта так как висит до ctrl^C
test_data [0,0,0, это работает как инициализация, так как углы 45 90 135 и далее начинают работать с 4-го байта.
Первые 3-три байта/числа могут быть любыми 1 2 3 или 123 12 45, пофиг. Нули для наглядности вписал.
За посылкой 3-трех нулей углы в байтах передаются !
Теперь по скорости…
Как видно time.sleep(0.2) , ниже 0,2 уже глючит…
Но 0.2 и этого даже чересчур !!!
Спасибо !

Вот теперь нужно 2-два байта передать с питона и разобрать их на Ардуино….
Видео снял как быстро стало крутить, смотрю как тут на форуме можно видео прикрепить…

Видео на Рутубе…………
Видео на Ютубе

Отредактировано gps38region (Янв. 16, 2025 07:03:43)

Офлайн

#4 Янв. 16, 2025 08:09:36

gps38region
Зарегистрирован: 2025-01-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Короче говоря …
На питоне есть 2-два угла , по горизонтали = X и по вертикали = Y
Диапазоны углов от 0 до 180 градусов
Необходимо сформировать 16-битное слово, где 1-й байт = X, второй байт = Y
Послать 2 байта в ком порт. Склеить два байта X и Y.
В Ардуино выдернуть байты и отправить на серво 1 = Х, на серво 2 = Y

Как то так….

На текущий момент благодаря xam1816 управление Серво по времени сократилось почти в 10 раз. Чего вполне достаточно крутить камеру за центром лица….

Огромный респект xam1816 за помощь с питоном !!!
Надеюсь поможет реализовать то что описал выше в данном посте….
Еще раз спасибо !!!

Отредактировано gps38region (Янв. 16, 2025 08:23:41)

Офлайн

#5 Янв. 16, 2025 08:29:36

gps38region
Зарегистрирован: 2025-01-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Rodegast
Наоборот. У привода большая инерционность по этому он не успевает начать реагировать на команду до того как придёт новая. Для начала попробуй поменять delay(100);
Тут выше написал, что при отправке байта в порт , ЗАДЕРЖКА уменьшилась с 1.1 до 0.2 сек.
0.2 сек это вполне достаточно крутить камеру в серво.
Осталось запаковать угол X по горизонтали и Y по вертикали в 2-два байта и отправить с порт.
Как то так…

На видео видно как шустро стало работать…

delay(100) в Ардуино пока себя не проявило и я удалил задержку (случайно осталась от предыдущих эксперементов, забыл удалить…)

Офлайн

#6 Янв. 16, 2025 10:45:41

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

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

gps38region
Послать 2 байта в ком порт. Склеить два байта X и Y.
python
  
x = 45
y = 120
# Преобразуем числа в байты и отправляем
ser.write(bytes([x, y]))
arduino
  
 void loop() {
  if (Serial.available() >= 2) {  // Проверяем, что в буфере есть  два байта
    int x = Serial.read();  // Чтение первого байта для x
    int y = Serial.read();  // второго для y
    servo[0].write(x);  
    servo[1].write(y);  
  }
}

Офлайн

#7 Янв. 16, 2025 10:59:55

gps38region
Зарегистрирован: 2025-01-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Может так координаты запаковать в 2-два байта ?

# declaring an integer value
x = 128
y = 128
integer_val = x*256+y

# converting int to bytes with length
# of the array as 2 and byter order as
# little
bytes_val = integer_val.to_bytes(2, 'little')

# printing integer in byte representation
print(bytes_val)

Офлайн

#8 Янв. 16, 2025 13:09:13

gps38region
Зарегистрирован: 2025-01-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

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

xam1816
void loop() {
if (Serial.available() >= 2) { // Проверяем, что в буфере есть два байта
int x = Serial.read(); // Чтение первого байта для x
int y = Serial.read(); // второго для y
servo.write(x);
servo.write(y);
}
}
Так молчит…

Офлайн

#9 Янв. 16, 2025 14:13:12

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

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

gps38region
Так молчит…
какими методами пользуешься для отладки?
можешь выводить всю информацию на экран что для python,что для arduino (в arduino IDE смотреть)
перепроверь по строкам код, может скорости не совпадают портов или недописал что-нибудь

Офлайн

#10 Янв. 16, 2025 15:29:19

gps38region
Зарегистрирован: 2025-01-13
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

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

xam1816
какими методами пользуешься для отладки?
В том то и дело что мониторить нечем, разве что экран подцепить к Ардуино но сразу замедлится отработка сервы, разве что посмотреть что прилетает по СОМ порту.
По одному байту все четко работает….
С 2-двумя байтами пока ни как….
Буду разбираться…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version