GPIO 프로그래밍 개요 - 1. GPIO 접근 방식 개요

2025. 2. 25. 19:48프로그래밍/시스템

GPIO 프로그래밍 개요

GPIO 프로그래밍을 통해 센서 입력을 읽거나, LED·모터 등 외부 장치를 제어할 수 있다.
이를 위해 GPIO를 프로그래밍하는 여러 방법이 있으며, 주로 직접 제어 방식과 라이브러리 활용 방식이 있다.


1. GPIO 접근 방식 개요

GPIO(General Purpose Input/Output)는 센서 입력을 읽거나 LED, 모터, 릴레이 등의 외부 장치를 제어하는 데 사용된다.
이러한 GPIO를 제어하는 방식에는 크게 두 가지 방법이 있다.


1️⃣ 직접 제어 방식 (sysfs 인터페이스 활용)

리눅스에서는 sysfs라는 가상 파일 시스템을 통해 하드웨어를 제어할 수 있다.
이를 이용하면 별도의 라이브러리 없이 터미널 명령어 또는 C/C++ 코드를 통해 GPIO 핀을 제어할 수 있다.

✔ sysfs 인터페이스란?

  • 리눅스 커널이 제공하는 파일 시스템 기반의 하드웨어 제어 인터페이스.
  • /sys/class/gpio/ 디렉터리를 통해 GPIO 핀을 활성화, 방향 설정, 값 읽기/쓰기가 가능함.
  • echo, cat 명령어를 이용하여 터미널에서 쉽게 GPIO를 조작할 수 있음.

📌 sysfs를 이용한 GPIO 제어 방법

1. GPIO 핀 활성화 (export)

echo 17 > /sys/class/gpio/export

🔹 GPIO 17번 핀을 활성화하여 사용할 준비를 함.

2. 핀 방향 설정 (입력/출력)

echo out > /sys/class/gpio/gpio17/direction  # 출력 모드
echo in > /sys/class/gpio/gpio17/direction   # 입력 모드

🔹 GPIO 핀을 출력(out) 또는 입력(in) 모드로 설정.

3. 출력 값 설정 (HIGH/LOW)

echo 1 > /sys/class/gpio/gpio17/value  # HIGH (3.3V 또는 5V 출력)
echo 0 > /sys/class/gpio/gpio17/value  # LOW (0V 출력)

🔹 GPIO 핀에 HIGH(1) 또는 LOW(0) 값을 설정하여 LED를 켜거나 끌 수 있음.

4. 입력 값 읽기

cat /sys/class/gpio/gpio17/value

🔹 GPIO 17번 핀의 값을 읽어 버튼 상태 등을 확인할 수 있음.

5. GPIO 핀 비활성화 (unexport)

echo 17 > /sys/class/gpio/unexport

🔹 사용이 끝난 GPIO 핀을 비활성화하여 시스템에서 해제.


✅ sysfs 방식의 장점

추가 라이브러리 없이 사용 가능 → 표준 리눅스 환경에서 바로 적용 가능.
터미널 명령어(echo, cat)만으로 쉽게 제어 가능 → 스크립트로 자동화 가능.
리눅스 기반의 다양한 보드에서 공통적으로 사용 가능.

❌ sysfs 방식의 단점

속도가 느림 → 파일 시스템을 이용한 접근 방식이므로 빠른 응답이 필요할 때 적합하지 않음.
복잡한 기능 구현이 어려움 → PWM(펄스 폭 변조) 같은 고속 신호 제어는 지원하지 않음.
최신 커널에서 지원 중단됨(Deprecated) → Raspberry Pi OS 최신 버전에서는 기본적으로 지원되지 않음.


2️⃣ 라이브러리 활용 방식 (wiringPi, pigpio 등)

sysfs 방식은 속도가 느리고 불편하기 때문에, 보통은 GPIO 라이브러리를 사용하여 더 쉽고 빠르게 제어한다.
대표적인 GPIO 라이브러리는 다음과 같다.

