제06강 입출력 디바이스 iii - koreatech · raspberrypi 입출력디바이스iii 28...
TRANSCRIPT
-
RaspberryPi 입출력디바이스III 1
제06강
입출력 디바이스 III
DC 모터 제어
스테핑 모터 제어
서보 모터 제어
-
RaspberryPi 입출력디바이스III 2
DC 모터
* DC 모터 모듈
* Half Bridge 드라이버 회로
: DC 모터의 정회전, 역회전 구동을 위한 드라이버 회로
: SN754410 IC 사용( L293D IC도 호환 )
-
RaspberryPi 입출력디바이스III 3
DC 모터(계속)
* SN754410 IC
: 2개의 half bridge로 구성
- 1A, 2A : 모터의 회전 방향을 결정, GPIO 핀에 연결
- 1Y, 2Y : DC 모터와 연결
- 1,2EN : 하나의 H-브리지 인에이블 단자( High일 때 H-브리지 동작 )
: 이 단자에 GPIO PWM 신호를 주어 모터 회전 속도 조절 가능
- Vcc1 : IC 로직을 위한 전원, 5V에 연결
- GND : 4, 5, 12, 13의 4핀을 GND에 연결
- Vcc2 : 모터 구동용 전원(5V~36V)(예, 모터 구동에 9V요구되면 9V인가)
-
RaspberryPi 입출력디바이스III 4
DC 모터(계속)
* SN754410 H-브리지 동작상태
-
RaspberryPi 입출력디바이스III 5
DC 모터(계속)
* dcmotor.h 사용자 라이브러리
: DC 모터 제어를 위한 함수들
$ sudo nano dcmotor.h
//=======================================// dcmotor.h// DC motor + Hbridge(SN754410)//=======================================#ifndef __DCMOTOR_H__#define __DCMOTOR_H__
#include #include
#define P_BRG_EN12 27 // BCM_GPIO #16#define P_BRG_1A 28 // BCM_GPIO #20#define P_BRG_2A 29 // BCM_GPIO #21
void setPinMode(void);void forward(void);void backward(void);
-
RaspberryPi 입출력디바이스III 6
void brake(void);void stop(void);
void setPinMode(void) { pinMode(P_BRG_EN12, OUTPUT); pinMode(P_BRG_1A, OUTPUT); pinMode(P_BRG_2A, OUTPUT);}
void forward(void) { printf("forward....\n");
digitalWrite(P_BRG_EN12, LOW); digitalWrite(P_BRG_1A, HIGH); digitalWrite(P_BRG_2A, LOW);
digitalWrite(P_BRG_EN12, HIGH); // run}
void backward(void) { printf("backward....\n");
digitalWrite(P_BRG_EN12, LOW); digitalWrite(P_BRG_1A, LOW); digitalWrite(P_BRG_2A, HIGH);
digitalWrite(P_BRG_EN12, HIGH); // run}
-
RaspberryPi 입출력디바이스III 7
void brake(void) { printf("brake....\n");
digitalWrite(P_BRG_EN12, LOW); digitalWrite(P_BRG_1A, LOW); digitalWrite(P_BRG_2A, LOW);
digitalWrite(P_BRG_EN12, HIGH); // run}
void stop(void) { printf("stop....\n");
digitalWrite(P_BRG_EN12, LOW);}
#endif
-
RaspberryPi 입출력디바이스III 8
DC 모터(계속)
[실습1] DC 모터 제어
: 정회전/역회전을 3회 반복하는 프로그램
$ sudo nano dcMotor_01.c
//=======================================// dcMotor_01.c// DC motor + Hbridge(SN754410)//=======================================#include #include
#include "dcmotor.h" // user library
int main(void) {int i;
if(wiringPiSetup() == -1)return 1;
setPinMode();
-
RaspberryPi 입출력디바이스III 9
for(i=0; i
-
RaspberryPi 입출력디바이스III 10
DC 모터(계속)
[실습2] DC 모터 속도 제어
: Enable단자에 PWM 신호 인가하여 속도 가변되게 작성
: 점점 가속하다 최대속도에서 점차 감속하는 프로그램
$ sudo nano dcMotor_02.c
//=======================================
// dcMotor_02.c
// DC motor + Hbridge(SN754410)
//=======================================
#include
#include
#include
#include "dcmotor.h“
void forwardPWM(int i) {
printf("forward....\n");
-
RaspberryPi 입출력디바이스III 11
digitalWrite(P_BRG_EN12, LOW);
digitalWrite(P_BRG_1A, HIGH);
digitalWrite(P_BRG_2A, LOW);
softPwmWrite(P_BRG_EN12, i); // run
}
void stopPWM(void) {
printf("stop....\n");
softPwmWrite(P_BRG_EN12, LOW);
}
int main(void) {
int i;
if(wiringPiSetup() == -1)
return 1;
setPinMode();
softPwmCreate(P_BRG_EN12, 0, 100);
-
RaspberryPi 입출력디바이스III 12
for(i=0; i=0; i-=5) {
printf("%d .......\n", i);
forwardPWM(i); //
delay(3000);
}
stopPWM();
delay(3000);
return 0;
}
$ make dcMotor_02
$ ./dcMotor_02
-
RaspberryPi 입출력디바이스III 13
DC 모터(계속)
[실습3] DC 모터 제어
: BTN 입력에 따라 정/역회전 방향을 바꾸는 프로그램
$ sudo nano dcMotor_03.c
//=======================================
// dcMotor_03.c
// DC motor + Hbridge(SN754410) + BTN
//=======================================
#include
#include
#include "dcmotor.h" // user library
#define P_BTN 5 // BCM_GPIO #24
int main(void) {
-
RaspberryPi 입출력디바이스III 14
int i;
if(wiringPiSetup() == -1)
return 1;
pinMode(P_BTN, INPUT);
setPinMode();
while(1) {
if(digitalRead(P_BTN)==0)
forward();
else
backward();
}
return 0;
}
$ make dcMotor_03
$ ./dcMotor_03
-
RaspberryPi 입출력디바이스III 15
스테핑 모터
* 스테핑 모터 모듈
: 28BYJ-48 모터 + ULN2003A 드라이버
: 회로도
-
RaspberryPi 입출력디바이스III 16
스테핑 모터(계속)
* ULN2003A 드라이버
: 구동방법
-4phase 4step(2가지)
구 분 A B C D
step 1 1 0 0 0step 2 0 1 0 0step 3 0 0 1 0step 4 0 0 0 1
구 분 A B C D
step 1 1 1 0 0step 2 0 1 1 0step 3 0 0 1 1step 4 1 0 0 1
-4phase 8step
구 분 A B C D
step 1 1 1 0 0step 2 0 1 0 0step 3 0 1 1 0step 4 0 0 1 0step 5 1 0 1 1step 6 0 0 0 1step 7 1 0 0 1step 8 1 0 0 0
-
RaspberryPi 입출력디바이스III 17
스테핑 모터(계속)
[실습4] 스테핑 모터 제어 I
: 정회전하되, 다양한 모드로 스테핑 모터를 제어
$ sudo nano stepMotor_01.c
//=======================================// stepMotor_01.c// 28BYJ-48 Step Motor + ULN2003A Driver//=======================================#include #include
#define P_ULN_IN1 26 // BCM_GPIO #12#define P_ULN_IN2 27 // BCM_GPIO #16#define P_ULN_IN3 28 // BCM_GPIO #20#define P_ULN_IN4 29 // BCM_GPIO #21
void setPinMode(void) { pinMode(P_ULN_IN1, OUTPUT); pinMode(P_ULN_IN2, OUTPUT);
-
RaspberryPi 입출력디바이스III 18
pinMode(P_ULN_IN3, OUTPUT); pinMode(P_ULN_IN4, OUTPUT);}
void run(int in1, int in2, int in3, int in4) { digitalWrite(P_ULN_IN1, in1); digitalWrite(P_ULN_IN2, in2); digitalWrite(P_ULN_IN3, in3); digitalWrite(P_ULN_IN4, in4); delay(10); // speed}
int main(void) {
if(wiringPiSetup() == -1) return 1;
setPinMode();
while(1) {
/* // 2phase 4step .... X run(0, 0, 1, 0); run(0, 1, 1, 0); run(0, 1, 0, 0); run(0, 0, 0, 0);*/
-
RaspberryPi 입출력디바이스III 19
/* // 4phase 4step I .... O run(1, 0, 0, 0); run(0, 1, 0, 0); run(0, 0, 1, 0); run(0, 0, 0, 1);*/
/* // 4phase 4step II ... O run(1, 1, 0, 0); run(0, 1, 1, 0); run(0, 0, 1, 1); run(1, 0, 0, 1);*/
// 4phase 8step ... O run(1, 1, 0, 0); run(0, 1, 0, 0); run(0, 1, 1, 0); run(0, 0, 1, 0); run(0, 0, 1, 1); run(0, 0, 0, 1); run(1, 0, 0, 1); run(1, 0, 0, 0);
-
RaspberryPi 입출력디바이스III 20
}
return 0;}
$ make stepMotor_01
$ ./stepMotor_01
-
RaspberryPi 입출력디바이스III 21
스테핑 모터(계속)
[실습5] 스테핑 모터 제어 II
: 정회전 / 역회전을 반복하는 프로그램( 4wire-4step )
$ sudo nano stepMotor_02.c
//=======================================// stepMotor_02.c// 28BYJ-48 Step Motor + ULN2003A Driver// CW-CCW-CW-..., using 4phase-4step//=======================================#include #include
#define P_ULN_IN1 26 // BCM_GPIO #12#define P_ULN_IN2 27 // BCM_GPIO #16#define P_ULN_IN3 28 // BCM_GPIO #20#define P_ULN_IN4 29 // BCM_GPIO #21
void setPinMode(void) { pinMode(P_ULN_IN1, OUTPUT); pinMode(P_ULN_IN2, OUTPUT); pinMode(P_ULN_IN3, OUTPUT);
-
RaspberryPi 입출력디바이스III 22
pinMode(P_ULN_IN4, OUTPUT);}
void run(int in1, int in2, int in3, int in4) { digitalWrite(P_ULN_IN1, in1); digitalWrite(P_ULN_IN2, in2); digitalWrite(P_ULN_IN3, in3); digitalWrite(P_ULN_IN4, in4); delay(10); // speed}
int main(void) { int min=0; int max=200; int i;
if(wiringPiSetup() == -1) return 1;
setPinMode();
while(1) { for(i=0; i
-
RaspberryPi 입출력디바이스III 23
}
for( ; i>=min; i--) { // CCW run(0, 0, 1, 1); run(0, 1, 1, 0); run(1, 1, 0, 0); run(1, 0, 0, 1); printf("CCW : %d\n", i); } }
return 0;}
$ make stepMotor_02
$ ./stepMotor_02
-
RaspberryPi 입출력디바이스III 24
서보 모터
* SG90 서보모터 모듈
: 감속기어, 전자회, DC 모터로 구성된 모터
: PWM 신호에 의해 구동(오렌지색 단자)
: 로봇관절, RC카 등에서 미세한 각 조절에 사용
: 구동각 180도
-
RaspberryPi 입출력디바이스III 25
서보 모터
* 서보 모터 제어
: PWM 신호에 따른 회전각
-
RaspberryPi 입출력디바이스III 26
서보 모터(계속)
[실습6] 서보 모터 제어
: 서보 모터를 구동하는 프로그램
$ sudo nano servo_01.c
//=======================================// servo_01.c// Microservo SG90 module////=======================================#include #include #include #include
#define P_SVM 26 // BCM_GPIO #12
int main(void) { int i;
if(wiringPiSetup() == -1) exit(1);
-
RaspberryPi 입출력디바이스III 27
pinMode(P_SVM, SOFT_PWM_OUTPUT);
softPwmCreate(P_SVM, 0, 200);
printf("[SG90 Serbo Motor testing............]\n"); while(1) {
for(i=0; i
-
RaspberryPi 입출력디바이스III 28
응용과제
[응용1] DC 모터 제어
: DC 모터의 회전속도 주어졌을 때 운영가능토록
dcmotor.h의 모든 함수 재구현( 즉, PWM 방식 활용 )
: 재구현된 라이브러리를 활용하여 테스트 프로그램 작성
[응용2] DC모터 + BTN 모듈
: DC 모터의 회전방향을 버튼스위치를 사용하여 제어토록 구현
-
RaspberryPi 입출력디바이스III 29
응용과제(계속)
[응용3] 서보모터 + BTN 모듈 x2
: 책받침의 각 조절을 가정하여.....
: 서보 모터의 회전각을 버튼스위치(상향,하향)로 제어토록 구현
-
RaspberryPi 입출력디바이스III 30
-
RaspberryPi 입출력디바이스III 31
서보 모터(계속)
* 서보모터용 PWM 신호에 의한 제어
: DC