정역회전

페이지 정보

profile_image
작성자 test
댓글 2건 조회 161회 작성일 19-04-27 13:40

본문

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      }

댓글목록

profile_image

test님의 댓글

test 작성일
profile_image

tear님의 댓글

tear 작성일