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를 사용하는 것이 유리함. 🚀
'프로그래밍 > 시스템' 카테고리의 다른 글
GPIO 프로그래밍 개요 - 3. 라이브러리 활용 (wiringPi, pigpio 등) (0) | 2025.02.25 |
---|---|
GPIO 프로그래밍 개요 - 2. 직접 제어 방식 (sysfs 인터페이스 활용) (0) | 2025.02.25 |
LoRa - 8. 마무리 및 실전 응용 (0) | 2025.02.25 |
LoRa - 7. LoRa 기술 심화 학습 (7-2. LoRa를 활용한 특수 사례) (0) | 2025.02.25 |
LoRa - 7. LoRa 기술 심화 학습 (7-1. LoRa Mesh 네트워크) (0) | 2025.02.25 |