Background : Im controlling serial manipulator using Arduino Uno with Servo Shield. Servo work at 20 ms, so i would like to send command atleast every 2.5ms. Command sent from PC.
I send 8 bytes of data from my python code on PC at 250k Baudrate. If i send it every 25 ms, my robot could respond and everything works fine. But if i send every 2.5 ms, my system wont work.
Here my arduino code,
#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)
{
//Joint 1
temp = Serial.read();
x = sudutT0(temp);
pwm.setPWM(0,x,4095);
// Joint 2 Servo
temp = Serial.read();
x = sudutT0(temp);
pwm.setPWM(1,x,4095);
x = sudutT0(180-temp); //810 - theta
pwm.setPWM(2,x,4095);
//Joint 3 - 6, Gripper
for(uint8_t u = 3; u<8; u++)
{
temp = Serial.read();
x = sudutT0(temp);
pwm.setPWM(u,x,4095);
}
//delay(100);
}
}
}
Is there anything that i miss, that make my system could not respond if i send signal every 2.5 ms?
-
Is there a reason you need to update it 400 times a second? All of the code takes time. It takes ~0.2 ms just to send the 8bytes at 250k, then you have to process the data. I would suspect that all that is taking longer then 2.5 ms and so by the time you read again, you have more then 8 bytes in the buffer, and eventually it overflows. I would try decreasing from 25ms to 24 and re-test, then reducing again. you may be able to find the lower limit of what will work reliably. This is assuming there is a need for it to update faster then 40 times a second, if not then just stay at 25ms.Chad G– Chad G2019年06月03日 16:45:11 +00:00Commented Jun 3, 2019 at 16:45
-
@ChadG Actually i wanna apply control theory about multirate sampling time, and i just realize i made a mistake.. i didnt need to make it 2.5ms now. And thank you for explaining why my robot couldn't respond.. could u put ur answer at answer section, because u explain why my robot not responding. ThxAlbert H M– Albert H M2019年06月04日 03:36:39 +00:00Commented Jun 4, 2019 at 3:36
1 Answer 1
All of the code takes time. It takes ~0.2 ms just to send the 8bytes at 250k, then you have to process the data. I would suspect that all that is taking longer then 2.5 ms and so by the time you read again, you have more then 8 bytes in the buffer, and eventually it overflows. I would try decreasing from 25ms to 24 and re-test, then reducing again. you may be able to find the lower limit of what will work reliably. This is assuming there is a need for it to update faster then 40 times a second, if not then just stay at 25ms