본문 바로가기
Developer/Drone DIY

아두이노 드론 | bldc 모터 동작하기

by Doony 2015. 11. 12.

아두이노 드론 | bldc 모터 동작하기


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

시작하기에 앞서, 

혹시 아두이노 쿼드콥터에 대한 정보를 찾으시는 분들은 


아라미르 드론 프로젝트 http://blog.naver.com/yngneers 


을 참고하시길 바랍니다. 아두이노 쿼드콥터 pid 정보 및 코드를 확인하실 수 있도록 글 올려놓았습니다.




그리고 궁금증이 있으신 분들은 댓글 남겨주시거나, 


카카오톡 아이디: yngneers 


를 친추해주시고 질문해주시면 되겠습니다!

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%





팀으로 진행하는 아라미르 드론 프로젝트 외에, 나도 개인적으로 하나 만들어보고 싶은 게 있어 진행하게 된 프로젝트..

최근 유행처럼 번지는 DIY 드론, 그리고 쿼드콥터가 주를 이루고 있다.


얼마전에 무슨 움짤을 봤는데, 종이비행기처럼 생겼는데 프로펠러가 달려서 원격으로 조종이 가능한 물체였다.

영감을 받아서 나도 만들어보고 싶어 이것저것 조금씩 구입했다.


자세한 컨셉에 대한 이야기는 다음으로 미루도록 하고, 오늘은 bldc 모터를 동작시키는 법에 대해 알아보자.


먼저 당연히 모터를 구동시키려면 모터가 필요하다.




레이븐퓨리에서 내가 구매한 모터. 정확한 모델명은 기억 안난다능.. 현재 진행하고있는 아두이노 쿼드콥터 프로젝트와 동일한 모터여서 그냥 구매했다.



이 녀석은 모터 드라이브 같은 녀석. 변속기다. esc라고도 불린다.

20A 까지 감당 가능하다고 한다.


변속기마다 bec가 지원되는게 있고 안되는게 있는데, 대충 찾아보니 이러하다.

모든 드론에는 일종의 컴퓨터가 필요하다. 나 같은 경우, 그걸 아두이노로 하고 있는 것이고. 즉 아두이노에 전원을 공급해줄 필요가 있다는 점인데, 배터리에서 아두이노로 전원을 공급해줄 수 있도록 변속기에서 따로 배선이 하나 나와있는 경우가 있다. 5V로 전압을 낮춰서 안정적으로 공급해준다고 했었나...


아무튼 그런식으로 아두이노에도 전원을 공급해줄 수 있는 것을 BEC라고 한다고 한다. 위 변속기에는 no bec, 즉 전원을 따로 분배해주는 장치가 없다는 것. 고로 아두이노에 전원을 공급하기 위한 별도의 공급장치가 필요하다.



자, 이제 발로 그린 아래의 회로도를 한번 보도록 하자.






음... 정말 발로 그렸지만, 필요한 건 모두 담고 있다. 


모터를 동작시키려면 당연히 배터리가 필요하다. 그 배터리는 변속기에 직접 연결되며, 변속기를 통해 모터가 구동된다.

그렇다면, 모터의 세기.. 즉 회전수는 어떻게 변화시킬 것인가?


쉽게 생각했을 때 조종기로 막 건드리면 당연히 뭔가 변화해야하지 않겠는가?

그런 작업을 아두이노에서 쏴주는 것이고, 변속기가 이런 정보를 받아들여서, 배터리라는 호수에서 적당한 물만큼을 모터로 전달하는 것이다.



자, 그렇다면 위의 회로도를 한번 구현해보도록 하자.




이 녀석은 배터리와 연결될 부분이다. 배터리는 +-가 있으니까 여기도 두개. 오케이? 배터리에 맞는 커넥터가 있으면 좋았을텐데

이미 아라미르 드론 프로젝트에 써먹었기 때문에... 그냥 내가 발로 만들었다.

구멍에 맞는 금속을 구하고, 납땜처리로 대강 구현했다. 얼추 잘 들어맞는다.




이 녀석은 변속기와 모터가 연결된 모습. UVW(?) 3가지 선이 나와있기 때문에 알아서 잘 끼워주면 된다.

참고로 끼우는 순서에 따라 모터가 돌아가는 방향이 달라진다. 따라서 만약 반대 방향으로 돌고 있다면 순서를 대충 바꿔 끼워주면 된다.


bldc모터는 브러쉬가 없는 모터라고 하여, 일반적인 dc 모터와는 조금 다르다. 쉽게 생각하면,

3개의 자석이 둥글게 배치되어 있는데 각각이 차례차례 N극을 띔에 따라 원 가운데 있는 자석이 회전하는 꼴이라고 보면 된다.

브러쉬란, 원래 전류의 방향을 바꿔주기 위해서 있는 건데............... 이런건 몰라도 될 듯 하다.


내가 포스팅하는 이유는, 누구나 DIY를 할 수 있게 하기 위함이니까!!



나는 종이비행기에 모터를 2개 달 생각이다.

당연히 배터리도 병렬식으로 2개로 분리되어야 하기 때문에.. 저렇게 중간에 나눠놓았다. 납땜 경력 1개월 미만이다 보니 저렇게 더럽게 되었다능..



연결한 모습. 배터리와 아두이노를 제외하면, 위에서 발로 그린 회로도와 매우 흡사함을 알 수 있다. 배터리는 접합부에 연결하는 거고

