Raspberry Pi는 GPIO(General Purpose Input/Output) 핀을 사용해 다양한 하드웨어를 제어할 수 있습니다. 이번 글에서는 Node.js를 이용해 Raspberry Pi의 GPIO 핀을 통해 LED와 푸시 버튼을 제어하는 방법을 설명합니다. 버튼을 눌러 LED를 켜고, 버튼을 떼면 LED가 꺼지는 간단한 프로젝트를 진행해 보겠습니다.
준비물
이 프로젝트를 위해 필요한 준비물은 다음과 같습니다:
- Raspberry Pi (모델에 상관없이 가능)
- LED 1개
- 푸시 버튼 1개
- 저항 (330Ω, 10kΩ)
- 브레드보드와 점퍼 케이블
회로 구성
먼저 Raspberry Pi의 GPIO 핀에 LED와 버튼을 연결합니다. 아래 설명대로 회로를 구성합니다:
- LED의 긴 다리(양극)를 330Ω 저항을 통해 GPIO 17번 핀에 연결합니다.
- LED의 짧은 다리(음극)를 Raspberry Pi의 GND(Ground) 핀에 연결합니다.
- 푸시 버튼의 한쪽을 10kΩ 저항을 통해 GND 핀에 연결합니다.
- 푸시 버튼의 다른 쪽을 GPIO 18번 핀에 연결합니다.
이제 버튼을 눌렀을 때 GPIO 18번 핀을 통해 신호를 읽고, GPIO 17번 핀을 통해 LED를 제어할 수 있게 되었습니다.
Node.js와 onoff 패키지 설치
Raspberry Pi의 GPIO 핀을 제어하기 위해 onoff
패키지를 사용합니다. 먼저 Node.js와 onoff
패키지를 설치합니다.
1. Node.js 설치
$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt install -y nodejs
2. onoff 패키지 설치
$ npm install onoff
이제 Node.js와 GPIO 제어를 위한 onoff
패키지가 준비되었습니다.
Node.js 코드 작성: LED와 버튼 제어
아래 코드는 푸시 버튼을 눌렀을 때 GPIO 17번 핀에 연결된 LED를 켜고, 버튼을 떼면 LED를 끄는 예제입니다.
// led_button_control.js
const Gpio = require('onoff').Gpio; // onoff 패키지 임포트
const led = new Gpio(17, 'out'); // GPIO 17번 핀을 출력 모드로 설정 (LED 제어)
const button = new Gpio(18, 'in', 'both'); // GPIO 18번 핀을 입력 모드로 설정 (버튼 입력)
// 버튼을 눌렀을 때의 이벤트 처리
button.watch((err, value) => {
if (err) {
console.error('GPIO 입력 중 오류 발생:', err);
return;
}
led.writeSync(value); // 버튼이 눌리면 LED 켜기 (1), 떼면 LED 끄기 (0)
console.log(value === 1 ? 'LED ON' : 'LED OFF');
});
// 프로그램 종료 시 GPIO 리소스 해제
process.on('SIGINT', () => {
led.writeSync(0); // 프로그램 종료 시 LED 끄기
led.unexport(); // GPIO 리소스 해제
button.unexport();
console.log('프로그램 종료, GPIO 리소스 해제 완료');
});
이 코드는 푸시 버튼에서 발생하는 입력 신호를 감지하고, 그 신호에 따라 LED를 제어합니다. watch()
함수는 버튼을 눌렀을 때(1)와 뗐을 때(0)의 이벤트를 감지합니다.
코드 실행하기
GPIO 핀을 제어하려면 루트 권한이 필요하므로, 다음과 같이 sudo
명령어를 사용해 코드를 실행합니다.
$ sudo node led_button_control.js
프로그램을 실행한 후, 버튼을 누르면 LED가 켜지고, 버튼을 떼면 LED가 꺼지는 것을 확인할 수 있습니다. Ctrl + C
로 프로그램을 종료하면 GPIO 리소스가 안전하게 해제됩니다.
코드 설명
위 코드에서는 몇 가지 중요한 부분이 있습니다:
- Gpio 클래스:
onoff
패키지의Gpio
클래스를 사용해 GPIO 핀을 제어합니다. 17번 핀은 출력 모드로, 18번 핀은 입력 모드로 설정됩니다. - watch() 메서드: 버튼의 상태 변화를 감지하는 이벤트 리스너입니다. 버튼이 눌리거나 떼어질 때마다 호출됩니다.
- writeSync() 메서드: GPIO 핀에 값을 동기적으로 쓰는 메서드로, 1은 LED를 켜고, 0은 끕니다.
- SIGINT 이벤트 처리: 프로그램이 종료될 때(예:
Ctrl + C
입력 시), GPIO 리소스를 해제하여 안전하게 종료합니다.
GPIO 확장 가능성
이 프로젝트는 GPIO 핀을 제어하는 기본 예제이지만, Node.js와 Raspberry Pi를 사용하여 더 복잡한 프로젝트를 확장할 수 있습니다. 예를 들어, 다음과 같은 프로젝트를 시도해볼 수 있습니다:
- 멀티 버튼 제어: 여러 버튼을 추가하여 각 버튼마다 다른 LED를 켜고 끄는 시스템을 구축할 수 있습니다.
- 센서와의 연동: 온도, 습도, 거리 센서 등 다양한 센서와 연동하여 데이터를 수집하고, 그에 맞춰 GPIO 핀을 제어할 수 있습니다.
- 스마트 홈 시스템: 버튼을 사용하여 조명을 제어하거나, 원격으로 Raspberry Pi와 통신해 다양한 가전기기를 제어하는 스마트 홈 시스템을 구현할 수 있습니다.
결론
이번 글에서는 Raspberry Pi와 Node.js를 사용하여 GPIO 핀을 제어하고, 푸시 버튼과 LED를 연동하는 방법을 알아보았습니다. 이 예제는 하드웨어 제어의 기본으로, 이를 바탕으로 다양한 IoT 및 스마트 홈 프로젝트를 확장할 수 있습니다. Node.js와 Raspberry Pi를 활용해 더 많은 프로젝트를 시도해 보세요!
댓글 쓰기