Скорость последовательной связи 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 мс?

, 👍0

Обсуждение

Есть ли причина, по которой вам нужно обновлять его 400 раз в секунду? Весь код требует времени. Только для отправки 8 байтов на 250 КБ требуется ~ 0,2 мс, затем вам нужно обработать данные. Я подозреваю, что все это занимает больше 2,5 мс, и поэтому к тому времени, когда вы снова читаете, у вас есть более 8 байтов в буфере, и в конечном итоге он переполняется. Я бы попробовал уменьшить с 25 мс до 24 и повторно протестировать, а затем снова уменьшить. возможно, вы сможете найти нижний предел того, что будет надежно работать. Это предполагает, что ему необходимо обновляться быстрее, чем 40 раз в секунду, если нет, то просто оставайтесь на уровне 25 мс., @Chad G

@ChadG На самом деле я хочу применить теорию управления к многоскоростному времени выборки, и я просто понимаю, что совершил ошибку .. мне не нужно было делать это сейчас 2,5 мс. И спасибо за объяснение, почему мой робот не мог ответить .. не могли бы вы поместить свой ответ в раздел ответов, потому что вы объясняете, почему мой робот не отвечает. Спасибо, @Albert H M


1 ответ


Лучший ответ:

0

Весь код требует времени. Только для отправки 8 байтов на 250 КБ требуется ~ 0,2 мс, затем вам нужно обработать данные. Я подозреваю, что все это занимает больше 2,5 мс, и поэтому к тому времени, когда вы снова читаете, у вас есть более 8 байтов в буфере, и в конечном итоге он переполняется. Я бы попробовал уменьшить с 25 мс до 24 и повторно протестировать, а затем снова уменьшить. возможно, вы сможете найти нижний предел того, что будет надежно работать. Это предполагает, что необходимо обновлять быстрее, чем 40 раз в секунду, если нет, то просто оставайтесь на 25 мс

,