GPIO 프로그래밍 개요 - 3. 라이브러리 활용 (wiringPi, pigpio 등)

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

3. 라이브러리 활용 (wiringPi, pigpio 등)

직접 제어 방식(sysfs)은 속도가 느리고 코드가 복잡하므로, 일반적으로 GPIO를 제어할 때 라이브러리를 활용하는 것이 더 효율적이다.
라이브러리를 사용하면 더 간단하고 빠르게 GPIO를 제어할 수 있으며, PWM(펄스 폭 변조), 인터럽트(Interrupt) 같은 고급 기능도 쉽게 활용할 수 있다.

대표적인 GPIO 제어 라이브러리로는 wiringPi, pigpio가 있으며, 각 라이브러리는 특정한 장점과 차이점을 가지고 있다.


📌 wiringPi 라이브러리

wiringPi는 C언어 기반 GPIO 제어 라이브러리로, 라즈베리파이에서 널리 사용되었다.
하지만 라즈베리파이 OS 최신 버전(2020년 이후)에서는 기본 제공되지 않으며, 직접 설치해야 한다.

✔ wiringPi 특징

C언어 기반으로 GPIO를 쉽게 제어 가능
간단한 API 제공 (digitalWrite, digitalRead 등)
✅ PWM, 인터럽트, I2C, SPI 등 다양한 기능 지원
라즈베리파이 최신 OS(Raspberry Pi OS Bullseye 이후)에서는 기본 제공되지 않음

🔧 wiringPi 설치 방법 (라즈베리파이 최신 버전)

sudo apt-get install wiringpi  # 최신 버전에서는 직접 설치 필요
gpio -v  # 설치 확인

✅ gpio -v 명령을 실행했을 때 버전 정보가 표시되면 정상 설치된 것.


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

아래 코드는 GPIO를 출력 모드로 설정하고, LED를 깜빡이게 하는 코드이다.

#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
        printf("LED ON\n");
        delay(500);
        digitalWrite(LED_PIN, LOW);   // LED OFF
        printf("LED OFF\n");
        delay(500);
    }
    return 0;
}

🔹 동작 방식

  1. wiringPiSetup(); → wiringPi 초기화
  2. pinMode(LED_PIN, OUTPUT); → GPIO 0번을 출력 모드로 설정
  3. digitalWrite(LED_PIN, HIGH); → LED 켜기
  4. delay(500); → 0.5초 대기
  5. digitalWrite(LED_PIN, LOW); → LED 끄기
  6. 위 과정이 무한 루프에서 반복되어 LED가 0.5초 간격으로 깜빡임

간결한 코드로 GPIO를 쉽게 제어 가능
sysfs 방식보다 빠른 실행 속도 제공
PWM(서보 모터), 인터럽트(버튼 감지) 등의 기능 추가 가능


📌 pigpio 라이브러리

pigpio는 고속 GPIO 제어가 필요한 경우에 적합한 라이브러리이다.
특히 멀티스레드 지원 및 PWM 기능이 뛰어나 모터 제어, 고속 센서 데이터 수집 등에 유용하다.

✔ pigpio 특징

고속 GPIO 신호 처리 가능 (마이크로초 단위 응답 속도)
멀티스레드 지원 → 여러 개의 GPIO를 동시 제어 가능
소프트웨어 PWM, 하드웨어 PWM 모두 지원 (서보 모터, DC 모터 제어 가능)
설치가 필요하며, 코딩이 wiringPi보다 복잡할 수 있음

🔧 pigpio 설치 방법 (라즈베리파이)

sudo apt-get install pigpio
sudo systemctl enable pigpiod  # pigpio 데몬 활성화
sudo systemctl start pigpiod   # pigpio 데몬 시작

✅ pigpiod 데몬을 실행해야 pigpio가 정상 작동함.


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

아래 코드는 GPIO를 입력 모드로 설정하고, 버튼이 눌릴 때마다 상태를 출력하는 코드이다.

#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;
}

🔹 동작 방식

  1. gpioInitialise(); → pigpio 초기화
  2. gpioSetMode(BUTTON_PIN, PI_INPUT); → GPIO 17번을 입력 모드로 설정
  3. gpioRead(BUTTON_PIN); → 버튼 상태 읽기 (0: 눌림, 1: 눌리지 않음)
  4. gpioDelay(500000); → 0.5초 간격으로 상태 출력
  5. 프로그램 종료 시 gpioTerminate(); 를 호출하여 pigpio 정리

고속 GPIO 입력 감지 가능
멀티스레드 환경에서도 안정적인 작동 보장
PWM 기능이 강력하여 모터 제어에 적합


📌 wiringPi vs pigpio 비교

기능  wiringPi pigpio
사용 언어 C, C++ C, C++, Python
실행 속도 빠름 매우 빠름 (마이크로초 단위)
지원 기능 디지털 입출력, PWM, 인터럽트 디지털 입출력, 고속 PWM, 멀티스레드
설치 필요 여부 최신 OS에서는 수동 설치 필요 설치 필요
대표적인 활용 일반적인 GPIO 제어, LED, 버튼 서보 모터, DC 모터, 센서 데이터 고속 처리

일반적인 GPIO 제어(LED, 버튼 입력)에는 wiringPi 사용
고속 GPIO 응답, 모터 제어, 멀티스레드 환경에서는 pigpio 사용


📌 결론

  • wiringPi간단한 GPIO 제어(LED, 버튼, 기본 PWM) 등에 적합하며, 간결한 코드로 작성 가능.
  • pigpio고속 GPIO 처리가 필요하거나, PWM(서보 모터) 및 멀티스레드 환경에서 유용.
  • 라즈베리파이 OS 최신 버전에서는 wiringPi가 기본 제공되지 않으므로 설치가 필요함.
  • GPIO 활용 목적에 따라 적절한 라이브러리를 선택하면 더욱 효율적인 개발이 가능. 🚀