본문 바로가기

연구 노트/Embedded

Node.js로 라즈베리파이 GPIO 제어하기 (Blink)

라즈베리파이에서 GPIO를 제어하기 위해 흔히 쓰는 라이브러리로 WiringPi가 있습니다. WiringPi는 C로 만들어진 라이브러리여서 Node.js에서 바로 사용할 수 없습니다.

Node.js의 패키지 관리자인 npm에서 WiringPi를 검색해보면 꽤 많은 패키지가 나옵니다. 하지만 제대로 동작하지 않는 것도 있었습니다. 제가 시도해본 것은 'wiring-pi' 'node-wiring-pi', 'rpio', 'onoff' 인데, 이 중에서 제대로 동작한 것은 'rpio'와 'onoff' 입니다. 저는 둘 중에서 'onoff'를 사용하기로 하였습니다.

'onoff'를 선택한 이유

'rpio'와 'onoff' 중에 'onoff'를 선택한 가장 큰 이유는 인터럽트 가능 여부입니다. 'rpio'는 공식적으로 GPIO 인터럽트를 사용하지 못하게 되어있습니다. 그 대신 폴링 방식으로 GPIO 입력을 감지하는 구조로 만들어져 있죠. 심지어 몇 가지 시스템 설정을 따로 해줘야 하는 수고로움도 있었습니다.

한편 'onoff'는 패키지를 설치하면 바로 사용할 수 있고, GPIO 입력 인터럽트도 감지할 수 있습니다. 사실 깊게 들어가면 진짜 인터럽트는 아닌 듯 합니다. 그러나 'epoll'이라는 패키지를 이용해 커널과 긴밀하게 연동되어 꽤 괜찮은 인터럽트 성능을 보여준다고 합니다. 'onoff' 공식 페이지에 벤치마크 결과도 자세히 공개되어있어 그 내용을 참고해보면 되겠습니다. 그래서 저는 인터럽트를 사용할 수 있고 성능이 좋은 'onoff'를 사용하기로 했습니다.

'onoff' 패키지 설치

npm i onoff        # i 대신에 install을 쓸 수 있습니다.

위 명령으로 쉽게 패키지를 설치할 수 있습니다. 만약 라즈베리파이에 Node.js가 설치되어 있지 않다면 라즈베리파이에 Node.js 설치하기를 참고하시기 바랍니다.

Blink 코드 작성

// 파일명: blink.js

const Gpio = reauire('onoff').Gpio;
const led = new Gpio(17, 'out');    // GPIO 번호: 17
var value = 1;

setInterval(function() {
    led.write(value);
    value = +!value;
}, 1000);

위 코드는 GPIO 17번 핀으로 LED를 깜빡이게 하는 코드입니다. 17번 핀 위치는 아래 그림에서 확인하세요.

라즈베리파이 핀 맵

Blink 실행

node blink.js

코드와 회로가 정상이면 1초마다 LED가 꺼졌다 켜졌다 반복할 것입니다.