Responsive Advertisement

Node.js와 Raspberry Pi로 LED와 버튼 제어하기: GPIO 핀 가이드

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를 활용해 더 많은 프로젝트를 시도해 보세요!

댓글 쓰기