본문 바로가기
Embedded/Raspberry PI

Raspberry PI GPIO 실습(3)

by kjy1010 2023. 12. 27.

이번 실습은 Moter와 FND, LED dot matrix를 이용한 실습을 진행해보겠습니다.

 

Moter

플레밍의 왼손법칙과 모터의 작동원리

  • 전기에너지를 운동에너지로 전환하여 시스템을 작동하는 대표적인 액추에이터
  • 자기장 내에 전류를 흘려보내서 발생하는 힘을 회전 운동으로 변환

DC moter

  • 직류전원 (DC) 활용. 속도 및 방향 제어에 용이
  • Brushed DC motor: 일반적인 DC모터
  • Brushless DC motor (BLDC): 모터 내부의 brush 를 없애 발열/소음 특성 개선한 DC모터
  • Stepper DC motor: 회전 각도를 제어 가능한 모터
  • Servo DC motor: 회전 각도를 제어 가능한 모터

AC moter

  • 교류 전원 (AC) 활용. 고효율, 고수명, 고출력
  • 단상 모터, 삼상 모터 등

트랜지스터

  • 스위칭 및 전력 증폭에 활용하는 반도체 소자
  • N형/P형 반도체의 접합 방식에 따라 PNP형 또는 NPN형 으로 나누어짐
  • 컬렉터, 베이스, 이미터 3개의 단자로 구성
  • 베이스에 전기신호를 보내, 컬렉터와 이미터 사이 전류의 흐름을 제어 (스위칭) 함
  • NPN형 트랜지스터는 컬렉터에 VCC, 이미터에 GND 연결

Moter 실습

DC moter와 트렌지스터를 이용해 모터를 제어하는 실습을 진행해보도록 하겠습니다.

실습에 필요한 회로도 입니다.

 

 

위의 회로도를 구성할때 트렌지스터는 아래 회로도를 참고하여 구성하면 됩니다.

 

wiringmotor.c 라는 c파일을 만들어 코드를 작성해보겠습니다.

 

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
int motorControl(int gpio)
{
    int i;
    pinMode(gpio, OUTPUT); /* Pin의 모드 설정 */
    for (i = 0; i < 3; i++) 
    {
        digitalWrite(gpio, HIGH); /* HIGH(1) 값을 출력 : 모터 켜기 */
        delay(1000); /* 1초(1000밀리초) 동안 대기 */
        digitalWrite(gpio, LOW); /* LOW(0) 값을 출력 : 모터 끄기 */
        delay(1000);
    }
    return 0;
}
int main(int argc, char **argv)
{
    int gno;
    if(argc < 2) 
    {
        printf("Usage : %s GPIO_NO\n", argv[0]);
        return -1;
    }
    gno = atoi(argv[1]);
    wiringPiSetup( );
    motorControl(gno);
    return 0;
}

 

코드를 작성하였다면, gcc를 이용해 컴파일하고 실행시켜보겠습니다.

 

pi@raspberrypi:~ $ gcc -o wiringmotor wiringmotor.c -lwiringPi
pi@raspberrypi:~ $ sudo ./wiringmotor 2

 

위의 명령어를 통해 프로그램을 실행시켜 모터가 작동/멈춤을 3회 반복 할 수 있습니다.

 

FND (7segment)

캐소드형과 에노드형 FND

  • FND (Flexible Numeric Display) 라고도 함.
  • 7개의 LED로 숫자를 표현함. (+1 LED로 소수점 표현)
  • Anode 형/ Cathode 형으로 구분됨.
    - Type에 따라 숫자를 표시하기 위해 입력해야하는 신호가 약간 다름.
  • 10개 핀을 사용하여 숫자 표현.
    - 2 common pins: VCC (Anode type) 또는 GND (Cathode type) 연결
    - 8 LED pins: GPIO 연결하여 신호 발생

7segment의 표시값과 입력값

 

FND (7segment) 실습

