Open dae416 opened 4 years ago
속도를 특정 시간동안 가속하는 가감속 예제인 BLC-200_SpeedWithTime.ino을 참고하시면 좋을것 같습니다.
이 코드 상단에 보시면 #define SPD_SETTIME 1 로 되어있는데, SPD_SETTIME*10 초가 속도 도달 시간으로 세팅됩니다. 따라서 현재 1로 되어있다는 것은 0.1초 안에 속도가 도달하는 경우이고, 이를 더 느리게 한다면,
예를 들어 1초 가속으로 느리게 한다면 #define SPD_SETTIME 10 으로 바꿔주고 업로드 하면 됩니다.
자세한 명령어는 BLC 프로토콜 자료의 "3.가감속 속도제어 (송신)"을 참고하시면 됩니다.
아 속도를 더 빠르게 한다고 하면, 현재 0.1초 가속이 제일 빠른 셋업입니다. 만약 속도가 빨라야 한다면 기어박스의 기어비를 낮추는 수밖에 없을듯 합니다. ㅠㅠ
드라이버 자체 속도는 0.1초보다 응답이 빠른것 같은데, 속도를 올리는 것이 아예 불가능한가요? ㅜㅜ
BLC 드라이버 프로토콜에 속도제어기 모드도 있던데,
PID 계수를 조절하면 속도가 좀더 빨라질 수 있는지 궁금합니다. 그리고 해당 소스코드도 제공해주실 수 있는지도 여쭤보고 싶습니다!
감사합니다!
한가지 더 여쭤봅니다.
최근에 (6월 24일 경) 수정해주신 라이브러리를 사용하여 동일한 코드로 테스트를 해보았는데, 반응속도가 0.15 -> 0.1초 정도로 개선되었습니다 (모터, 코드는 그대로이고, 아두이노 라이브러리만 교체한 상황입니다.).
코드가 똑같은데 반응속도가 빨라질 수 있는건가요?
아마 라이브러리에서 어떤 부분을 개선하셔서 이런 변화가 생겼는지도 궁금합니다.
저에게 모터 안정성이 중요한 요소라서, 모터 상태가 변화된건지, 소프트웨어가 변경된 것인지 알아보고 있어서 여쭤보게 되었습니다.
바쁘실텐데 계속 여줘봐서 죄송합니다. 감사합니다.
혹시 지금 사용하고 계시는 코드를 올려주실수 있나요? 그리고 PID 계수 튜닝하는 예제는 조만간 업로드 하도록 하겠습니다.
네, 코드올려드립니다. 카메라와 연동 및 속도제어를 위해서 이것저것 수정하여서 보시기 어려울 수도 있습니다.
/*****/ // User Configuration
const unsigned long period = 0; //the value is a number of milliseconds int spd_gain = 50; // MAS의 포텐셔미터 증폭값 /*****/
MAS001 myShield; BLC200 myDevice(9600, 100); // Baudrate = 9600, Serial timeout = 100ms
uint16_t spd_input; uint16_t spd_output; int cnt = 0;
int trg_out1 = 4; int trg_out2 = 7;
unsigned long startMillis; //some global variables available anywhere in the program unsigned long currentMillis; unsigned long loopstartMillis; unsigned long temp = 100000000000000000000000000;
void setup() { Serial.begin(115200); pinMode(trg_out1, OUTPUT); // 카메라 신호 1 pinMode(trg_out2, OUTPUT); // 카메라 신호 2 startMillis = millis(); // initial start time }
void loop() { currentMillis = millis(); digitalWrite(trg_out1, LOW); // 카메라 트리거 신호 1 digitalWrite(trg_out2, LOW); // 카메라 트리거 신호 2 (trigger off) spd_input = myShield.getPot() * spd_gain;
if (myShield.button1Clicked()) { cnt = cnt + 1; if (loopstartMillis < temp ){ loopstartMillis = currentMillis; temp = loopstartMillis; } if (currentMillis - loopstartMillis >= period) // 등호없으면 앞의 0.1초 사라짐 주의 { digitalWrite(trg_out1, LOW); // 카메라 트리거 신호 1 digitalWrite(trg_out2, HIGH); // 카메라 트리거 신호 2 (trigger on)
} if (myShield.button2Clicked()) { if(cnt < 2){ myDevice.set_SpeedWithTime(DEVICE_ID, 0, spd_input * 6.125, SPD_SETTIME); // 초기 가속도를 높이기 위해 0.1s 동안 임시로 약간 높은 속도를 주었습니다. }else{ // ID = 0, CCW, SPD = (spd_input/10)RPM, TIME = 0.1s myDevice.set_SpeedWithTime(DEVICE_ID, 0, spd_input, SPD_SETTIME); } } else { // ID = 0, CW, SPD = (spd_input/10)RPM, TIME = 0.1s myDevice.set_SpeedWithTime(DEVICE_ID, 1, spd_input, SPD_SETTIME); } } else { myDevice.set_SpeedWithTime(DEVICE_ID, 1, 0, SPD_SETTIME); temp = 100000000000000000000000000; cnt=0; }
// Get Current speed if (myDevice.get_Feedback(DEVICE_ID, 0xA2)) { spd_output = (uint16_t)myDevice.blcData[2] << 8 | (uint16_t)myDevice.blcData[3]; Serial.print(spd_output); Serial.print("\t"); Serial.print(loopstartMillis); Serial.print("\t"); Serial.println(currentMillis); }
delay(100);
}
언제쯤 업로드 가능하실지 궁금합니다!
제 실험 상황에 맞게 모터를 구동하려고 하다가 궁금한 점이 생겼는데요.
모터 가속 시간(아래 그림에서 빨간색 T로 표시된 부분)을 줄이려면 어떤 변수를 조절해야하는지 궁금합니다.
define SPD_SETTIME 1
제가 코드를 잘 이해한지는 모르겠는데요. SPD_SETTIME이 모터의 반응시간인 것 같고, 이 값은 1로 두고 실험하였습니다.
해당값을 1보다 작은 실수값으로도 대입해보았는데, 1 미만에서는 모터가 구동하지 않았습니다.
아래 그림과 같은 결과의 반응속도 이상으로 모터를 빠르게 돌리려면 어떻게 해야하는지 조언주시면 감사드리겠습니다..
감사합니다.