스테핑 모터 제어에 사용한 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

 

 

배선을 보면 11번핀이 동작하게 되면 전압이 생기면서 동작을 하는 것이라 'ULN2004'칩이 없어도 동작할 거 같은데.....이상하게 되지 않습니다 ㅡ.-;;;

테스터기로 확인해도 전압이 정상적으로 나오고 있는데 왜 그런지 모르겠습니다.

(아시는 분은 댓글로 ㅎ)

 

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.'과 동일합니다.

 

 

마무리

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

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

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

 

  1. 이용훈 2015.06.12 00:35 신고  Address  Edit/Delete  Reply

    이메일 lyh6835@naver.com ㅡ이메일로도 답변주세요ㅜㅜ
    안녕하세요 아두이노 시작한지 얼마안되는 새내기 입니다.
    현재 RC 카를 만들기위해 공부중입니다.

    좌,우버튼 2개로 서보모터 왼쪽 오른쪽 작동까지 했는데요. .
    Dc모터 에서 많이 막힙니다..
    전진스위치1개 후진스위치1개 총버튼 2개로 dc모터 전진, 후진 구상
    하구있구요.. 전진버튼을 누르고있으며 오른쪽방향으로 돌다가 스위치를 때면 정지, 후진버튼을 누르고있으면 왼쪽방향으로 돌다가 스위치를 때면정지.. 가변저항으로 한개로 전진,후진 속도제에..
    이게 가능한건가요?

    책을보니..dc모터구동시 ,트렌지스터,다이오드,저항등 을 연결시켜주던데요.. 각부품을 쓰는이유도 알구싶어요.. 현재 모터스펙은 3VDC 구요.
    No load current는 110mA입니다.. 초보다보니.. 뭐가뭔지 ..공부를 하는데도..하나도 모르겠네요.. 도움주시면 열심이 공부하겠 습니다.

    감사합니다

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2015.06.12 12:17 신고  Address  Edit/Delete

      답변은 댓글로만 합니다.

      dc모터를 양방향 제어하실거면 다음글을 참고해 주세요.
      http://blog.danggun.net/2648

      이 블로그의 하드웨어 카테고리만 보셔도 질문에대한 모든 답변이 가능할듯 하네요.
      해보시고 질문주세요.

  2. cc 2015.11.12 21:31 신고  Address  Edit/Delete  Reply

    스위치를 사용하여 제어하고 싶은데 스위치를 누르면 딱 한번만 일정시간 이상 돌았다가 멈추는 구동을 하고싶은데
    단순 LED 제어할때처럼 해야하는지 질문드립니다

  3. cc 2015.11.13 18:14 신고  Address  Edit/Delete  Reply

    단순하게 스위치를 계속 누르고 있을때만 돌고, 스위치를 안누르고 있을땐 멈추게 하려해서

    int motor = 45;
    int Rswitch = 13;
    int re = A0;
    int LED = 10;
    int sw = 0;

    String sMeg = "Switch : ";

    int intSw = 0;
    int nSpeed = 0;

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

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


    nSpeed = analogRead(re) / 4;
    sw = digitalRead(13);
    Serial.print(sw);
    if( sw = LOW)
    {
    analogWrite(motor, nSpeed);
    digitalWrite(LED, HIGH);
    delay(1000);
    }
    if( sw = HIGH)
    {
    nSpeed = 0;
    digitalWrite(LED, LOW);
    delay(1000);
    }

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

    이렇게 짜봤는데 시리얼 모니터에서 버튼 누르는거에 따라 0, 1 바뀌는것이 뜨긴하는데 모터가 돌지를 않습니다;;

댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바