본문 바로가기
Embedded/Raspberry PI

Raspberry PI GPIO 실습(1)

by kjy1010 2023. 12. 21.

라즈베리파이의 GPIO를 이용해 실습을 진행하겠습니다.

라즈베리파이 GPIO가 무엇인지 알아보고, 실습에 필요한 Library와 장비를 소개하겠습니다.

 

I/O

  • 임베디드 시스템은 일반적으로 물리 세계와 상호작용함
  • 시스템은 다양한 형태의 입력 (Input) 및 출력 (Output) 장치들로 구성됨
    - Input device: 키보드, 마우스, 온습도 센서, 가속도 센서, …
    - Output device: 모니터, 프린터, 스피커, 모터, LED matrix, …

GPIO

  • General Purpose Input/Output의 약어로 범용 입출력을 위한 포트를 뜻함.
  • Arduino, Raspberry PI 와 같은 임베디드 보드에서 외부 하드웨어와의 연결을 위하여 활용.
  • 입력 또는 출력 모드를 지정하여 활용 가능.

GPIO on Raspberry PI

 

  • Rpi4 40개의 단자 (pin) 중, 26 개의 GPIO 단자가 존재함.
  • 일부 GPIO 단자는 다른 인터페이스로 활용 가능.
    - UART, I2C, SPI, PWM
  • Rpi GPIO는 3.3v 전원 사용함.
    - 소프트웨어를 통해 3.3v 신호의 High/Low를 제어할 수 있음.
    - High/Low 신호를 다양하게 조합하여 복잡한 제어 논리 구성

실습을 진행할때 WiringPi Library를 사용하였습니다. WiringPi Library에 대해 설명을 진행하도록 하겠습니다.

 

WiringPi Library

  • GPIO interface library입니다.
  • Braodcom 계열 CPU 에서 GPIO 활용을 도와주는 C library
  • 아두이노와 유사한 문법을 사용하여 손쉽게 GPIO 사용 가능
  • WiringPi 핀번호와 GPIO 핀번호가 다르기에 주의해서 사용해야합니다.

Wiring Pin번호

WiringPi  Library 설치

WiringPi Library를 사용하기 위해 라즈베리파이에 설치하는 방법을 알아보겠습니다.

 

pi@raspberrypi:~ $ git clone https://github.com/wiringpi/wiringpi.git
Cloning into 'wiringpi'...
…..
Receiving objects: 100% (1733/1733), 803.21 KiB | 10.30 MiB/s, done.
Resolving deltas: 100% (1188/1188), done.

 

위와 같은 과정을 통해 설치가 완료되었다면 정상적으로 설치가 되었는지 확인해야합니다.

 

이제 실습에 필요한 부품을 소개하고 진행과정에 대해 소개하는 순서로 설명드리겠습니다.

 

Breadboard

  • 제품의 프로토타입 / 간이 회로 등을 만들 때, 쉽게 회로를 구성할 수 있는 기능을 제공하는 회로 제작 기판
  • 그림과 같이, 내부가 연결되어 전류가 흐름 (초록색 선).
  • 일반적으로 A 영역 (bus strip)에 전원, B/C 영역 (terminal strip)에 소자를 연결하여 제어하는 데에 사용됨.
    - 특히, bus strip은 전원선 (+, 빨간색)과 접지선 (-, 파란색)으로 구성되어 있음

LED

  • Light Emitting Diode의 약어로 빛을 발산하는 전기소자이다.
  • 빨강/파랑/초록 빛의 삼원색을 이용하여 자연색을 구현
  • LED 소자는 발광부, 양극 (Anode), 음극 (Cathode) 로 구성됨.
    - 다리가 긴 쪽이 양극, 짧은 쪽이 음극.
  • 전류는 VCC (전원) à GND (접지) 로 흐름.
    - LED의 양극을 VCC, 음극을 GND와 연결.

저항 (Resistance)

  • 전기의 흐름을 방해하는 부품
  • 전기회로 안에서 전기의 흐름을 제한하여 회로 안에서의 전류(또는 전압)의 크기를 낮춤
  • 각 소자들은 각각의 임계 전압이 있어서 너무 많은 전류가 흐르면 즉시 소손되기 때문에, 저항으로 전압을 낮춰야 함
  • 저항을 선택하는 방법
    - R_min = (U_a – U_b) / I_max
    - R_min : 사용할 최소 저항, 옴 (Ω)으로 표시
    - U_a : 전압 (V)으로 표시되는 전원 공급 장치 전압
    - U_b : 소자의 임계 전압, 볼트 (V)로 표시
    - I_max : 암페어 (A)로 표시되는 소자의 최대 전류 강도

LED 실습

LED를 제어하는 실습을 진행해보겠습니다.

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

 

wiringled.c라는 프로그램을 만들어 코드를 작성해보겠습니다.

 

#include <wiringPi.h> /* wiringPi 라이브러리를 위한 헤더 파일 */
#include <stdio.h>
#include <stdlib.h> /* atoi( ) 함수 */
int ledControl(int gpio)
    {
    int i;
    pinMode(gpio, OUTPUT); /* Pin의 출력 설정 */
    for (i = 0; i < 5; i++) 
    {
        digitalWrite(gpio, HIGH); /* HIGH(1) 값을 출력: LED 켜기 */
        delay(1000); /* 1초(1000밀리초) 동안 대기 */
        digitalWrite(gpio, LOW); /* LOW(0) 값을 출력: LED 끄기 */
        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( ); /* wiringPi 초기화 */
    ledControl(gno);
    return 0;
}

 

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

 

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

 

위의 명령어를 통해 프로그램을 실행시켜 LED를 5회 깜빡인후 종료시킬 수 있습니다.

 

Switch

  • 회로를 물리적으로 연결 또는 차단하여 전기의 흐름을 제어
  • On (1): 전기가 흐름
  • Off (0): 전기가 차단
  • Tact switch : 버튼을 누르는 동안 On, 누르지 않는 동안 Off

Switch 실습

Switch를 제어하는 실습을 진행해보겠습니다.

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

 

 

wiringswitch.c라는 프로그램을 만들어 코드를 작성해보겠습니다.

 

#include <wiringPi.h>
#include <stdio.h>
#define SW 5 /* GPIO24 */
#define LED 1 /* GPIO18 */

int switchControl( )
{
    int i;
    pinMode(SW, INPUT); /* Pin 모드를 입력으로 설정 */
    pinMode(LED, OUTPUT);
    for (;;) 
    { /* 스위치의 확인을 위해 무한 루프를 수행한다. */
        if(digitalRead(SW) == LOW) 
        { 	/* Push 버튼이 눌러지면(LOW) */
            digitalWrite(LED, HIGH); /* LED 켜기(On) */
            delay(1000);
            digitalWrite(LED, LOW); /* LED 끄기(Off) */
        }
        delay(10); /* Ctrl+C 등의 이벤트를 감지하기 위해 잠시 쉰다. */
    }
    return 0;
}

int main(int argc, char **argv)
{
    wiringPiSetup( );
    switchControl( ); /* 스위치 사용을 위한 함수 */
    return 0;
}

 

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

 

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

 

위의 명령어를 통해 프로그램을 실행시켜 스위치를 누르면 LED가 켜지고, 떼면 꺼지도록 제어 할 수 있습니다.

 

 

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

Raspberry PI GPIO 실습(3)  (2) 2023.12.27
Raspberry PI GPIO 실습(2)  (0) 2023.12.22
Raspberry PI 실습에 사용한 Tool  (0) 2023.12.21
Raspberry PI Setup  (0) 2023.12.20
Raspberry PI 란?  (2) 2023.12.20