본문 바로가기
프로젝트/DIY 드론 만들기

DIY드론 프로젝트 - BLDC모터 제어

by 조원일 2020. 4. 25.
728x90

이번 시간에는 BLDC모터를 제어해보겠습니다.

모터를 제어하기전 캘리브레이션이라는것을 해주어야 하는데

제가 사용하는 ESC같은경우 맨 처음 한번만 캘리브레이션을 해주면 되서

캘리브레이션 모드와 기본 작동 모드 코드를 작성해보겠습니다.

 

캘리브레이션이란?

만약 500만큼 회전을 주고 싶은데 최소값이 100, 최대값이 600으로 되어있는 ESC는 빠른 속도로 돌게 된다.

하지만 같은 500이더라도 최소값이 400, 최대값이 1500으로 되어있는 ESC는 느리게 회전하게 된다.

따라서 캘리브레이션을 통해 일정하게 다시 설정해주는 과정이다.

쉽게 생각해서 ESC에게 A부터 B값 사이에서 제어를 하겠다고 선언하는 것이다.

 

 

#include <Servo.h>

// 하나씩 주석을 해제해서 사용하세요
#define Mode1 // 캘리브레이션 모드
//#define Mode2 // 주행 모드

#define Button      2

#define Motor_1     4
#define Motor_2     5
#define Motor_3     6
#define Motor_4     7

#define Buzzer      39
/*
 * 캘리 브레이션 모드에서 최대 값과 최소값을 찾아야 합니다.(보통 1000~2000이 적당)
 * 
 * Speed값을 증가시키면서
 * 돌아가지 않는 가장 큰값을 MIN에 입력
 * 더이상 회전 속도가 증가하지 않는 가장 작은 값을 MAX에 입력
 * 
 * 저는 1000~1700으로 했습니다.
 * 참고로 저는 Hobbywing ESC과 E-MAX 2213-935kV를 사용하고 있습니다.
 */
#define MIN_MOTOR_SPEED             544
#define MAX_MOTOR_SPEED             2400

Servo Motor1;
Servo Motor2;
Servo Motor3;
Servo Motor4;

char c;
int Speed;

void setup() {
    Serial.begin(9600);

    pinMode(39, OUTPUT);
    pinMode(Button, INPUT_PULLUP);
    
    Serial.println("5");
    delay(1000);
    Serial.println("4");
    delay(1000);
    Serial.println("3");
    delay(1000);
    Serial.println("2");
    delay(1000);
    Serial.println("1");
    delay(1000);

#ifdef Mode1
    Serial.println("ESC캘리브레이션...");
    Speed = MIN_MOTOR_SPEED;
    Motor1.attach(Motor_1, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);
    Motor2.attach(Motor_2, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);
    Motor3.attach(Motor_3, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);
    Motor4.attach(Motor_4, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);

    Motor1.writeMicroseconds(MAX_MOTOR_SPEED);
    Motor2.writeMicroseconds(MAX_MOTOR_SPEED);
    Motor3.writeMicroseconds(MAX_MOTOR_SPEED);
    Motor4.writeMicroseconds(MAX_MOTOR_SPEED);
    Serial.println("최고값 입력 완료");
    Serial.println("배터리를 연결해 주세요");
    Serial.println("연결후 소리가 나면 버튼을 눌러주세요");
    while(digitalRead(Button) != 0);

    Motor1.writeMicroseconds(MIN_MOTOR_SPEED);
    Motor2.writeMicroseconds(MIN_MOTOR_SPEED);
    Motor3.writeMicroseconds(MIN_MOTOR_SPEED);
    Motor4.writeMicroseconds(MIN_MOTOR_SPEED);
    Serial.println("최소값 입력 완료");
    Serial.println("메인 부저가 울릴때 까지 기다려 주세요");
    
    delay(6000);

    tone(Buzzer, 3000, 500);
    Serial.println("비행 시작!!");
#endif

#ifdef Mode2
    Serial.println("조종 모드");
    Speed = MIN_MOTOR_SPEED;
    Motor1.attach(Motor_1, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);
    Motor2.attach(Motor_2, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);
    Motor3.attach(Motor_3, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);
    Motor4.attach(Motor_4, MIN_MOTOR_SPEED, MAX_MOTOR_SPEED);

    Motor1.writeMicroseconds(MIN_MOTOR_SPEED);
    Motor2.writeMicroseconds(MIN_MOTOR_SPEED);
    Motor3.writeMicroseconds(MIN_MOTOR_SPEED);
    Motor4.writeMicroseconds(MIN_MOTOR_SPEED);

    Serial.println("최소값 입력 완료");
    Serial.println("배터리를 연결해주세요");
    Serial.println("소리가 나면 버튼을 누르고 메인 부저가 울릴때까지 기다려 주세요.");
    while(digitalRead(Button) != 0);
    
    delay(6000);

    tone(Buzzer, 3000, 500);
    Serial.println("비행 시작!!");
#endif

    Serial.println(Speed);
}

