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 ์ œ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”!

๋Œ“๊ธ€ ์“ฐ๊ธฐ