라이브러리 지원 언어 주요 특징
wiringPi C, C++ 간단한 API 제공, Raspberry Pi에서 널리 사용됨
pigpio C, C++, Python 고속 GPIO 제어, 멀티스레드 지원, PWM 기능 강화
RPi.GPIO Python 라즈베리파이 전용 GPIO 제어 라이브러리

📌 wiringPi 라이브러리 활용

wiringPi는 C언어 기반 GPIO 라이브러리로, digitalWrite, digitalRead 등의 API를 제공하여 쉽고 빠르게 GPIO를 제어할 수 있다.

🔧 wiringPi를 이용한 LED 제어 예제 (C++)

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

#define LED_PIN 0  // wiringPi 기준 GPIO 0번 (BCM 기준 GPIO 17번)

int main() {
    wiringPiSetup();  // wiringPi 초기화
    pinMode(LED_PIN, OUTPUT);  // GPIO 핀을 출력 모드로 설정

    while (1) {
        digitalWrite(LED_PIN, HIGH);  // LED ON
        delay(500);
        digitalWrite(LED_PIN, LOW);   // LED OFF
        delay(500);
    }
    return 0;
}

장점: digitalWrite, digitalRead 등 직관적인 API 제공.
단점: Raspberry Pi OS 최신 버전에서 기본적으로 제공되지 않으며, 추가 설치가 필요함.


📌 pigpio 라이브러리 활용

pigpio는 고속 GPIO 제어 및 PWM(서보 모터 제어) 기능이 뛰어난 라이브러리이다.

🔧 pigpio를 이용한 버튼 입력 예제 (C++)

#include <pigpio.h>
#include <stdio.h>

#define BUTTON_PIN 17  // BCM 기준 GPIO 17번

int main() {
    if (gpioInitialise() < 0) {
        printf("pigpio 초기화 실패\n");
        return 1;
    }

    gpioSetMode(BUTTON_PIN, PI_INPUT);  // GPIO를 입력 모드로 설정

    while (1) {
        int state = gpioRead(BUTTON_PIN);
        printf("버튼 상태: %d\n", state);
        gpioDelay(500000);  // 0.5초 대기
    }

    gpioTerminate();
    return 0;
}

장점: 빠른 속도, 멀티스레드 지원, PWM 기능 강화.
단점: wiringPi보다 코드가 다소 복잡하며, 추가 설치가 필요함.


✅ 라이브러리 방식의 장점

코드가 간결하고 사용이 쉬움 → digitalWrite, digitalRead 등의 직관적인 API 제공.
속도가 빠름 → sysfs 방식보다 훨씬 빠르게 GPIO를 제어할 수 있음.
PWM, 인터럽트 등 복잡한 기능 지원 → 모터 제어, 센서 데이터 수집 등에 유용함.

❌ 라이브러리 방식의 단점

특정 라이브러리에 의존적 → 지원이 중단되면 대체 라이브러리로 변경해야 함.
설치 과정이 필요할 수 있음 → 일부 라이브러리는 수동 설치가 필요함.


📌 직접 제어 vs 라이브러리 방식 비교

방식 장점  단점
직접 제어 (sysfs) 추가 라이브러리 필요 없음, 표준 리눅스 환경에서 사용 가능 속도가 느림, 최신 커널에서 지원 중단됨
라이브러리 활용 (wiringPi, pigpio 등) 코드가 간결함, 속도가 빠름, PWM·인터럽트 기능 지원 특정 라이브러리에 의존적, 설치 과정 필요

결론

  • GPIO를 제어하는 방식에는 직접 제어 방식(sysfs)라이브러리 활용 방식(wiringPi, pigpio 등) 이 있다.
  • 직접 제어 방식은 추가 라이브러리 없이 표준 리눅스 환경에서 사용 가능하지만, 속도가 느리고 최신 커널에서 지원 중단됨.
  • 라이브러리 방식은 코드가 간결하고 속도가 빠르며, PWM·인터럽트 같은 고급 기능을 지원하지만 특정 라이브러리에 의존적임.
  • 일반적으로 간단한 프로젝트는 wiringPi, 고속 제어가 필요하면 pigpio를 사용하는 것이 유리함. 🚀