아두이노와 모터 드라이버를 이용한 모터구동
본 포스팅에서는 DC 모터, Servo 모터 및 BLDC모터를 아두이노와 모터드라이버를 이용하여 구동하는 예제를 다루도록 하겠습니다.
우선 DC 모터는 L293B IC를 이용하여 구동해보도록 할게요.
구성은 다음 그림과 같이 하면 되겠어요.
필요한 준비물은
아두이노 1ea
모터 1ea
L293B IC
빵판
점퍼와이어
EN
|
IN1
|
IN2
|
기능
|
HIGH
|
LOW
|
HIGH
|
시계방향회전
|
HIGH
|
HIGH
|
LOW
|
반시계방향회전
|
HIGH
|
LOW
|
LOW
|
정지
|
HIGH
|
HIGH
|
HIGH
|
정지
|
LOW
|
무시
|
무시
|
정지
|
소스코드는 다음과 같아요.
const int in1Pin=5;
const int in2Pin=4;
void setup(){
Serial.begin(9600);
pinMode(in1Pin,
OUTPUT);
pinMode(in2Pin,
OUTPUT);
Serial.println("+
- to direction, any other key stops motor");
}
void loop(){
if(Serial.available()){
char ch =Serial.read();
if (ch
=='+')
{
Serial.println("CW");
digitalWrite(in1Pin,
LOW);
digitalWrite(in2Pin,
HIGH);
}
else if (ch
=='-')
{Serial.println("CCW");
digitalWrite(in1Pin,
HIGH);
digitalWrite(in2Pin,
LOW);
}
else
{
Serial.print("stop
motor");
digitalWrite(in1Pin,
LOW);
digitalWrite(in2Pin,
LOW);
}
}
}
위 내용을 동영상으로 확인해 보아요~
좀 더 비싼 모터 드라이버...
http://blog.naver.com/benzydad/220148285604
좀 더 더 비싼 모터 드라이버
서보모터 구동
서보 모터의 구조는 다음과 같이 DC 모터, 가변저항, 제어회로 및 기어박스로 구성되어 있습니다.
<그림 1> 서보모터
첫번째 실험은 서보를 0~180도 구간으로 왕복운동을 시키는 거에요.
하드웨어는 다음과 같이 설치하구요. 서보의 신호선(노란색 선)은 PWM입력을 받으므로 ~ 표시가 된 digital pin에 연결해야 합니다. 여기서는 ~9번에 연결했어요.
아두이노 소스 코드는 다음과 같습니다.
#include <Servo.h> // Servo.h 라이브러리 불러옴
Servo myservo; // myservo라는 이름으로 servo 지정
int angle=0; // angle 이라는 정수를 0으로 초기화 함
void setup(){
myservo.attach(9); // 서보를 9번 핀에 연결함
}
void loop(){
for(angle=0; angle<180; angle +=1) // 0~180까지 1도씩 증가
{
myservo.write(angle); // 계산된 각도를 servo에 입력
delay(20);
}
for(angle=180; angle>=1; angle-=1) //180~1까지 1도씩 감소
{myservo.write(angle); // 계산된 각도를 servo에 입력
delay(20);
}
}
이번에는 가변 저항의 움직임과 연동해서 움직이는 예제를 볼게요.
위의 하드웨어에 포텐셔미터 하나를 추가했고 중간핀을 아날로그 0번 핀에 연결했어요.
#include <Servo.h> // Servo.h 라이브러리 포함
Servo myservo;
int potpin = 0; // potpin(포텐셔미터 핀)을 아날로그 0으로 지정함
int val;
// val 이라는 정수를 선언함
void setup()
{
myservo.attach(9);
}
void loop()
{
val = analogRead(potpin); /* 포텐셔미터의 값을 아날로그 0번으로 읽어들여 val이라는 정수로 저장함*/
val = map(val, 0, 1023, 0, 179); /*0~1023의 포텐셔미터 값을 0~179로 매핑함 */
myservo.write(val);
delay(15);
}
여기서 0~1023의 범위가 어떻게 나왔는지 궁굼하죠?
아두이노에서 아날로그값 읽기는 ADC를 통해서 구현합니다. 아두이노에 내장된 ADC의 분해능은 2^10 = 1024 단계입니다. 그래서 0~1023이 되는거죠.
<그림 1>에서 본 PWM파형을 실제로 보면 다음과 같아요.
PWM에 대한 이야기는 다른 포스팅에서 좀 더 자세하게 다루어 보도록 할게요.
BLDC모터는 DC모터와 다르게 브러쉬가 없어요. 그래서 BrushLess DC 모터인거죠. DC모터보다 수명이 길다는 장점이 있어요.
또 한가지는 DC모터는 2가닥의 선을 가지고 있는데 BLDC는 3가닥의 선을 가지고 있어요.
이 모터는 좀 복잡한 드라이버를 사용합니다.
L293B 같은 드라이버는 저항, 다이오드, 트랜지스터로 이루어진 것과 달리 위의 드라이버는 마이크로프로세서를 포함하고 있어요. 위 사진에서 다리 많이 달린 까만 것이 마이크로프로세서인데 많은 드라이버들이 ATMega8과 같은 8bit 마이크로프로세서를 사용합니다.
그만큼 제어가 복잡하다는 이야기겠죠?
좌측의 굵은 빨간선과 검정선은 주 전원선으로 이 ESC는 2S~4S Li-Po 입력(5.4~14.8VDC)을 받네요.
그 아래의 주,적,갈색 3선은 RC 수신기와 연결하는 선인데 적, 갈색은 ESC에서 생성한 5VDC를 수신기로 보내주는 역할을 하고 오렌지색 선은 수신기에서 생성한 PWM신호를 ESC로 보내는 선입니다.
우측의 검정색 3선은 BLDC 모터의 3선과 연결되는 선으로 구분없이 아무렇게나 연결하고 만약 모터가 원하는 방향과 반대로 돈다면 3선중 아무 2선을 분리해서 바꾸어 연결하면 방향이 바뀐답니다.