아두이노의 PWM (Pulse Width Modulation, 펄스 폭 변조) 을 이용해서 DC 모터의 속도를 제어할 수 있다. 예전 글에서는 DC 모터 드라이버 모듈인 L298N 모듈을 이용해서 DC 모터를 제어해 본 적이 있지만 (http://deneb21.tistory.com/277, http://deneb21.tistory.com/281) 이번에는 모듈 없이 간단한 회로구성 만으로 DC 모터를 제어해 보려고 한다. 다만 드라이버 모듈과 다른 점은 속도만 제어가 된다는 것이다. 회전방향은 바꿀 수 없다. 회전방향까지 바꾸려면 모터 드라이버 모듈을 사용하거나 브릿지 회로 등을 구성해서 제어해야 할 것이다.
먼저 아두이노 PWM 이란 위의 그림에서 보다시피 0V 와 5V 사이를 빠르게 반복해서 펄스를 만들어서 출력하는 것이다. 5V 유지시간이 짧아지고 0V 시간이 길어지면 출력전압이 떨어지게 된다. 반대로 되면 출력전압은 5V에 가까워지게 된다. 100% 가 될 경우 아두이노의 최대출력전압인 5V가 출력된다.
아두이노 우노 에서는 물결표시(~)로 PWM 출력이 가능한 단자를 표시하고 있다. 아두이노의 PWM 은 analogWrite 로 0~255 단계로 조절할 수 있다.
필요한 준비물이다. 아두이노, 브레드보드, 케이블 등 기본적인 것 외에 DC모터, 저항(270옴), 다이오드 (1N4001), 트랜지스터 (PN2222, 실제로는 KTN2222A 라는 제품 사용함 비슷한 규격임) 각 부품들은 비슷한 스펙이면 다른 부품을 사용해도 괜찮다.
DC 모터의 모습이다. 장난감에서 떼어낸 모터인데 세라믹 콘덴서가 3개 붙어 있어서 고주파 노이즈를 잡아주고 있다. 달지 않아도 되지만 저렇게 단자와 단자 사이, 각 단자와 모터 몸통 사이에 0.1uF 정도의 세라믹 콘덴서를 달아주면 고주파 노이즈 해결에 도움이 된다.
■연결
위와 같이 아두이노와 모터를 연결하면 된다. 여기서 각 부품의 용도를 알아보면 먼저 저항은 트랜지스터에 가해지는 전류를 줄여서 트랜지스터를 보호한다. 트랜지스터는 모터를 돌리기에는 모자란 아두이노의 전류를 증폭하는 역할을 한다. 다이오드는 모터에서 발전하는 역전류를 막아서 트랜지스터와 아두이노를 보호하는 역할을 한다. 세라믹 콘덴서는 위에서도 말했듯이 모터의 고주파를 차단하는 역할을 한다. 세라믹 콘덴서는 꼭 달지 않아도 된다.
실제 연결한 모습
■ 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | int motorPin = 3; void setup() { pinMode(motorPin, OUTPUT); Serial.begin(9600); while (! Serial); Serial.println("Speed 0 to 255"); } void loop() { if (Serial.available()) { int speed = Serial.parseInt(); if (speed >= 0 && speed <= 255) { analogWrite(motorPin, speed); } } } | cs |
위의 소스를 업로드 하고 시리얼 모니터를 열어서 1~255 사이의 값을 입력해보니 50정도의 값에서 모터가 움직이기 시작하고 값을 높일수록 (PWM 5V의 폭을 늘릴수록) 모터의 속도가 증가하는 것을 관찰하였다.
아래의 사진들은 실제로 PWM 값을 증가시켜 보면서 출력전압의 변화를 관찰한 사진이다.
PWM 값을 0 을 줬더니 0.03V 가 출력된다. 거의 출력전압이 없다고 보면 된다.
PWM 값을 100을 주었다. 2.15V 가 나온다. 5/255*100=1.96 이니까 대충 맞는 전압이 출력되는듯 하다.
PWM 값을 최대값인 255를 주었다. 아두이노 우노의 최대출력 전압인 5V가 출력 되었다.
DC모터를 PWM 으로 속도를 제어하는 것은 회전방향이 제어가 되지 않기 때문에 한쪽 방향의 회전만 있으면 되는 프로젝트에 사용이 될 수 있을 것이다. 예를 들어서 1, 2, 3 단만 있는 선풍기가 아니라 255 단계의 부드러운 속도조절이 가능한 선풍기 같은 것도 만들어 볼 수도 있을 것이고 쿨링 시스템을 만들때 온도에 따라 쿨링팬의 속도가 조절되는 로직도 만들 수 있을 것이다.
쿨링팬 하니 갑자기 생각이 났는데 내가 키우는 금붕어 어항의 온도조절을 위한 냉각팬에도 적용이 가능할 것 같다. 쿨링팬의 속도를 ON/OFF가 아닌 단계별로 조절할 수 있으므로 아마 전력낭비도 없어질 듯 하다.
'아두이노' 카테고리의 다른 글
[ATtiny] ATtiny85 서보모터 제어 (2) | 2016.12.13 |
---|---|
[ATtiny] ATtiny85 MCU 프로그래밍 보드 제작 (0) | 2016.12.12 |
[아두이노] ATtiny85 MCU 칩의 개발환경 설정, 아두이노 우노 이용 (0) | 2016.11.30 |
[아두이노] S4A를 이용해 온도센서(LM35)의 값을 읽어보자 (0) | 2016.11.25 |
[아두이노] S4A(Scratch for Arduino) 를 설치해보자 (3) | 2016.11.25 |