Скорость последовательной связи Python Arduino
Предыстория: я управляю последовательным манипулятором, используя Arduino Uno с Servo Shield. Сервопривод работает со скоростью 20 мс, поэтому я хотел бы отправлять команду как минимум каждые 2,5 мс. Команда отправлена с ПК.
Я отправляю 8 байт данных из своего кода Python на ПК со скоростью 250 000 бод. Если я отправлю его каждые 25 мс, мой робот сможет ответить, и все будет работать нормально. Но если я отправлю каждые 2,5 мс, моя система не будет работать.
Вот мой код Arduino,
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int x,temp;
int sudutT0(long int p)
{
int u = 3600+((405*p)/180);
return u;
}
void setup() {
Serial.begin(250000);
Serial.println("Joint 2 Test!");
pwm.begin();
pwm.setPWMFreq(50);
Wire.setClock(1000);
for (uint8_t pin=0; pin<16; pin++)
{
pwm.setPWM(pin, sudutT0(90),4095);
}
pwm.setPWM(3, sudutT0(150), 4095);
}
void loop() {
if(Serial.available() == 8){
if(Serial.read() == 0xF5)
{
// Соединение 1
temp = Serial.read();
x = sudutT0(temp);
pwm.setPWM(0,x,4095);
// Шарнир 2 Сервопривод
temp = Serial.read();
x = sudutT0(temp);
pwm.setPWM(1,x,4095);
x = sudutT0(180-temp); //810 - тета
pwm.setPWM(2,x,4095);
// Соединение 3 - 6, захват
for(uint8_t u = 3; u<8; u++)
{
temp = Serial.read();
x = sudutT0(temp);
pwm.setPWM(u,x,4095);
}
// задержка (100);
}
}
}
Есть ли что-то, что я упустил, из-за чего моя система не могла ответить, если я посылаю сигнал каждые 2,5 мс?
@Albert H M, 👍0
Обсуждение1 ответ
Лучший ответ:
Весь код требует времени. Только для отправки 8 байтов на 250 КБ требуется ~ 0,2 мс, затем вам нужно обработать данные. Я подозреваю, что все это занимает больше 2,5 мс, и поэтому к тому времени, когда вы снова читаете, у вас есть более 8 байтов в буфере, и в конечном итоге он переполняется. Я бы попробовал уменьшить с 25 мс до 24 и повторно протестировать, а затем снова уменьшить. возможно, вы сможете найти нижний предел того, что будет надежно работать. Это предполагает, что необходимо обновлять быстрее, чем 40 раз в секунду, если нет, то просто оставайтесь на 25 мс
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
Есть ли причина, по которой вам нужно обновлять его 400 раз в секунду? Весь код требует времени. Только для отправки 8 байтов на 250 КБ требуется ~ 0,2 мс, затем вам нужно обработать данные. Я подозреваю, что все это занимает больше 2,5 мс, и поэтому к тому времени, когда вы снова читаете, у вас есть более 8 байтов в буфере, и в конечном итоге он переполняется. Я бы попробовал уменьшить с 25 мс до 24 и повторно протестировать, а затем снова уменьшить. возможно, вы сможете найти нижний предел того, что будет надежно работать. Это предполагает, что ему необходимо обновляться быстрее, чем 40 раз в секунду, если нет, то просто оставайтесь на уровне 25 мс., @Chad G
@ChadG На самом деле я хочу применить теорию управления к многоскоростному времени выборки, и я просто понимаю, что совершил ошибку .. мне не нужно было делать это сейчас 2,5 мс. И спасибо за объяснение, почему мой робот не мог ответить .. не могли бы вы поместить свой ответ в раздел ответов, потому что вы объясняете, почему мой робот не отвечает. Спасибо, @Albert H M