Motorbank / MAS001

MAS001 Arduino Library
7 stars 5 forks source link

더 빠른 응답속도에 대한 문의 (Request for faster response of BLC400) #1

Open dae416 opened 4 years ago

dae416 commented 4 years ago

제 실험 상황에 맞게 모터를 구동하려고 하다가 궁금한 점이 생겼는데요. 

모터 가속 시간(아래 그림에서 빨간색 T로 표시된 부분)을 줄이려면 어떤 변수를 조절해야하는지 궁금합니다.

define SPD_SETTIME 1  

 제가 코드를 잘 이해한지는 모르겠는데요. SPD_SETTIME이 모터의 반응시간인 것 같고, 이 값은 1로 두고 실험하였습니다. 

해당값을 1보다 작은 실수값으로도 대입해보았는데, 1 미만에서는 모터가 구동하지 않았습니다. 

아래 그림과 같은 결과의 반응속도 이상으로 모터를 빠르게 돌리려면 어떻게 해야하는지 조언주시면 감사드리겠습니다.. 

감사합니다.

image

dydwo92 commented 4 years ago

속도를 특정 시간동안 가속하는 가감속 예제인 BLC-200_SpeedWithTime.ino을 참고하시면 좋을것 같습니다.

이 코드 상단에 보시면 #define SPD_SETTIME 1 로 되어있는데, SPD_SETTIME*10 초가 속도 도달 시간으로 세팅됩니다. 따라서 현재 1로 되어있다는 것은 0.1초 안에 속도가 도달하는 경우이고, 이를 더 느리게 한다면,

예를 들어 1초 가속으로 느리게 한다면 #define SPD_SETTIME 10 으로 바꿔주고 업로드 하면 됩니다.

자세한 명령어는 BLC 프로토콜 자료의 "3.가감속 속도제어 (송신)"을 참고하시면 됩니다.

dydwo92 commented 4 years ago

아 속도를 더 빠르게 한다고 하면, 현재 0.1초 가속이 제일 빠른 셋업입니다. 만약 속도가 빨라야 한다면 기어박스의 기어비를 낮추는 수밖에 없을듯 합니다. ㅠㅠ

dae416 commented 4 years ago

드라이버 자체 속도는 0.1초보다 응답이 빠른것 같은데, 속도를 올리는 것이 아예 불가능한가요? ㅜㅜ

BLC 드라이버 프로토콜에 속도제어기 모드도 있던데,

image

PID 계수를 조절하면 속도가 좀더 빨라질 수 있는지 궁금합니다. 그리고 해당 소스코드도 제공해주실 수 있는지도 여쭤보고 싶습니다!

감사합니다!

dae416 commented 4 years ago

한가지 더 여쭤봅니다.

최근에 (6월 24일 경) 수정해주신 라이브러리를 사용하여 동일한 코드로 테스트를 해보았는데, 반응속도가 0.15 -> 0.1초 정도로 개선되었습니다 (모터, 코드는 그대로이고, 아두이노 라이브러리만 교체한 상황입니다.).

코드가 똑같은데 반응속도가 빨라질 수 있는건가요?

아마 라이브러리에서 어떤 부분을 개선하셔서 이런 변화가 생겼는지도 궁금합니다.

저에게 모터 안정성이 중요한 요소라서, 모터 상태가 변화된건지, 소프트웨어가 변경된 것인지 알아보고 있어서 여쭤보게 되었습니다.

바쁘실텐데 계속 여줘봐서 죄송합니다. 감사합니다.

dydwo92 commented 4 years ago

혹시 지금 사용하고 계시는 코드를 올려주실수 있나요? 그리고 PID 계수 튜닝하는 예제는 조만간 업로드 하도록 하겠습니다.

dae416 commented 4 years ago

네, 코드올려드립니다. 카메라와 연동 및 속도제어를 위해서 이것저것 수정하여서 보시기 어려울 수도 있습니다.

include "mas001.h"

include "blc200.h"

/*****/ // User Configuration

define DEVICE_ID 0

define SPD_SETTIME 1 // // Caution! Speed set time is (0.1*SPD_SETTIME) second

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);

}

dae416 commented 4 years ago

언제쯤 업로드 가능하실지 궁금합니다!