아두이노는 변속기에 하얀선+검은선 부분이 있는데 이 부분과 연결한다. 


어떻게? 하얀선은 아두이노 디지털 핀에, 검은선은 접지로.

내가 썼던 아두이노 코드를 공유한다.


#include <Servo.h>


Servo esc_b; //아두이노로 컨트롤하는 bldc모터의 경우

Servo esc_r; //서보 라이브러리를 통해 쉽게 조작할 수 있다.



int black = 180; //모터로 들어가는 초기값은 180. 즉 최대값.

int red = 180;



void setup() {


  Serial.begin(9600); //시리얼 통신으로 조작한다.

  esc_b.attach(6, 1000, 2000); //이런식으로 서보를 선언해줘야 컨트롤이 가능하다.

  esc_r.attach(7, 1000, 2000); //나는 6번, 7번에 연결했다.


  Serial.setTimeout(50); //아래 parseInt로 값을 받는게 있는데, 이게 기본 딜레이가 1초가 있다. 그걸 50ms로 설정해주는 것. 속도를 빠르게 하기 위함.



  esc_b.write(180); //초기값은 무조건 0!!! esc 캘리브레이션 할 때도 중요하다.

  esc_r.write(180);



}


void loop() {



  esc_b.write(black); //시리얼 통신으로 받은 값을 모터에 넣어주자!

  esc_r.write(red);


  Serial.print(black);

  Serial.print('\t');

  Serial.print(red);

  Serial.println('\t');

}



void serialEvent()

{

  while (Serial.available()) {

    black = Serial.parseInt();

    red = Serial.parseInt();



  }

}




먼저 해야할 일은, esc 캘리브레이션이다. 원래 내가 알기로는 이게 조종기의 throttle 정도를 변속기가 인식하기 위함이라고 알고 있다.

그래서 아라미르 드론 프로젝트에서는 가장 낮을 때(0)와 가장 높을 때(180)를 가지고 했었다.


아무튼 나와 똑같은 걸 가지고 있는 사람은 아래를 따라하면 된다. (하비윙 hobbywing 변속기)


1. 배터리를 분리한 상태에서, 코드를 업로드한다.


2. 모터로 들어가는 값이 모두 180인걸 확인한 뒤(즉, 가장 높은 출력 값), 배터리를 연결한다.


3. 삐삐! 삐삐삐! 삐삐삐삐! 이렇게 소리가 나는데, 첫번째 소리인 삐삐! 나자마자 시리얼 모니터를 통해 모터에 0을 입력한다.


4. 삐 ------------ 익! 하는 소리가 나면 성공이다. 그럼 180과 0사이의 출력치로 모터를 조절하겠다라는 명령이 인식된 것이다.


5. 이제 한 50을 입력해보라. 그럼 모터가 50만큼 돌아가는 걸 볼 수 있다. 180을 입력하면 최대 속도로 돌 것이다.



그러나 매번 모터를 동작시킬때마다 캘리브레이션할 수는 없는 노릇.

고로 아래 코드를 보도록 하자.


#include <Servo.h>


Servo esc_b; //아두이노로 컨트롤하는 bldc모터의 경우

Servo esc_r; //서보 라이브러리를 통해 쉽게 조작할 수 있다.



int black = 0; //모터로 들어가는 초기값은 0. 즉 최소값.

int red = 0;



void setup() {


  Serial.begin(9600); //시리얼 통신으로 조작한다.

  esc_b.attach(6, 1000, 2000); //이런식으로 서보를 선언해줘야 컨트롤이 가능하다.

  esc_r.attach(7, 1000, 2000); //나는 6번, 7번에 연결했다.


  Serial.setTimeout(50); //아래 parseInt로 값을 받는게 있는데, 이게 기본 딜레이가 1초가 있다. 그걸 50ms로 설정해주는 것. 속도를 빠르게 하기 위함.



  esc_b.write(0); //초기값은 무조건 0!!! 캘리브레이션과 다르다.

  esc_r.write(0);



}


void loop() {



  esc_b.write(black); //시리얼 통신으로 받은 값을 모터에 넣어주자!

  esc_r.write(red);


  Serial.print(black);

  Serial.print('\t');

  Serial.print(red);

  Serial.println('\t');

}



void serialEvent()

{

  while (Serial.available()) {

    black = Serial.parseInt();

    red = Serial.parseInt();



  }

}




위위 코드와 차이점이 있다면, 초기값이 다르다는 점이다. 캘리브레이션에서는 180, 즉 최대치가 초기값이고 배터리를 연결했는데

이번에는 초기값을 0으로 둔 코드를 업로드 한 뒤, 배터리를 연결한다.


그 후 시리얼 모니터로 원하는 수치를 입력하면 바로 모터가 돌아갈 것이다.




아무튼, 이렇게 변속기 셋팅과 bldc 모터 동작에 대해 알아보았다. 다음에는? 


음... 쿼드콥터라면 pid 제어가 필수적인데 내 경우에는 종이 비행기기 때문에 오히려 서보모터로 날개를 동작하는 과정이 필요하다.

고로 pid에 대한 포스팅은 따로 없을 듯 하다.


pid가 궁금하신 분들은 글 맨 위에 주소를 써놨으니, 참고하시면 되겠다.


끝!

댓글