프로그래밍/하드웨어

[Arduino] L293D를 이용한 DC 모터(DC Motor) 양방향 제어

당근천국 2014. 12. 15. 15:00

'L293D'는 스테핑모터를 제어할 때 쓰던 칩입니다.

(참고 : [Arduino] L293D칩을 이용한 유니폴라 스테핑 모터(unipolar stepping motor) 제어)

DC모터의 양방향 제어를 할때도 사용이 가능합니다.

 

(참고 : 디바이스 마트 - L293D )

 

'L293B'을 이용해도 됩니다.

(참고 : 디바이스 마트 - L293B )

 

모터는 'KR-300'와 'MDN-4RA3ETA' 사용 했습니다.

(참고 : 디바이스 마트 - 서보형 DC모터 (KR-300), MDN-4RA3ETA )

외부전원을 이용할 때는 'KR-300'를 아두이노 전원을 이용할 때는 'MDN-4RA3ETA'를 사용합니다.

 

 

1. 테스트 해보기

일단 아두이노가 아닌 손으로 배선을 수정하여 동작을 확인하기 위한 구성을 합니다.

 

1-1. 보드 구성

보드 구성은 제가 참고한 사이트와 똑같이 해줍니다.

(참고 : adafruit learning system - Arduino Lesson 15. DC Motor Reversing - An Experiment )

DCMotor_002_001.fzz
다운로드

 

1-2. 테스트 해보기

펌웨어는 올리지 말고 바로 아두이노를 연결하여 모터가 돌아가는지 확인합니다.

 

 

소리를 들어보면 모터가 동작함을 알 수 있습니다.

 

이제 보라색선을 GND로 옮겨 모터를 멈추게 합시다.

 

각 선은 다음과 같습니다.

보라색선 : Enable

노란색선 : In1

주황색선 : In2

입니다.

 

'Enable'은 모터의 동작 여부를 결정합니다.

전원이 인가되면 '참(True)'가 되어 모터가 동작할 수 있는 상황이 됩니다.

GND가 인가되면 '거짓(False)'가 되어 모터가 동작하지 않습니다.

그리고 'Enable'을 통해 DC모터의 속도를 조절할 수 있습니다.

 

'In1', 'In2'는 한쪽은 '참(True)', 한쪽은 '거짓(False)'일 때만 모터가 동작합니다.

단지 둘 다 '참(True)'이거나 '거짓(False)'이라면 동작하지 않습니다.

그리고 'In1'이 '참(True)'이라면 정방향 'In2'가 '참(True)'이라면 역방향으로 모터가 동작합니다.

 

표로 보자면 다음과 같습니다.

Enable(보라색) In1(노란색) In2(주황색) 결과
True True True 멈춤
True True False 정방향
True False True 역방향
True False False 멈춤

 

'Enable'가 'False'일때는 모터가 동작 하지 않습니다.

 

 

2. 양방향 제어

위에서 살펴봤다시피 DC모터를 양방향 제어를 하기 위해서는 데이터 선이 2개 필요합니다.

 

2-1. 보드 구성

이제 'Enable', 'In1', 'In2'를 각각 11번, 10번, 9번에 연결하고 아두이노로 제어해봅시다.

DCMotor_002_002.fzz
다운로드

 

 

2-2. 펌웨어 작성

이제 'Enable'은 항상 'True'로 두고 'In1'과 'In2'는 시리얼 모니터에서 보낸 데이터에 따라서 동작하도록 작성해 봅시다.

int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;

int nSwitch = 0;
boolean bReverse = false;

int nSpeed = 70;
String sMeg = "Switch : ";


void setup()
{
  Serial.begin(9600);
  pinMode(enablePin, OUTPUT);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
}
 
void loop()
{
  
  if(Serial.available())
  {
    nSwitch = Serial.read();
  }
  
  if( nSwitch == '1')
  {
    bReverse = true;
  }
  else
  {
    bReverse = false;
  }

  setMotor(nSpeed, bReverse);
  Serial.println(sMeg + int(nSwitch) + ", Speed : " + int(nSpeed));
  delay(1000);
}
 
void setMotor(int nSpeed, boolean bReverse)
{
  analogWrite(enablePin, nSpeed);
  digitalWrite(in1Pin, ! bReverse);
  digitalWrite(in2Pin, bReverse);
}

 

 

업로드가 끝나면 모터가 돌기 시작합니다.

시리얼 모니터를 열고 '1'나 '0'을 입력하여 모터의 동작 방향을 바꿔봅시다.

동영상 중간중간 모터가 멈칫하는 순간이 있는데 이때가 반향전환을 할 때입니다.

 

 

3. 가변저항(potentiometer)을 이용하여 속도 조절 하기

가변저항의 값을 읽어 DC모터의 속도를 조절해 봅시다.

 

3-1. 보드 구성

이 부분은 이전 포스팅과 같습니다.

(참고 : [Arduino] ULN2004(ULN2003)를 이용한 DC 모터(DC Motor) 제어 )

DCMotor_002_003.fzz
다운로드

 

가변저항의 전원과 접지는 반대로 해도 상관없습니다.

(값이 반대로 나올 뿐이죠 ㅎ)

 

3-2. 펌웨어 작성

이제 가변저항의 값을 읽어 모터의 속도에 적용해 봅시다.

int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int re = A0;

int nSwitch = 0;
boolean bReverse = false;

int nSpeed = 70;
String sMeg = "Switch : ";


void setup()
{
  Serial.begin(9600);
  pinMode(enablePin, OUTPUT);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
}
 
void loop()
{
  
  if(Serial.available())
  {
    nSwitch = Serial.read();
  }
  
  //가변저항 값을 읽는다.
  nSpeed = analogRead(re) / 4;

  if( nSwitch == '1')
  {
    bReverse = true;
  }
  else
  {
    bReverse = false;
  }

  setMotor(nSpeed, bReverse);
  Serial.println(sMeg + int(nSwitch) + ", Speed : " + int(nSpeed));
  delay(1000);
}
 
void setMotor(int nSpeed, boolean bReverse)
{
  analogWrite(enablePin, nSpeed);
  digitalWrite(in1Pin, ! bReverse);
  digitalWrite(in2Pin, bReverse);
}

 

 

이제 가변저항을 돌리면 속도가 조절됩니다.

화면에 보이도록 속도 조절하느냐 고생했습니다 ㅜㅡ

 

 

4. 외부 전원 사용하기

이것도 이전 글과 같습니다 ㅎ

DCMotor_002_004.fzz
다운로드

 

코드는 똑같습니다.

 

 

마무리

원래는 ULN2004칩을 가지고 양방향 제어를 해보려고 했는데 제가 전자 쪽은 잘 몰라서 모르겠네요 ㅡ.-;;;

하려면 할 수는 있을 것 같은데...

어찌됐건  L293B칩을 이용한다면 많이 비싸진 않기 때문에 상관없을 것 같기도 하고 애매합니다. ㅡ,.ㅜ