부품설명

자주 사용하는 부품들의 사용법에 대하여 알아봅니다.

DC 모터 사용하기

2014-08-06 10:50:56

개요

본 예제에서는 DC모터를 연결해서 돌려볼 것입니다.
DC모터는 주로 RC car에 많이 사용됩니다.

 
출처 : arduinoarts.com arduinoarts.com

그 외에 프로펠러, 간단하게는 선풍기에도 사용할 수 있습니다. 움직이는 탁자 등 다양하게 응용해보세요.

 
출처 : erutaso.tistory.com / www.tinkerkit.com

 
출처 : letsmakerobots.com

DC 모터를 사용하기 위해 트랜지스터, 오드도 함께 연결해 볼 것입니다.
또, 시리얼 모니터를 통해 입력 받은 숫자로 DC 모터의 속도를 조절해 봅시다.

 

미리보기 동영상

 

 

 

 

 

부품목록

 

본 학습에는 총 7종류의 부품이 필요합니다.
각각의 부품에 대한 자세한 설명은 하단의 상세설명 링크를 통하여 파악하실 수 있습니다.


 
NO 부품명 수량 상세설명
1 아두이노 우노 R3 1  
2 브레드 보드 1  
3 트랜지스터 1 여기서 사용된 트랜지스터는 KSP2222A입니다. 
다른 트렌지스터를 사용할 경우 연결방법이 다를 수 있습니다.
COLLECTOR / BASE / EMITTER 핀 위치를 확인하고 연결하세요.
4 다이오드 1  
5

DC 모터

1  
6 점퍼 케이블 5  
7 330Ω 저항 1  
 
부품명 Arduino Uno R3 Breadboard Transistor Diode DC Motor
파트 x1 x1 x1 x1 x1
 
부품명 Wire 330Ω Resistor
파트 x5 x1

 

 

하드웨어 Making

 

조감도

 

 

 

브레드보드 레이아웃
 

 

 

센서연결

 

트랜지스터 핀 연결
COLLECTOR 다이오드와 연결
BASE 저항과 연결
EMITTER GND

 


* 주의사항
   여기서 사용된 트랜지스터는 KSP2222A입니다.
   브레드 보드 레이아웃에 연결된 위치 그대로 위에서 부터 COLLECTOR / BASE / EMITTER 순입니다.
   위 순서는 트랜지스터 별로 약간 다릅니다.
   사용하시는 트랜지스터의 핀을 확인 해주시고 연결하세요. (구글검색, 데이터시트 참고)

 

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.
 

/* DC 모터 돌리기 */

const int motorPin = 9;     //상수 선언 : 모터와 연결된 핀 번호 저장

void setup()
{
  pinMode(motorPin, OUTPUT);      //9번핀을 출력용으로 설정

  Serial.begin(9600);             //시리얼 초기화
}


void loop()
{
     spiningMotor();              //모터 작동시키는 함수 호출
}

/*
 모터 작동시키는 함수
 : 입력받은 값을 시리얼 포트를 이용해 보내고 그에 맞는 속도로 모터가 돕니다.
*/
void spiningMotor()
{
  int speed;       //변수 선언 : 입력된 속도 저장
  
  Serial.println("Write speed : 0 ~ 255 and click send");    //속도 입력하고 send 버튼을 클릭하라고 알려줌
 
  while(true)    //무한반복
  {   
    while (Serial.available() > 0)     //입력된 문자가 있으면
    {     
     speed = Serial.parseInt();     //문자를 숫자로 변환하고 변수에 저장
  
     speed = constrain(speed, 0, 255);     //속도를 PWM 출력 값 범위로 고정
     
     analogWrite(motorPin, speed);         //speed만큼으로 모터 돌리기
 
     //speed : 값을 출력
     Serial.print("speed : ");
     Serial.println(speed);
    }
   }
 }

소프트웨어 & 하드웨어 설명

1. 사전설명
 

pin으로 내보내는 전류는 모터를 돌리기에 약합니다. 그래서 이 전류를 큰 전류로 변환해주는 트랜지스터를 사용합니다.
모터가 돌다가 갑자기 멈출 경우 일어난 spike에서 트랜지스터를 보호하기 위해 다이오드를 사용합니다.
 

2. 스케치

while (Serial.available() > 0)     //입력된 문자가 있으면
    {     
     speed = Serial.parseInt();     //입력된 값을 변수에 저장
  
     speed = constrain(speed, 0, 255);     //속도를 PWM 출력 값 범위로 고정
     
     analogWrite(motorPin, speed);         //speed만큼으로 모터 돌리기
 
     //speed : 값을 출력
     Serial.print("speed : ");
     Serial.println(speed);
    }


입력한 값을 시리얼 포트를 통해 아두이노에게 전달하는 부분입니다.
availavble()이라는 함수를 사용해서 입력된 값이 있는 지 확인합니다.

만약 입력된 값이 있다면 parseInt()함수를 통해서 얻은 후 사용할 수 있습니다.

맨 처음에 50 이하를 입력할 경우 잘 작동하지 않을 수 있습니다.
멈춘 모터가 돌기 위해서는 50보다 큰 값이 필요합니다.

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

DC 모터, 아두이노

seo 2016-01-01 02:51:04

않되는 데요.
눈으로 보기엔 코드상 입력한 값이 있으면 유효해 보이는 데 실제는 입력하자 마자 스피드가 즉시 0으로 바뀌네요.
아래것은 코드 그대로 복사해서 실행한 결과입니다.
Write speed : 0 ~ 255 and click send
speed : 255
speed : 0
왜 그럴까요.?

seo 2016-01-01 03:45:34

되네요. 시리얼 모니터에 캐리지 리턴이 체크되어서 전송후 0 이 전송되고 있었네요. 죄송합니다.
재미있는 것은 다이오드를 레드로 바꿔봤습니다.
속도가 255에서는 레드가 않켜지는 데 254부터는 레드에 불이 들어오더라구요. 속도를 줄일수록 레드가 밝아지고요.
속도를 줄이면 역전류가 발생하는 게 이상하지 않나요?
트랜지스터 기호가 뒤집어진것은 윗분지적이 맞는 것 같네요. 답변이 없으셔서 대신 해드렸습니다.

김민중 2016-02-05 19:07:15

앗..... 난 트랜지스터가...... P2N2222A이네....

김하정 2016-12-17 19:51:22

똑같이 했는데 왜 전원이 인가되자마자 모터가 돌아갈까요?
시리얼모니터에 0을 인가해도 모터가 쉴새없이 돌아가네요...
뭐가문ㅈㅔ일까요..ㅠㅠ

kocoafab 2019-01-07 14:06:08

@김하정
모터 회로 연결 한번 다시 봐주세요. 트랜지스터에 연결된 선이 잘못 연결될 경우 계속 모터가 돌수 있습니다.