void loop() {
    if(Serial.available()) {
        c = Serial.read();
   
        if(c == 'a') {
            Speed += 20;
            if(Speed > MAX_MOTOR_SPEED) Speed = MAX_MOTOR_SPEED;
        }
        if(c == 's') {
            Speed -= 20;
            if(Speed < MIN_MOTOR_SPEED) Speed = MIN_MOTOR_SPEED;
        }

        Motor1.writeMicroseconds(Speed);
        Motor2.writeMicroseconds(Speed);
        Motor3.writeMicroseconds(Speed);
        Motor4.writeMicroseconds(Speed);
        
        Serial.println(Speed);
    }
}

 

코드를 보면 Mode1은 캘리브레이션 모드이고 Mode2는 기본 조종 모드입니다.

캘리브레이션을 하는 방법은 다음과 같다.

1. 최대값을 넣어 준다.
2. 배터리를 연결한다.
3. "삐-삐-" 소리가 나면 해당 값이 최대값으로 설정되었다는 것을 의미한다.
4. 최소값을 넣어준다.
5. 배터리 셀의 양을 확인하기위해 몇번의 "삐-"소리가 울린다.
6. 긴"삐-" 소리가 울리고 더이상 소리가 나지 않으면 캘리브레이션이 완료된 것이다.

 

하지만 이미 코드로 작성이 되어있기 때문에 Mode1의 주석을 해제하고

시리얼 모니터에 나오는 설명대로 따라하면 됩니다.

 

캘리브레이션이 중요하지만 매번 작동할때마다 할수는 없다.

그래서 대부분 ESC같은 경우 캘리브레이션을 한번만하면 전원을 껐다 켜도 최대, 최소값을 기억을 합니다.

 

Mode1에서 가장 중요한 작업은 사용하는 ESC의 최대값과 최소값을 확인하는 것입니다.

 

 

이제 기본 조종 모드를 보면

캘리브레이션을 통해 얻은 최소값을 입력하고 

#define MIN_MOTOR_SPEED             544
#define MAX_MOTOR_SPEED             2400

이부분은 Servo.h에 정의되어있는 기본 값이다.

따라서 최소값부터 천천히 증가시키면서

움직이지 않는 가장큰 값을 찾아 MIN에 넣어 주고

더이상 빨라지지 않는 최소의 값을 찾아 MAX에 넣어주면 됩니다.

 

"544 ~ 최소값의 값"과 "최대값 ~ 2400"의 값은 모터를 제어할때 의미 없는 값이기 때문에

최대값과 최소값을 찾아주어야 합니다.

 

 

이제 캘리브레이션이 끝났으면 Mode1를 주석처리하고 Mode2를 해제하고

시리얼 모니터에 나오는 설명대로 따라 하면 모터를 작동시킬수 있습니다.

ESC_Test.zip
0.00MB