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;
}
🔹 동작 방식
- wiringPiSetup(); → wiringPi 초기화
- pinMode(LED_PIN, OUTPUT); → GPIO 0번을 출력 모드로 설정
- digitalWrite(LED_PIN, HIGH); → LED 켜기
- delay(500); → 0.5초 대기
- digitalWrite(LED_PIN, LOW); → LED 끄기
- 위 과정이 무한 루프에서 반복되어 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;
}
🔹 동작 방식
- gpioInitialise(); → pigpio 초기화
- gpioSetMode(BUTTON_PIN, PI_INPUT); → GPIO 17번을 입력 모드로 설정
- gpioRead(BUTTON_PIN); → 버튼 상태 읽기 (0: 눌림, 1: 눌리지 않음)
- gpioDelay(500000); → 0.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 활용 목적에 따라 적절한 라이브러리를 선택하면 더욱 효율적인 개발이 가능. 🚀
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (1. U-Boot 개요 및 기본 개념 / U-Boot란?) (0) | 2025.02.26 |
---|---|
GPIO 프로그래밍 개요 - 4. GPIO 핀 모드 설정 (INPUT, OUTPUT) (0) | 2025.02.25 |
GPIO 프로그래밍 개요 - 2. 직접 제어 방식 (sysfs 인터페이스 활용) (0) | 2025.02.25 |
GPIO 프로그래밍 개요 - 1. GPIO 접근 방식 개요 (0) | 2025.02.25 |
LoRa - 8. 마무리 및 실전 응용 (0) | 2025.02.25 |