Найти - Пользователи
Полная версия: Python + Arduino (Управление Servo+Arduino из Python+OpenCV)
Начало » Python для экспертов » Python + Arduino (Управление Servo+Arduino из Python+OpenCV)
1 2 3
Rodegast
> Не думал что скорость работы Питона с СОМ портом такое тормознутое…

Наоборот. У привода большая инерционность по этому он не успевает начать реагировать на команду до того как придёт новая. Для начала попробуй поменять delay(100);
xam1816
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)
gps38region
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
Короче говоря …
На питоне есть 2-два угла , по горизонтали = X и по вертикали = Y
Диапазоны углов от 0 до 180 градусов
Необходимо сформировать 16-битное слово, где 1-й байт = X, второй байт = Y
Послать 2 байта в ком порт. Склеить два байта X и Y.
В Ардуино выдернуть байты и отправить на серво 1 = Х, на серво 2 = Y

Как то так….

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

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

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

delay(100) в Ардуино пока себя не проявило и я удалил задержку (случайно осталась от предыдущих эксперементов, забыл удалить…)
xam1816
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);  
  }
}
gps38region
Может так координаты запаковать в 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)
gps38region
xam1816
void loop() {
if (Serial.available() >= 2) { // Проверяем, что в буфере есть два байта
int x = Serial.read(); // Чтение первого байта для x
int y = Serial.read(); // второго для y
servo.write(x);
servo.write(y);
}
}
Так молчит…
xam1816
gps38region
Так молчит…
какими методами пользуешься для отладки?
можешь выводить всю информацию на экран что для python,что для arduino (в arduino IDE смотреть)
перепроверь по строкам код, может скорости не совпадают портов или недописал что-нибудь
gps38region
xam1816
какими методами пользуешься для отладки?
В том то и дело что мониторить нечем, разве что экран подцепить к Ардуино но сразу замедлится отработка сервы, разве что посмотреть что прилетает по СОМ порту.
По одному байту все четко работает….
С 2-двумя байтами пока ни как….
Буду разбираться…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB