아두이노프로세싱 프로그래밍

블루투스 RC카용 안전 리튬폴리머 배터리 전원 제작 및 시험

coding art 2019. 11. 27. 14:31
728x90

드론에서 흔히 사용되는 리튬폴리머 배터리는 BLDC 드론 모터를 높은 RPM 으로 구동시킨다. 특히 드론 비행에서 비행 상태를 급격히 변화시키기 위해서는 순간적으로 상당히 큰 전류를 필요로 한다. 리튬폴리머 배터리는 C 값이 상당히 높으며 대체로 10배 이상이다. 리튬 폴리머 배터리 용량이 2000mAH 라면 즉 2 AH 이라면 10C 기준으로 볼 때에 순간 전류 값이 20A가 되며 드론의 변속기 ESC(Electronic Speed Controller) 의 제법 큰 콘덴서를 통해 어느 정도 레귤레이팅(Regulating)하면서 모터에 전류를 공급하게 된다. 리튬폴리머배터리 자체는 10C 이상의 성능이므로 얼마든지 BLDC 모터가 필요로 하는 전력(=전압X전류) 공급이 가능하지만 그렇드라도 드론에서는 ESC가 있기 때문에 지나칠 정도의 BLDC 모터의 전원 공급 요구가 있더라도 레귤레이팅 기능에 의해서 어느 정도 완충이 가능하게 된다.

 

반면에 아두이노 우노 보드를 사용하는 RC카에서는 드론에서처럼 급격한 전력 요구가 있는 것은 아니므로 과잉 전류공급이 이루어질 경우 아두이노 보드와 Adafruit 모터쉴드 회로가 타버릴 위험도 있으므로 주의 깊게 안전한 배선을 연구해야 한다.

 

아래의 아두이노 프로미니 보드의 배선은 Brokking의 오픈소스 아두이노 드론 YMFC 프로젝트 홈페이지에서 참조할 수 있는 밸런싱 로봇의 전원 레귤레이터 회로이다. 아두이노 프로미니 보드에 안정적인 5V 전압을 공급할 수 있도록 2A 수준의 레귤레이터 보드를 사용하고 있다. 한편 밸런싱 로봇의 스테퍼 모터에는 별도로 DRV8825 모터 드라이브 칩을 사용하여 일정량의 전력을 공급하게끔 회로 설계가 되었다.

 

 

 

한편 아두이노 우노 보드의 DC 잭 구부적으로 레귤레이팅을 통해서 5V 3.3V(3V3)를 생성한다. 아울러 레귤레이팅 회로의 최대 전류 소모가 5V 기준 750mA로 알려져 있다. 따라서 이 레귤레이팅 회로가 자리 잡고 있는 직류 DC 잭 구조를 그대로 중간에 사용하면 적절한 보호가 가능해진다. Brokking의 겨우 역류 방지용 다이오드가 설치되어 있는데 전자 기술자의 경우 default 로 설치하지만 지금의 RC카 구조에서는 리튬폴리머 배터리 커넥터 구조에서 + 가 뒤바뀔 염려가 없고 PCB도 없는 상태에서 다이오드를 납땜해 넣기가 곤란하므로 생략하기로 한다. RC카의 경우 5V 750mA 전력으로 보드와 모터쉴드 및 직류 모터를 충분히 구동할 수 있다. 이러한 구조를 바탕으로 드론용 리튬폴리머 배터리를 RC카용으로 제작해 보자.

 

드론용 리튬폴리머 배터리를 RC카용으로 사용하기 위한 전원을 직접 제작해 보자. 전원 잭의 한쪽 배선을 자른 후 암커넥터와 납땜 작업을 하고 안전을 위해서 납땜부위를 수축튜브 처리를 하거나 또는 반드시 절연 테이프 작업을 실시하자.

  

 

아래 사진은 리튬폴리머 배터리를 찍찍이를 사용하여 RC카 바닥면에 부착한 광경이다.

 

 

 

한편 리튬배터리만 해도 + 가 전기적 쇼트를 일으키면 대단히 위험하다. 따라서 실제 RC카에서는 잭은 금속면이 드러나 보이므로 위험할 수 있으므로 반드시 끼워 둔 상태에서 암커넥터와 수커넥터를 연결하거나 분리하는 것이 안전하다. 아래 사진을 참조하자.

 

 

 

 

 

리튬배터리 장착 블루투스 RC카 조종을 관찰해 보자. 전류 공급이 충분하여 코드에서 초음파 장애물 발견 거리를 30cm에서 40cm 으로 바꾸는 것이 벽과 충돌을 방지하기 위해 좋을 듯하다.

https://youtu.be/Ueoh9CtBCT8

 

 

//RCCAR_BT_ULTRASONIC_LiPo_01
#define ECHO 2
#define TRIG 13

#include <AFMotor.h>
AF_DCMotor motor1(3);
AF_DCMotor motor2(4);
int mspd = 160;
char command;

void setup() {      
  Serial.begin(9600);
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
  Stop();
  delay(11000);
}

void loop()  {
        digitalWrite(TRIG,HIGH);   //send Pulse
        delayMicroseconds(10);
        digitalWrite(TRIG,LOW); 
        int us = pulseIn(ECHO,HIGH);    //get return time
        int cm = us/58;
        Serial.print("cm : ");
        Serial.println(cm);

        if( cm < 40 ) {
          Stop();
          delay(100);
        }
              
 if(Serial.available() > 0){
    command = Serial.read();
//     if( command == 'F') {
     if( command == 'G' || command == 'g' || command == 'F') {
      forward();
      delay(50);
     }

//     if( command == 'B') {
     if( command == 'B' || command == 'b' || command == 'BK') {
      back();
      delay(50);
     }

//     if( command == 'L') {
     if( command == 'L' || command == 'l' || command == 'LA') {
      left();
      delay(50);
     }

//     if( command == 'R') {
     if( command == 'R' || command == 'r' || command == 'h') {
      right();
      delay(50);
     }

//     if( command == 'S') {
     if( command == 'S' || command == 's' || command == 'st') {
      Stop();
      delay(50);
     }
 }
}

void forward()  {
  motor1.setSpeed(mspd); //Define maximum velocity
  motor1.run(FORWARD); //rotate the motor clockwise
  motor2.setSpeed(mspd); //Define maximum velocity
  motor2.run(FORWARD); //rotate the motor clockwise
}

void back()  {
  motor1.setSpeed(mspd);
  motor1.run(BACKWARD); //rotate the motor counterclockwise
  motor2.setSpeed(mspd);
  motor2.run(BACKWARD); //rotate the motor counterclockwise
}

void left()  {
  motor1.setSpeed(mspd); //Define maximum velocity
  motor1.run(FORWARD); //rotate the motor clockwise
  motor2.setSpeed(0);
  motor2.run(RELEASE); //turn motor2 off
}

void right()  {
  motor1.setSpeed(0);
  motor1.run(RELEASE); //turn motor1 off
  motor2.setSpeed(mspd); //Define maximum velocity
  motor2.run(FORWARD); //rotate the motor clockwise
}

void Stop()  {
  motor1.setSpeed(0);
  motor1.run(RELEASE); //turn motor1 off
  motor2.setSpeed(0);
  motor2.run(RELEASE); //turn motor2 off
}

//끝