Responsive Advertisement

Node.js์™€ Raspberry Pi๋กœ LED ๊นœ๋นก์ด๊ธฐ: GPIO ํ•€ ์ œ์–ด ๊ฐ€์ด๋“œ

Raspberry Pi๋Š” ์ €๋ ดํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ์ปดํ“จํ„ฐ๋กœ, ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ GPIO ํ•€์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ „์ž ๊ธฐ๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Raspberry Pi์˜ GPIO ํ•€์„ ์ œ์–ดํ•˜๊ณ , LED๋ฅผ ๊นœ๋นก์ด๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ํ•˜๋“œ์›จ์–ด ์ œ์–ด์˜ ๊ธฐ๋ณธ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค€๋น„๋ฌผ

์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค€๋น„๋ฌผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Raspberry Pi (๋ชจ๋ธ์— ์ƒ๊ด€์—†์ด ๊ฐ€๋Šฅ)
  • LED 1๊ฐœ
  • ์ €ํ•ญ (330ฮฉ)
  • ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์™€ ์ ํผ ์ผ€์ด๋ธ”

์ด์ œ Raspberry Pi์— Node.js๋ฅผ ์„ค์น˜ํ•˜๊ณ , LED๋ฅผ ์ œ์–ดํ•  ์ค€๋น„๋ฅผ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Raspberry Pi์— Node.js ์„ค์น˜

๋จผ์ €, Raspberry Pi์—์„œ Node.js๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Node.js๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์„œ๋ฒ„ ๋ฐ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ Node.js๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt install -y nodejs

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด node -v์™€ npm -v ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด Node.js์™€ npm(Node.js ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €)์˜ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GPIO ํ•€์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ onoff ํŒจํ‚ค์ง€ ์„ค์น˜

Raspberry Pi์˜ GPIO ํ•€์„ ์ œ์–ดํ•˜๋ ค๋ฉด onoff๋ผ๋Š” Node.js ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ GPIO ํ•€์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค. ๋จผ์ € onoff ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$ npm install onoff

์ด์ œ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ LED๋ฅผ ๊นœ๋นก์ด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

LED ๊นœ๋นก์ด๊ธฐ ํšŒ๋กœ ์—ฐ๊ฒฐ

Raspberry Pi์˜ GPIO ํ•€๊ณผ LED๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค:

  • LED์˜ ๊ธด ๋‹ค๋ฆฌ(์–‘๊ทน)๋ฅผ 330ฮฉ ์ €ํ•ญ๊ณผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ €ํ•ญ์˜ ๋‹ค๋ฅธ ์ชฝ์„ Raspberry Pi์˜ GPIO 17๋ฒˆ ํ•€์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • LED์˜ ์งง์€ ๋‹ค๋ฆฌ(์Œ๊ทน)๋ฅผ Raspberry Pi์˜ GND ํ•€์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Raspberry Pi์™€ LED๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ, ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด LED๋ฅผ ๊นœ๋นก์ด๊ฒŒ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Node.js๋กœ LED ๊นœ๋นก์ด๊ธฐ ์ฝ”๋“œ ์ž‘์„ฑ

๋‹ค์Œ์€ GPIO 17๋ฒˆ ํ•€์„ ์‚ฌ์šฉํ•ด LED๋ฅผ 1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๊นœ๋นก์ด๊ฒŒ ํ•˜๋Š” Node.js ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

// blink_led.js

const Gpio = require('onoff').Gpio;  // onoff ํŒจํ‚ค์ง€ ์ž„ํฌํŠธ
const led = new Gpio(17, 'out');     // GPIO 17๋ฒˆ ํ•€์„ ์ถœ๋ ฅ ๋ชจ๋“œ๋กœ ์„ค์ •

let isLedOn = 0;  // LED ์ƒํƒœ (์ผœ์ง = 1, ๊บผ์ง = 0)

