제06강 입출력 디바이스 iii - koreatech · raspberrypi 입출력디바이스iii 28...

31
RaspberryPi 입출력디바이스III 1 제06강 입출력 디바이스 III DC 모터 제어 스테핑 모터 제어 서보 모터 제어

Upload: others

Post on 20-Oct-2020

11 views

Category:

Documents


0 download

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