지금까지 모터드라이브는 L298N 을 사용했었는데, 금년 초에 알리에서 검색을 하다가 보니, 싸고 작은 모터드라이브가 있길래 이 놈을 구매하였다.
작은 모터를 돌리기 위한 목적인지라, 당연히 충분할 것으로 생각하고 주문해서 장장 5개월 만에 받게 되었다. 코로나19 때문에 어디서인가 한참을 대기하고 있었을 것으로 생각된다. 5개월 걸려서라도 도착한다는 것이 신기했다. 물류의 힘...
구매한 모듈은 아래에 링크를 넣어두었다. 5개에 1.33달러
https://www.aliexpress.com/item/33058629638.html
모터 드라이브는 아래 사진과 같다. 기존의 L298N 모듈과 비슷하게, 모터 2개를 연결할 수 있고, IN1/2, IN3/4를 이용하여 모터의 속도를 조절할 수 있다. 스펙자료를 보니, 전원은 2V~10V , IN시그널은 1.8V ~ 7V 로 제어를 하면 되는 것으로 나온다. 보통 리튬이온 배터리를 사용하거나 아두이노 전원을 당겨서 사용할 것이라서 3.7 ~5V 사이를 사용할 것이니 특별히 문제가 없을 것 같다.
아두이노 우노를 이용하여, 모터드라이브와 모터를 연결하였다. 간단한 것이라서 Fritzing으로 그리지 않고, 사진으로 대체를 하였다.
우노의 5V/GND 를 모터드라이브의 전원으로 연결하였고, D9/D10핀을 모터드라이브의 INT3/INT4에 연결하였다. 마지막으로, DC모터를 Motor-B 에 연결하였다.
아두이노 우노 | MX1508 | 비고 |
5V | + | |
GND | - | |
D9 | INT3 | |
D10 | INT4 | |
- | MOTOR-B | 방향 상관 없음(모터에 연결) |
- | MOTOR-B | 방향 상관 없음(모터에 연결) |
INT3에 PWM 신호를 넣으면 정방향(또는 역방향)으로 돌고, INT4에 PWM신호를 넣으면 역방향(또는 정방향)으로 돌게 된다.
INT3/INT4에 PWM신호를 동시에 넣으면 어떻게 될까? 당연히, INT3/INT4에 0을 넣으면 멈춘다.
연결된 사진은 다음과 같다.
실행 코드 예제는 정방향으로 90 ~ 255까지 속도를 점점 올리도록 했다가, 다시 속도를 줄이도록 한 후에, 역방향으로도 동일하게 되도록 하였다. PWM 신호를 90이하로 줄였을 때, 모터가 돌지 않았었다. 모터에 특정 전류가 흘러야지만 움직일 것이라 추정되기는 하지만, 너무 큰 수치인데도 안 움직이는 것이 좀 이상한 부분이다. 이 점은 이후에 원인 파악하여 보완할 부분이다.
const int FwdPin = 10;
const int BwdPin = 9;
boolean DirFlag = true;
void setup()
{
pinMode(FwdPin, OUTPUT);
pinMode(BwdPin, OUTPUT);
}
void loop()
{
if(DirFlag) {
for (int i=90; i<255; i+=10) {
analogWrite(FwdPin,i);
delay(500);
}
for (int i=255; i>90; i-=10) {
analogWrite(FwdPin,i);
delay(500);
}
}
else {
for (int i=90; i<255; i+=10) {
analogWrite(BwdPin,i);
delay(500);
}
for (int i=255; i>90; i-=10) {
analogWrite(BwdPin,i);
delay(500);
}
}
analogWrite(FwdPin,0);
analogWrite(BwdPin,0);
DirFlag =! DirFlag;
delay(200);
}
실행 동영상
추가로, MX1508 라이브러리를 이용한 예제가 있어서 아래에 추가 정리한다.
#include <MX1508.h>
#define PINA 9
#define PINB 10
#define NUMPWM 2
#define PWM 100
/*
* MX1508(uint8_t pinIN1, uint8_t pinIN2, DecayMode decayMode, NumOfPwmPins numPWM);
* DecayMode must be FAST_DECAY or SLOW_DECAY,
* NumOfPwmPins, either use 1 or 2 pwm.
* I recommend using 2 pwm pins per motor so spinning motor forward and backward gives similar response.
* if using 1 pwm pin, make sure its pinIN1, then set pinIN2 to any digital pin. I dont recommend this setting because
* we need to use FAST_DECAY in one direction and SLOW_DECAY for the other direction.
*/
MX1508 motorA(PINA,PINB, FAST_DECAY, NUMPWM);
void setup() {}
void loop() {
motorA.motorGo(PWM);
}
'아두이노 > 아두이노 일반' 카테고리의 다른 글
[잡담] 아두이노로 LED알리미 만들기(버스도착, 시계, 환경정보) (0) | 2020.08.16 |
---|---|
(작성중) 인코더 기어 DC모터 제어하기(MX1508) (0) | 2020.07.12 |
(작성중) PMS-7003 (0) | 2020.05.18 |
[아두이노] TMP36 으로 온도계 만들기 (0) | 2020.05.11 |
초간단 wifi 카메라 ESP32-CAM 사용하기 (6) | 2020.05.10 |