정역회전
페이지 정보

본문
L298N 모터 드라이버를 이용한 DC모터 구동
- 이글의 최종 버젼은 https://cafe.naver.com/kpopenproject 에서 확인하시기 바랍니다.
- 이 글은 전자,전산 분야의 전문가가 아닌 비전공자의 경험으로 작성한 글입니다. 따라 잘못된 정보가 있을 수 있으므로 무작정 따라하지 마시고 검토 후 구현하시길 바랍니다. 그리고 잘못된 내용이 있을 경우 저에게 메일( khkim@mapescn.com )로 알려주시면 바로 수정 배포하도록 하겠습니다.
? 질의 및 요청 사항
L298N 모터 드라이버와 조이스틱 모듈을 이용하여 DC모터를 작동하고자 합니다.
조이스틱 모듈의 상하는 고속 회전을 하고 싶고 좌우 방향은 저속 회전을 하고자 합니다.
? 회로의 구성
L298N은 DC모터의 속도 및 방향제어가 가능한 모터 드라이버입니다.
5V~35V의 DC모터를 구동할 수 있으며 2A의 전류제어가 가능합니다.
L298N 드라이버는 다음과 같이 모듈화된 제품을 사용합니다.
L298N 모터드라이버의 구성 및 핀 구성은 다음과 같습니다.
? L298N 모터 드라이버 핀
모터 A : 모터A를 연결합니다.
모터 B : 모터B를 연결합니다.
12V이상 전압 점퍼 : 모터 구동을 위한 외부전력을 12V이하를 사용할 경우 점퍼를
연결합니다. 이 경우 5V전원핀에는 5V의 전력을 출력해 줍니다.
12V이상의 전압을 사용할 경우 이 점퍼를 제거하여야 하며,
5V전원핀에 5V전압을 입력하여 주어야 합니다.
모터구동용 외부전력 VCC : 5볼트에서 35V까지 모터구동용 전력을 연결합니다.
연결 전력의 전압이 12V이상일 경우에는 “12V이상 전압 점퍼”를 제거하여야
합니다.
모터 제어 핀 :
Enable A, Input 1, Input 2, Input 3, Input 4, Enable B 6개의 제어핀 입니다.
Enable A와 Enable B의 경우 모터의 속도를 제어하기 위한 PWM입력 핀입니다.
Input 1, 2와 Input 3, 4의 경우 모터의 구동 및 정지 방향을 설정하는 핀입니다.
DC모터의 속도 제어를 할 경우 Enable A, Enable B핀의 점퍼를 제거하고
아두이노의 속도 제어핀을 연결하게 됩니다.
? 아두이노 회로도
? L298N 핀 연결
L298N 아두이노 비고
ENA 5번핀
IN1 2번핀
IN2 3번핀
IN3
IN4
ENB
12V 외부전력 연결(5~12V)
GND GND
?
? 조이스틱 모듈의 연결
조이스틱 아두이노 비고
VCC 5V
VER A1
HOR A0
GND GND
? 회로도
?
? Code
? 아래 코드는 모터를 속도 조절을 하여 서서히 정회전 역회전으로 변경하는 예입니다.
12345
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
#define L298N_ENABLE1 5
#define L298N_IN1 2
#define L298N_IN2 3
void setup() {
pinMode(L298N_IN1, OUTPUT);
pinMode(L298N_IN2, OUTPUT);
}
void loop() {
for ( int i = -100; i < 100; i++) {
motor_speed(i);
delay(20);
}
for ( int i = 100; i > -100; i--) {
motor_speed(i);
delay(20);
}
}
void motor_speed(int speed) {
if ( speed > 0 ) {
digitalWrite(L298N_IN1, HIGH);
digitalWrite(L298N_IN2, LOW);
analogWrite(L298N_ENABLE1, speed);
} else {
digitalWrite(L298N_IN1, LOW);
digitalWrite(L298N_IN2, HIGH);
analogWrite(L298N_ENABLE1, -speed);
}
}
?
? 아래 코드는 시리얼 모니터를 이용하여 1~9까지의 값을 입력 받아 1~4는 역회전 5는 정지 6~9는 정회전의 속도로 회전하는 예입니다.
12345
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 #define L298N_ENABLE1 5
2 #define L298N_IN1 2
3 #define L298N_IN2 3
4
5 int speed = 5;
6
7 void setup()
8 {
9 Serial.begin(9600);
10 pinMode(L298N_IN1, OUTPUT);
11 pinMode(L298N_IN2, OUTPUT);
12 speed = 5;
13 motor_speed(0);
14 }
15
16 void loop()
17 {
18 if (Serial.available())
19 {
20 int val = Serial.read();
21
22 if ( ( val >= '1' ) && ( val <= '9' ) )
23 {
24 Serial.print("INPUT VALUE : ");
25 Serial.println(val);
26 val = val - '5';
27 speed = map(val, -4, 4, -255, 255);
28 Serial.print("SPEED : ");
29 Serial.println(speed);
30 Serial.println("##########");
31 motor_speed(speed);
32 }
33 }
34 }
35
36 void motor_speed(int speed)
37 {
38 if ( speed > 0 )
39 {
40 digitalWrite(L298N_IN1, HIGH);
41 digitalWrite(L298N_IN2, LOW);
42 analogWrite(L298N_ENABLE1, speed);
43 }
44 else
45 {
46 digitalWrite(L298N_IN1, LOW);
47 digitalWrite(L298N_IN2, HIGH);
48 analogWrite(L298N_ENABLE1, -speed);
49 }
50 }
51
?
? 아래 코드는 조이스틱을 이용하여 속도를 조종하는 예입니다. 조이스틱의 Y축은 속도 0~255범위(고속)의 속도로 제어하며 X축의 경우 속도 0~100으로 저속의 속도로 회전하는 예입니다.
12345
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 #define L298N_ENABLE1 5
2 #define L298N_IN1 2
3 #define L298N_IN2 3
4 #define JOYSTICK_X A0
5 #define JOYSTICK_Y A1
6 #define HIGH_SPEED_MAX 100
7 #define LOW_SPEED_MAX 50
8
9 int speed = 0;
10
11 void setup()
12 {
13 Serial.begin(9600);
14 pinMode(L298N_IN1, OUTPUT);
15 pinMode(L298N_IN2, OUTPUT);
16 motor_speed(0);
17 }
18
19 void loop()
20 {
21 int val_x = analogRead(JOYSTICK_X) - 512;
22 int val_y = analogRead(JOYSTICK_Y) - 512;
23
24 if ( abs(val_x) > abs(val_y) )
25 {
26 speed = map(val_x, -512, 512, -HIGH_SPEED_MAX, HIGH_SPEED_MAX);
27 }
28 else
29 {
30 speed = map(val_y, -512, 512, -LOW_SPEED_MAX, LOW_SPEED_MAX);
31 }
32
33 speed = min(speed, 255);
34 speed = max(speed, -255);
35 motor_speed(speed);
36 }
37
38 void motor_speed(int speed)
39 {
40 if ( speed > 0 )
41 {
42 digitalWrite(L298N_IN1, HIGH);
43 digitalWrite(L298N_IN2, LOW);
44 analogWrite(L298N_ENABLE1, speed);
45 }
46 else
47 {
48 digitalWrite(L298N_IN1, LOW);
49 digitalWrite(L298N_IN2, HIGH);
50 analogWrite(L298N_ENABLE1, -speed);
51 }
52 }
- 이글의 최종 버젼은 https://cafe.naver.com/kpopenproject 에서 확인하시기 바랍니다.
- 이 글은 전자,전산 분야의 전문가가 아닌 비전공자의 경험으로 작성한 글입니다. 따라 잘못된 정보가 있을 수 있으므로 무작정 따라하지 마시고 검토 후 구현하시길 바랍니다. 그리고 잘못된 내용이 있을 경우 저에게 메일( khkim@mapescn.com )로 알려주시면 바로 수정 배포하도록 하겠습니다.
? 질의 및 요청 사항
L298N 모터 드라이버와 조이스틱 모듈을 이용하여 DC모터를 작동하고자 합니다.
조이스틱 모듈의 상하는 고속 회전을 하고 싶고 좌우 방향은 저속 회전을 하고자 합니다.
? 회로의 구성
L298N은 DC모터의 속도 및 방향제어가 가능한 모터 드라이버입니다.
5V~35V의 DC모터를 구동할 수 있으며 2A의 전류제어가 가능합니다.
L298N 드라이버는 다음과 같이 모듈화된 제품을 사용합니다.
L298N 모터드라이버의 구성 및 핀 구성은 다음과 같습니다.
? L298N 모터 드라이버 핀
모터 A : 모터A를 연결합니다.
모터 B : 모터B를 연결합니다.
12V이상 전압 점퍼 : 모터 구동을 위한 외부전력을 12V이하를 사용할 경우 점퍼를
연결합니다. 이 경우 5V전원핀에는 5V의 전력을 출력해 줍니다.
12V이상의 전압을 사용할 경우 이 점퍼를 제거하여야 하며,
5V전원핀에 5V전압을 입력하여 주어야 합니다.
모터구동용 외부전력 VCC : 5볼트에서 35V까지 모터구동용 전력을 연결합니다.
연결 전력의 전압이 12V이상일 경우에는 “12V이상 전압 점퍼”를 제거하여야
합니다.
모터 제어 핀 :
Enable A, Input 1, Input 2, Input 3, Input 4, Enable B 6개의 제어핀 입니다.
Enable A와 Enable B의 경우 모터의 속도를 제어하기 위한 PWM입력 핀입니다.
Input 1, 2와 Input 3, 4의 경우 모터의 구동 및 정지 방향을 설정하는 핀입니다.
DC모터의 속도 제어를 할 경우 Enable A, Enable B핀의 점퍼를 제거하고
아두이노의 속도 제어핀을 연결하게 됩니다.
? 아두이노 회로도
? L298N 핀 연결
L298N 아두이노 비고
ENA 5번핀
IN1 2번핀
IN2 3번핀
IN3
IN4
ENB
12V 외부전력 연결(5~12V)
GND GND
?
? 조이스틱 모듈의 연결
조이스틱 아두이노 비고
VCC 5V
VER A1
HOR A0
GND GND
? 회로도
?
? Code
? 아래 코드는 모터를 속도 조절을 하여 서서히 정회전 역회전으로 변경하는 예입니다.
12345
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
#define L298N_ENABLE1 5
#define L298N_IN1 2
#define L298N_IN2 3
void setup() {
pinMode(L298N_IN1, OUTPUT);
pinMode(L298N_IN2, OUTPUT);
}
void loop() {
for ( int i = -100; i < 100; i++) {
motor_speed(i);
delay(20);
}
for ( int i = 100; i > -100; i--) {
motor_speed(i);
delay(20);
}
}
void motor_speed(int speed) {
if ( speed > 0 ) {
digitalWrite(L298N_IN1, HIGH);
digitalWrite(L298N_IN2, LOW);
analogWrite(L298N_ENABLE1, speed);
} else {
digitalWrite(L298N_IN1, LOW);
digitalWrite(L298N_IN2, HIGH);
analogWrite(L298N_ENABLE1, -speed);
}
}
?
? 아래 코드는 시리얼 모니터를 이용하여 1~9까지의 값을 입력 받아 1~4는 역회전 5는 정지 6~9는 정회전의 속도로 회전하는 예입니다.
12345
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 #define L298N_ENABLE1 5
2 #define L298N_IN1 2
3 #define L298N_IN2 3
4
5 int speed = 5;
6
7 void setup()
8 {
9 Serial.begin(9600);
10 pinMode(L298N_IN1, OUTPUT);
11 pinMode(L298N_IN2, OUTPUT);
12 speed = 5;
13 motor_speed(0);
14 }
15
16 void loop()
17 {
18 if (Serial.available())
19 {
20 int val = Serial.read();
21
22 if ( ( val >= '1' ) && ( val <= '9' ) )
23 {
24 Serial.print("INPUT VALUE : ");
25 Serial.println(val);
26 val = val - '5';
27 speed = map(val, -4, 4, -255, 255);
28 Serial.print("SPEED : ");
29 Serial.println(speed);
30 Serial.println("##########");
31 motor_speed(speed);
32 }
33 }
34 }
35
36 void motor_speed(int speed)
37 {
38 if ( speed > 0 )
39 {
40 digitalWrite(L298N_IN1, HIGH);
41 digitalWrite(L298N_IN2, LOW);
42 analogWrite(L298N_ENABLE1, speed);
43 }
44 else
45 {
46 digitalWrite(L298N_IN1, LOW);
47 digitalWrite(L298N_IN2, HIGH);
48 analogWrite(L298N_ENABLE1, -speed);
49 }
50 }
51
?
? 아래 코드는 조이스틱을 이용하여 속도를 조종하는 예입니다. 조이스틱의 Y축은 속도 0~255범위(고속)의 속도로 제어하며 X축의 경우 속도 0~100으로 저속의 속도로 회전하는 예입니다.
12345
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 #define L298N_ENABLE1 5
2 #define L298N_IN1 2
3 #define L298N_IN2 3
4 #define JOYSTICK_X A0
5 #define JOYSTICK_Y A1
6 #define HIGH_SPEED_MAX 100
7 #define LOW_SPEED_MAX 50
8
9 int speed = 0;
10
11 void setup()
12 {
13 Serial.begin(9600);
14 pinMode(L298N_IN1, OUTPUT);
15 pinMode(L298N_IN2, OUTPUT);
16 motor_speed(0);
17 }
18
19 void loop()
20 {
21 int val_x = analogRead(JOYSTICK_X) - 512;
22 int val_y = analogRead(JOYSTICK_Y) - 512;
23
24 if ( abs(val_x) > abs(val_y) )
25 {
26 speed = map(val_x, -512, 512, -HIGH_SPEED_MAX, HIGH_SPEED_MAX);
27 }
28 else
29 {
30 speed = map(val_y, -512, 512, -LOW_SPEED_MAX, LOW_SPEED_MAX);
31 }
32
33 speed = min(speed, 255);
34 speed = max(speed, -255);
35 motor_speed(speed);
36 }
37
38 void motor_speed(int speed)
39 {
40 if ( speed > 0 )
41 {
42 digitalWrite(L298N_IN1, HIGH);
43 digitalWrite(L298N_IN2, LOW);
44 analogWrite(L298N_ENABLE1, speed);
45 }
46 else
47 {
48 digitalWrite(L298N_IN1, LOW);
49 digitalWrite(L298N_IN2, HIGH);
50 analogWrite(L298N_ENABLE1, -speed);
51 }
52 }
댓글목록

test님의 댓글
test 작성일