Форум сайта python.su
> Не думал что скорость работы Питона с СОМ портом такое тормознутое…
Наоборот. У привода большая инерционность по этому он не успевает начать реагировать на команду до того как придёт новая. Для начала попробуй поменять delay(100);
Отредактировано Rodegast (Янв. 15, 2025 16:39:34)
Офлайн
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)
Офлайн
xam1816Ну вот что на текущий момент…
попробуй что-то типа этого, как поведет себя
#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)
Отредактировано gps38region (Янв. 16, 2025 07:03:43)
Офлайн
Короче говоря …
На питоне есть 2-два угла , по горизонтали = X и по вертикали = Y
Диапазоны углов от 0 до 180 градусов
Необходимо сформировать 16-битное слово, где 1-й байт = X, второй байт = Y
Послать 2 байта в ком порт. Склеить два байта X и Y.
В Ардуино выдернуть байты и отправить на серво 1 = Х, на серво 2 = Y
Как то так….
На текущий момент благодаря xam1816 управление Серво по времени сократилось почти в 10 раз. Чего вполне достаточно крутить камеру за центром лица….
Огромный респект xam1816 за помощь с питоном !!!
Надеюсь поможет реализовать то что описал выше в данном посте….
Еще раз спасибо !!!
Отредактировано gps38region (Янв. 16, 2025 08:23:41)
Офлайн
RodegastТут выше написал, что при отправке байта в порт , ЗАДЕРЖКА уменьшилась с 1.1 до 0.2 сек.
Наоборот. У привода большая инерционность по этому он не успевает начать реагировать на команду до того как придёт новая. Для начала попробуй поменять delay(100);
Офлайн
gps38regionpython
Послать 2 байта в ком порт. Склеить два байта X и Y.
x = 45 y = 120 # Преобразуем числа в байты и отправляем ser.write(bytes([x, y]))
void loop() { if (Serial.available() >= 2) { // Проверяем, что в буфере есть два байта int x = Serial.read(); // Чтение первого байта для x int y = Serial.read(); // второго для y servo[0].write(x); servo[1].write(y); } }
Офлайн
Может так координаты запаковать в 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)
Офлайн
xam1816Так молчит…
void loop() {
if (Serial.available() >= 2) { // Проверяем, что в буфере есть два байта
int x = Serial.read(); // Чтение первого байта для x
int y = Serial.read(); // второго для y
servo.write(x);
servo.write(y);
}
}
Офлайн
gps38regionкакими методами пользуешься для отладки?
Так молчит…
Офлайн
xam1816В том то и дело что мониторить нечем, разве что экран подцепить к Ардуино но сразу замедлится отработка сервы, разве что посмотреть что прилетает по СОМ порту.
какими методами пользуешься для отладки?
Офлайн