FND (7segment)를 제어하는 실습을 진행해보도록 하겠습니다.

실습에 필요한 회로도 입니다.

 

wiringseg.c 라는 c파일을 만들어 코드를 작성해보겠습니다.

 

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>

#define PA 2
#define PB 4
#define PC 1
#define PD 16
#define PE 15
#define PF 8
#define PG 9
#define PDP 0

// for anode display
char nums[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

// WPi pin numbers
char pins[8] = {PA, PB, PC, PD, PE, PF, PG, PDP};

void clear_pin ()
{
    int i;
    for (i = 0; i < 8; i++)
    digitalWrite(pins[i], 1);
}
void set_pin (int n)
{
    int i;
    for (i = 0; i < 8; i++)
    digitalWrite(pins[i], (nums[n] >> i) & 0x1);
}
void init_pin ()
{
    int i;
    for (i = 0; i < 8; i++)
    pinMode(pins[i], OUTPUT);
}
int main(void)
{
    int i;
    wiringPiSetup( );
    init_pin ();
    for (i=0; i < 10; i++)
    {
        clear_pin();
        set_pin (i);
        delay(1000);
    }
    return 0;
}

 

코드를 작성하였다면, gcc를 이용해 컴파일하고 실행시켜보겠습니다.

 

pi@raspberrypi:~ $ gcc -o wiringseg wiringseg.c -lwiringPi
pi@raspberrypi:~ $ sudo ./wiringseg

 

위의 명령어를 통해 프로그램을 실행시켜 1초마다 숫자가 점진적으로 증가되며 표시됨을 확인 할 수 있습니다.

 

LED dot matrix

  • 2차원 매트릭스 형태로 LED를 배열하여 정보를 표시
    - 안내판, 전광판 등에 활용
  • LED matrix
    - LED (다이오드)의 집합: Anode-type 과 Cathode-type 으로 구분됨
    - 밝게 표시하고 싶은 LED의 행/열 위치에 맞추어, 적절한 핀에 신호를 입력
    - 매트릭스의 모든 LED를 한번에 제어하는 것이 아니라, 순차적으로 하나씩 제어함.
  • 8x8 dot matrix
    - 총 16개 핀으로 구성 (8 row pins, 8 col pins)
  • 돌기가 있는 방향이 하단부임.
    - 하단 좌측 à 우측 방향으로 1~8번 핀
    - 상단 우측 à 좌측 방향으로 9~16번핀
  • Cathode-type matrix 제어 예시
    - <2,3> 위치의 LED On: Pin 14 (Row 2) 를 HIGH, Pin 4 (Col 3) 을 LOW 신호 인가
    - 두 접점간 전위차 발생으로 전류가 흐르고 LED가 발광함.

LED dot matrix 실습

LED dot matrix 실습은 SZ411288 matrix (Cathode-type) 를 활용하여 진행해보도록 하겠습니다.

실습에 필요한 회로도 입니다.

 

 

dotmatrix.c 라는 c파일을 만들어 코드를 작성해보겠습니다.

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define C1 4
#define C2 7
#define C3 0
#define C4 24
#define C5 3
#define C6 6
#define C7 16
#define C8 15
#define R1 25
#define R2 1
#define R3 13
#define R4 5
#define R5 8
#define R6 12
#define R7 9
#define R8 2
#define PERIOD 0.1 // delay (s)

int rows[8] = {R1, R2, R3, R4, R5, R6, R7, R8};
int cols[8] = {C1, C2, C3, C4, C5, C6, C7, C8};

void clear_pin() {
    wiringPiSetup();
    for (int i = 0; i < 8; i++) {
        pinMode(rows[i], OUTPUT);
        pinMode(cols[i], OUTPUT);
        digitalWrite(rows[i], LOW);
        digitalWrite(cols[i], HIGH);
    }
}

int matrix[10][8][8]={
    {
        {0,0,1,1,1,0,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,0,1,1,1,0,0,0}
    },
    {
        {0,0,0,1,0,0,0,0},
        {0,0,1,1,0,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,1,1,1,0,0,0}
    },
    {
        {0,0,1,1,1,0,0,0},
        {0,1,0,0,0,1,0,0},
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,1,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,1,0,0,0,0,0},
        {0,1,1,1,1,1,0,0}
    },
    {
        {0,0,1,1,1,0,0,0},
        {0,1,0,0,0,1,0,0},
        {0,0,0,0,0,1,0,0},
        {0,0,1,1,1,1,0,0},
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,0,1,1,1,0,0,0}
    },
    {
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,1,1,0,0},
        {0,0,0,1,0,1,0,0},
        {0,0,1,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,1,1,1,1,1,0},
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,0,1,0,0}
    },
    {
        {0,1,1,1,1,1,0,0},
        {0,1,0,0,0,0,0,0},
        {0,1,0,0,0,0,0,0},
        {0,1,1,1,1,1,0,0},
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,0,1,1,1,1,0,0}
    },
    {
        {0,0,1,1,1,0,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,0,0,0},
        {0,1,1,1,1,0,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,1,0,0,0,1,0,0},
        {0,0,1,1,1,0,0,0}
    },
    {
        {0,0,1,1,1,1,1,0},
        {0,0,0,0,0,0,1,0},
        {0,0,0,0,0,0,1,0},
        {0,0,0,0,0,1,0,0},
        {0,0,0,0,1,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,0,1,0,0,0,0},
        {0,0,0,1,0,0,0,0}
    },
    {
        {0,0,0,1,1,1,0,0},
        {0,0,1,0,0,0,1,0},
        {0,0,1,0,0,0,1,0},
        {0,0,0,1,1,1,0,0},
        {0,0,1,0,0,0,1,0},
        {0,0,1,0,0,0,1,0},
        {0,0,1,0,0,0,1,0},
        {0,0,0,1,1,1,0,0}
    },
    {
        {0,0,0,1,1,1,0,0},
        {0,0,1,0,0,0,1,0},
        {0,0,1,0,0,0,1,0},
        {0,0,1,0,0,0,1,0},
        {0,0,0,1,1,1,1,0},
        {0,0,0,0,0,0,1,0},
        {0,0,1,0,0,0,1,0},
        {0,0,0,1,1,1,0,0}
    }
};