// LED๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊นœ๋นก์ด๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜
const blinkLED = setInterval(() => {
    isLedOn = isLedOn ^ 1;  // XOR ์—ฐ์‚ฐ์„ ํ†ตํ•ด LED ์ƒํƒœ๋ฅผ ๋ฐ˜์ „
    led.writeSync(isLedOn); // ํ˜„์žฌ ์ƒํƒœ๋ฅผ GPIO ํ•€์— ๊ธฐ๋ก
    console.log(isLedOn ? 'LED ON' : 'LED OFF');
}, 1000);  // 1์ดˆ ๊ฐ„๊ฒฉ (1000ms)

// ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ GPIO ๋ฆฌ์†Œ์Šค ํ•ด์ œ
process.on('SIGINT', () => {
    clearInterval(blinkLED);  // ์ธํ„ฐ๋ฒŒ ์ •์ง€
    led.writeSync(0);         // LED ๋„๊ธฐ
    led.unexport();           // GPIO ๋ฆฌ์†Œ์Šค ํ•ด์ œ
    console.log('ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ, GPIO ๋ฆฌ์†Œ์Šค ํ•ด์ œ ์™„๋ฃŒ');
    process.exit();
});

์ด ์ฝ”๋“œ๋Š” setInterval() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด 1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ LED์˜ ์ƒํƒœ๋ฅผ ๋ฐ˜์ „์‹œํ‚ต๋‹ˆ๋‹ค. writeSync(1)์€ LED๋ฅผ ์ผœ๊ณ , writeSync(0)์€ LED๋ฅผ ๋•๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰ํ•˜๊ธฐ

GPIO ํ•€์„ ์ œ์–ดํ•˜๋ ค๋ฉด ๋ฃจํŠธ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด sudo ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ sudo node blink_led.js

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด LED๊ฐ€ 1์ดˆ๋งˆ๋‹ค ์ผœ์ง€๊ณ  ๊บผ์ง€๋ฉฐ ๊นœ๋นก์ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•  ๋•Œ๋Š” Ctrl + C๋ฅผ ๋ˆ„๋ฅด๋ฉด GPIO ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ œํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

GPIO ํ•€ ์ œ์–ด์˜ ํ™•์žฅ

Node.js์™€ Raspberry Pi๋ฅผ ์‚ฌ์šฉํ•œ GPIO ์ œ์–ด๋Š” ๋งค์šฐ ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค. LED ๊นœ๋นก์ด๊ธฐ ์™ธ์—๋„ ๋ฒ„ํŠผ, ์„ผ์„œ, ๋ชจํ„ฐ ๋“ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™•์žฅ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฒ„ํŠผ๊ณผ LED ์ œ์–ด: ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด LED๊ฐ€ ์ผœ์ง€๊ณ , ๋ฒ„ํŠผ์„ ๋–ผ๋ฉด LED๊ฐ€ ๊บผ์ง€๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจํ„ฐ ์ œ์–ด: GPIO ํ•€์„ ์‚ฌ์šฉํ•ด ๋ชจํ„ฐ๋ฅผ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, PWM(ํŽ„์Šค ํญ ๋ณ€์กฐ) ์‹ ํ˜ธ๋กœ ๋ชจํ„ฐ ์†๋„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ผ์„œ์™€์˜ ์—ฐ๋™: ์˜จ๋„, ์Šต๋„, ๊ฑฐ๋ฆฌ ์„ผ์„œ๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  GPIO๋ฅผ ํ†ตํ•ด ๊ด€๋ จ ์žฅ์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Raspberry Pi์™€ Node.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GPIO ํ•€์„ ์ œ์–ดํ•˜๊ณ , LED๋ฅผ ๊นœ๋นก์ด๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด Node.js๋ฅผ ์‚ฌ์šฉํ•œ ํ•˜๋“œ์›จ์–ด ์ œ์–ด์˜ ๊ธฐ์ดˆ๋ฅผ ์ตํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋ณต์žกํ•œ ํ•˜๋“œ์›จ์–ด ํ”„๋กœ์ ํŠธ์— ๋„์ „ํ•ด๋ณด์„ธ์š”!

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