[아두이노 자작 쿼드콥터] 변속기와 아두이노 신호

Posted by Doony
2015. 8. 25. 14:38 아두이노 드론 프로젝트

아두이노 신호를 통해 변속기 스로틀 셋팅을 하는 방법을 알아보도록 하겠습니다. 보통은 조종기와, 그에 딸린 수신기를 바로 장착하여 스로틀 셋팅을 비교적 쉽게 할 수 있도록 되어있는데요.

저희는 조종기와 송수신기 따로 없이, 바로 아두이노를 통해 변속기에 신호를 주는 방법을 택했습니다.


다시한번 저희가 선택한 아이템들에 대해 설명드리자면..


변속기 - Skywalker Quattro 25a X 4

bldc모터 - 잘 기억이 안남

배터리 - 11.1V / 2800mAh

조종기 - 아두이노 우노와 블루투스 모듈 (이는 추후 라즈베리파이로 변경할 예정)


네 이렇습니다.


각 변속기마다 세팅하는 방법이 다 있는 것으로 알고 있는데, 스로틀 신호 주는 부분에서는 대부분 공통인 듯 합니다.

아두이노를 통해 조종기를 대신하여 스로틀 허브를 통해 변속기에 신호를 주어야 하는데, 이 신호가 거의 공통인 듯 하더라고요.


따라서 변속기마다 다를 수 있는 셋팅법 자체가 아니라, 신호를 어떻게 주는지 아두이노 코드의 관점에서 포스팅을 해볼게요.


바로 결론부터 말씀드리면, 신호는 PWM 신호로 들어가면 됩니다. 원래 PWM 신호라는 것은, 전압의 세기를 조절하기 위해 사용되는 방법 중 하나인데요. 조종기에서도 비슷한 방식으로, 즉 전압 차이를 통해 신호를 주고 받기 때문에 아두이노에서도 동일하게 해볼 수 있겠습니다.

duty cycle이라고 해서, 신호가 어떤 파형으로 들어가는 지에 대해 구체적으로 정해볼 수 있는데요.

제가 막 그림을 그려보자면..


이게 정지 상태, 즉 모터가 돌아가지 않을 때 조종기에서 주는 신호라고 보시면 됩니다. (조종기 = 아두이노)

그냥 0V를 쏴주는게 아니라, 1ms/20ms 비율 정도로는 전압이 흐르는 거라고 보시면 되겠네요. 아두이노의 경우는 5V가 최대치니까 이를 통해 계산해보면 전압도 구할 수 있겠네요.



이게 모터가 최고치로 돌아갈 때의 PWM 신호입니다.

차이를 아시겠나요? 정지는 1ms/20ms의 듀티를 가진다면, 최고 속도일때는 2ms/20ms 의 듀티를 가집니다. 두배인 셈이지요.



저희가 가진 변속기의 경우, 최고 속도일 때와 정지 상태일 때, 이 두가지 PWM 신호만을 가지고 모든 셋업을 할 수 있도록 되어 있었습니다.

그래서 아두이노 코드도 간단하게 짜보았는데요.


아두이노 변속기 코드는 아래와 같습니다.






int r=0;

void setup() {

  pinMode(6, OUTPUT);

  digitalWrite(6, LOW);

  Serial.begin(9600);

}


void loop() {

 

  if (r==1){

    digitalWrite(6, HIGH);

    delay(1);

    digitalWrite(6,LOW);

    delay(19);

  }

  if (r==2){

    digitalWrite(6,HIGH);

    delay(2);

    digitalWrite(6, LOW);

    delay(18);

  }

  Serial.println(r);


}


void serialEvent() 

{

  while(Serial.available()){

    r=Serial.parseInt(); 

  }    

}





먼저 조금씩 살펴보도록 하죠. 저희는 원하는대로, 실제 조종기에서 스로틀을 위아래로 조정하는 것처럼 아두이노 신호를 조작할 필요가 있었습니다. 그래서 시리얼 통신을 통해, 제가 입력한 값으로 위 아래를 표현해보았는데요.


Serial.parseInt() 는 시리얼 통신으로 제가 입력한 값을 정수 형태로 받아들이라는 함수입니다.

이를 통해 제가 입력한 값을 1, 2로 나누어 케이스를 두가지 만든거죠.

그래서 loop문 안에 그 두가지에 해당하는 경우가 써있습니다.


r=1 일때는 정지 상태로, 간단하게 delay를 써서 PWM 신호를 만들었습니다.

r=2 일때는 최고속 상태로, 역시 delay를 써서 PWM 신호를 만들었습니다.


모두 6번 핀을 통해 신호를 보내는 방식입니다. (아두이노 우노에서 6번핀은 PWM신호를 지원하는데, analogWrite 함수를 통해서 해당 duty ratio에 맞게 해본 결과, 잘 되지 않았습니다. 왜 그런지는 좀 더 연구해봐야 알듯)


변속기 셋팅 정도 할 때는 애초에 코드가 너무 간단하기 때문에, 그냥 delay를 사용해도 무방하다고 합니다. 이후 pid 제어와 같이 코드가 길어질 경우에는 되도록 delay를 사용하지 않고, 인터럽트를 쓰는 편이 좋지 않을까 싶네요.




이렇게 시리얼 통신으로 1 또는 2 값 입력을 통해 조종기가 위아래를 향하는 것과 똑같은 결과를 만들어볼 수 있었습니다. 결과적으로 변속기 셋팅도 완벽하게 할 수 있었죠. (혹시 이 변속기에 대해 더 궁금하시다면 따로 댓글 부탁드립니다.)



이제 아두이노를 통해 정지 상태와, 최고속도를 구현하는 법을 배웠네요.

그렇다면, 중간 속도는 어떻게 낼까요?


PWM 신호로 모두 결정이 됩니다. 1ms보단 길고 2ms보단 짧으면 중간 속도로 날겠지요?
저는 변속기 셋팅을 위해서 시리얼 통신 값을 1 혹은 2만 의미가 있게 했지만, 아예 받는 값 자체를 duty라는 변수로 새로 두고 이를 통해 delay 내부에 사용한다면, 원하는 중간 속도를 낼 수 있을 것입니다.




이제 코드에 대해 알아보았으니, 어떻게 전선들을 연결했는지 알아볼까요?

이건 사진을 못찍어둬서.. 다음 포스팅에서 하는 것으로 !!!

맛보기로 영상 하나 투척합니다.





엄청난 추력입니다. 혹시나 안잡아놓고 돌렸다간 후회하실 겁니다.. 바로 날아가거든요. 손으로 잡고 있는데도 붕 뜨네요.


암튼, 다음포스팅에서 계속됩니다!