라즈베리파이 스터디 글답변
이름
필수
비밀번호
필수
이메일
홈페이지
옵션
html
비밀글
제목
필수
내용
필수
> > > 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 } > >
링크 #1
링크 #2
파일 #1
파일 #2
자동등록방지
숫자음성듣기
새로고침
자동등록방지 숫자를 순서대로 입력하세요.
취소
작성완료