Responsive Advertisement

Node.js와 Raspberry Pi로 흐르는 LED 제어하기: GPIO 핀 가이드

Raspberry Pi의 GPIO 핀을 사용하면 다양한 하드웨어 제어 프로젝트를 진행할 수 있습니다. 이번 글에서는 Node.js를 사용하여 LED 여러 개를 순차적으로 켜고 끄는 흐르는 LED 효과를 구현하는 방법을 설명하겠습니다. 이 예제는 GPIO 핀 제어의 기본을 익히고, 다양한 LED 제어 패턴을 배우는 데 유용합니다.

준비물

흐르는 LED 프로젝트를 진행하기 위해 필요한 준비물은 다음과 같습니다:

  • Raspberry Pi (모델에 상관없이 가능)
  • LED 4개
  • 저항 4개 (330Ω)
  • 브레드보드와 점퍼 케이블

회로 구성

Raspberry Pi의 GPIO 핀에 LED 4개를 다음과 같이 연결합니다:

  • 각 LED의 긴 다리(양극)를 330Ω 저항을 거쳐 Raspberry Pi의 GPIO 핀에 연결합니다 (GPIO 17, 18, 27, 22).
  • 각 LED의 짧은 다리(음극)를 Raspberry Pi의 GND 핀에 연결합니다.

이제 LED가 순차적으로 켜지고 꺼지는 흐르는 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와 onoff 패키지를 사용해 이제 GPIO 핀을 제어할 준비가 완료되었습니다.

Node.js 코드 작성: 흐르는 LED 구현

아래 코드는 GPIO 핀에 연결된 4개의 LED를 순차적으로 켜고 끄는 흐르는 LED 효과를 구현하는 예제입니다.

// flowing_leds.js

const Gpio = require('onoff').Gpio;  // onoff 패키지 임포트
const leds = [                       // LED를 제어할 GPIO 핀 설정
    new Gpio(17, 'out'),
    new Gpio(18, 'out'),
    new Gpio(27, 'out'),
    new Gpio(22, 'out')
];

let currentLed = 0;  // 현재 켜진 LED를 추적하는 변수

// 모든 LED를 꺼주는 함수
const turnOffAllLeds = () => {
    leds.forEach(led => led.writeSync(0));
};

// LED를 순차적으로 켜고 끄는 함수
const flowLeds = setInterval(() => {
    turnOffAllLeds();         // 먼저 모든 LED를 끔
    leds[currentLed].writeSync(1);  // 현재 LED를 켬
    console.log(`LED ${currentLed + 1} ON`);
    
    currentLed = (currentLed + 1) % leds.length;  // 다음 LED로 이동
}, 500);  // 500ms 간격으로 LED가 순차적으로 켜짐

// 프로그램 종료 시 GPIO 리소스 해제
process.on('SIGINT', () => {
    clearInterval(flowLeds);   // 인터벌 정지
    turnOffAllLeds();          // 모든 LED 끔
    leds.forEach(led => led.unexport());  // GPIO 리소스 해제
    console.log('프로그램 종료, GPIO 리소스 해제 완료');
    process.exit();
});

이 코드는 setInterval()을 사용해 LED를 순차적으로 켜고 끕니다. 500ms 간격으로 LED가 흐르는 효과를 나타냅니다.

코드 실행하기

GPIO 핀을 제어하려면 루트 권한이 필요하므로, 다음과 같이 sudo 명령어를 사용해 코드를 실행합니다.

$ sudo node flowing_leds.js

이 명령어를 실행하면 4개의 LED가 500ms 간격으로 순차적으로 켜지고 꺼집니다. Ctrl + C로 프로그램을 종료하면 모든 LED가 꺼지고, GPIO 리소스가 안전하게 해제됩니다.

코드 설명

위 코드에서 사용된 주요 기능은 다음과 같습니다:

  • Gpio 클래스: onoff 패키지의 Gpio 클래스를 사용해 각 GPIO 핀을 제어합니다. 17, 18, 27, 22번 핀에 연결된 LED를 출력 모드로 설정합니다.
  • flowLeds 함수: setInterval()을 사용하여 500ms 간격으로 LED를 순차적으로 켜고 끕니다.
  • turnOffAllLeds 함수: 각 루프가 실행될 때 모든 LED를 끄고, 그다음 켜질 LED를 지정합니다.
  • SIGINT 이벤트 처리: Ctrl + C로 프로그램이 종료될 때 모든 LED를 끄고 GPIO 리소스를 해제합니다.

GPIO 제어 확장

이 예제는 기본적인 흐르는 LED 구현이지만, Raspberry Pi와 Node.js를 사용해 더 복잡한 프로젝트로 확장할 수 있습니다:

  • 멀티 컬러 LED 제어: RGB LED를 사용해 다양한 색상을 순차적으로 표시하는 프로젝트를 만들 수 있습니다.
  • PWM을 사용한 LED 밝기 제어: PWM(펄스 폭 변조) 신호를 사용해 LED의 밝기를 조절하여 점점 밝아지거나 어두워지는 효과를 구현할 수 있습니다.
  • 센서와 연동: 온도 센서, 거리 센서 등의 데이터를 기반으로 LED의 상태를 제어할 수 있습니다.

결론

이번 글에서는 Node.js와 Raspberry Pi를 사용해 흐르는 LED 효과를 구현하는 방법을 알아보았습니다. 이 예제는 GPIO 핀을 활용한 하드웨어 제어의 기본 개념을 다루며, 이를 바탕으로 더 복잡한 프로젝트로 확장할 수 있습니다. Raspberry Pi와 Node.js로 여러분만의 창의적인 LED 제어 프로젝트를 만들어 보세요!

댓글 쓰기