void display(int num) {
    for (int i = 0; i < 8; i++) {
        digitalWrite(rows[i], HIGH);
        for (int j = 0; j < 8; j++){
            if(matrix[num][i][j]) digitalWrite(cols[j], LOW);
            delay(0.1);
            digitalWrite(cols[j],HIGH);
        }
        digitalWrite(rows[i], LOW);
    }
}
void show(int num){
    clock_t start_t = clock();
    while(PERIOD >= (double)(clock() - start_t)/CLOCKS_PER_SEC){
        display(num);
    }
}
int main(void) {
    clear_pin();
    int num;
    for(;;)
    {
        scanf("%d",&num);
        show(num);
    } 
    return 0;
}

 

코드를 작성하였다면, gcc를 이용해 컴파일하고 실행시켜보겠습니다.

 

pi@raspberrypi:~ $ gcc -o dot dotmatrix.c -lwiringPi
pi@raspberrypi:~ $ sudo ./dot

 

위의 명령어를 통해 프로그램을 실행시켜 일정시간 간격으로 숫자가 변하며 출력됨을 확인 할 수 있습니다.

'Embedded > Raspberry PI' 카테고리의 다른 글

PWM 실습  (4) 2024.01.03
Serial Interfaces  (2) 2023.12.28
Raspberry PI GPIO 실습(2)  (0) 2023.12.22
Raspberry PI GPIO 실습(1)  (0) 2023.12.21
Raspberry PI 실습에 사용한 Tool  (0) 2023.12.21