프로그래밍/하드웨어

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

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

스테핑 모터 제어에 사용한 ULN2004(ULN2003)칩은 DC모터를 단순하게 돌릴 때도 사용할 수 있습니다.

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

여기서 '단순하게'라는 의미는 역방향으로 돌리는 것이 안 되기 때문입니다.

 

가격은 400원 정도 합니다.
(참고 : 동신전자 - ULN2004A )

 

모터는 KR-300를 사용 했습니다.

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

이 모터가 사용하는 전류가 '160[mA] +/- 40[mA]'이기 때문에 아두이노가 공급하는 '40mA'보다 많기 때문에 아두이노보드가 죽는 현상이 있습니다 ㅡ,.ㅡ;;;

(잘못하면 아두이노가 망가집니다 ㅡ.-;;)

저는 편해서 그냥 이걸로 테스트 한건데 '4. 외부 전원 사용하기'을 보고 외부전원으로 사용할 것이 아니라면 주의가 필요합니다.

 

1. DC모터 동작 시키기

DC모터는 전원만 공급되면 동작을 하므로 사용하기 전에 5v와 GND에 연결하여 모터가 동작하는지 확인하고 진행해도 됩니다.

 

1-1. 보드구성

배선은 아래와 같이 합니다.

(참고 : Funny Electronics - Control DC Motor Using Arduino and ULN2803)

 

DCMotor_001.fzz
다운로드

 

1-2. 펌웨어 작성

일단 모터를 돌리기 위해서 'PWM'를 사용합니다.

이것은 나중에 모터의 속도를 조절하기 위해 그렇습니다.

 

DC모터를 동작 시킬 때 'digitalWrite'와 'analogWrite'를 둘 다 사용 가능합니다.

이번 예제는 DC모터를 동작시키는 목적이므로 'digitalWrite'를 사용합니다.

 

'digitalWrite'를 사용하면 속도 조절을 할 수 없습니다.

int motor = 11;

void setup() 
{
  pinMode(motor, OUTPUT);
}

void loop() 
{
  digitalWrite(motor, HIGH);
  delay(1000);   
  digitalWrite(motor, LOW);  
  delay(1000);
}

 

 

펌웨어를 올리면 바로 모터가 돌기 시작합니다.

 

 

2. DC 모터 아두이노에서 제어하기

이제 아두이노에서 신호를 주어 DC모터를 동작시켜 보겠습니다.

 

보드는 그래로 두고 아래와 같이 코드를 변경합니다.

int motor = 11;
int intSw = 0;

void setup()  
{
  Serial.begin(9600);
  pinMode(motor, OUTPUT);
} 

void loop()  
{
  if(Serial.available())
  {
    intSw = Serial.read();
  }

  if( intSw == '1')
  {
    analogWrite(motor, 255);
  }
  else
  {
    analogWrite(motor, 0);
  }

  Serial.println(intSw);
  delay(1000);
}

 

 

시리얼 모니터를 열고 '1'을 입력하면 모터가 동작하고 다른 값을 입력하면 멈춥니다.

 

 

 

3. DC모터 속도 조절하기

이제 가변저항(potentiometer)의 값을 읽은 후 이 값으로 DC모터의 속도를 조절해 봅시다.

 

3-1. 보드구성

'1.'에서 한 배선을 그대로 두고 가변저항만 추가합니다.

DCMotor_002.fzz
다운로드

 

가변저항은 'A0'핀에 연결해줍니다.

생각해보니 가변저항 방향을 바꿔서 설치했어야 하는데....쓸때없이 복잡해 보이네요 ㅡ.-;;;

 

3-2. 펌웨어 작성

기존 코드에 'A0'값을 읽어서 DC모터 동작에 사용하도록 하겠습니다.

int motor = 11;
int re = A0;

String sMeg = "Switch : ";

int intSw = 0;
int nSpeed = 0;

void setup()  
{
  Serial.begin(9600);
  pinMode(motor, OUTPUT);
} 

void loop()  
{
  if(Serial.available())
  {
    intSw = Serial.read();
  }
  
  //가변저항 값을 읽는다.
  nSpeed = analogRead(re) / 4;

  if( intSw == '1')
  {
    analogWrite(motor, nSpeed);
  }
  else
  {
    analogWrite(motor, 0);
  }

  Serial.println(sMeg + int(intSw) + ", Speed : " + int(nSpeed)); 
  delay(1000);
}

 

 

이제 코드를 업로드하고 동작을 확인해 봅시다.

시리얼 모니터를 열고 '1'을 입력하고 가변저항을 돌리면 DC모터의 속도가 달라집니다.

 

 

 

4. 외부 전원 사용하기

배선은 아래와 같습니다.

DCMotor_003.fzz
다운로드

 

코드는 똑같고 동작은 '3.'과 동일합니다.

 

마무리

이전부터 테스트하기 쉽게 하려고 아두이노의 전원만으로 모터를 동작 시켰는데요....

그러다보니 사람들이 아두이노전원만 가지고 되는지 알고 사용하거나 외부전원을 사용하는 방법을 문의하시는 분들이 많아 이제는 외부전원을 사용하는 방법도 넣었습니다.

이전 글들도 조만간 작업해야죠 ㅎㅎ