Responsive Advertisement

Node.js์™€ Raspberry Pi๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ ๊ฐ€์ด๋“œ

Raspberry Pi๋Š” ์ €๋ ดํ•˜๊ณ  ์†Œํ˜•์˜ ์ปดํ“จํ„ฐ๋กœ, ๋‹ค์–‘ํ•œ IoT ํ”„๋กœ์ ํŠธ์™€ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Node.js์™€ ๊ฐ™์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์ด์šฉํ•˜๋ฉด, Raspberry Pi์—์„œ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ œ์–ดํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Raspberry Pi์™€ Node.js๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Raspberry Pi์— Node.js ์„ค์น˜ํ•˜๊ธฐ

Raspberry Pi์—์„œ Node.js๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Node.js๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Raspberry Pi๋Š” ARM ๊ธฐ๋ฐ˜์˜ ์ปดํ“จํ„ฐ์ด๋ฏ€๋กœ, ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ ARM์šฉ Node.js ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

1. Node.js ์„ค์น˜ ํ™•์ธ

Raspberry Pi์— ๊ธฐ๋ณธ์ ์œผ๋กœ Node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ node -v
$ npm -v

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๋ฉด Node.js์™€ npm(Node.js ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €)์ด ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด Node.js๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Node.js ์„ค์น˜

Raspberry Pi์— ์ตœ์‹  ๋ฒ„์ „์˜ Node.js๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋ช…๋ น์–ด๋Š” NodeSource๋ฅผ ํ†ตํ•ด ์ตœ์‹  ๋ฒ„์ „์˜ Node.js๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด node -v์™€ npm -v ๋ช…๋ น์–ด๋กœ ์„ค์น˜๋œ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Raspberry Pi์—์„œ Node.js ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

์ด์ œ Raspberry Pi์— Node.js๊ฐ€ ์„ค์น˜๋˜์—ˆ์œผ๋ฏ€๋กœ, ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์›น ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ Raspberry Pi์˜ GPIO ํ•€์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๊ฐ„๋‹จํ•œ Node.js ์›น ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

Node.js๋Š” ์›น ์„œ๋ฒ„๋ฅผ ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Raspberry Pi์—์„œ ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// server.js

const http = require('http');

// ์„œ๋ฒ„ ์ƒ์„ฑ
const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello, Raspberry Pi with Node.js!\n');
});

// ์„œ๋ฒ„ ํฌํŠธ์™€ IP ์„ค์ •
const port = 3000;
const hostname = '0.0.0.0';

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

์ด ์ฝ”๋“œ๋Š” HTTP ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜์—ฌ "Hello, Raspberry Pi with Node.js!" ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ node server.js

์ดํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ Raspberry Pi์˜ IP ์ฃผ์†Œ์™€ ํฌํŠธ 3000์„ ์ž…๋ ฅํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: http://192.168.1.10:3000

2. Raspberry Pi GPIO ํ•€ ์ œ์–ดํ•˜๊ธฐ

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

GPIO ํ•€ ์ œ์–ด๋ฅผ ์œ„ํ•œ ์ค€๋น„

๋จผ์ € onoff ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$ npm install onoff

์ด์ œ GPIO ํ•€์„ ์ œ์–ดํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” Raspberry Pi์˜ GPIO 17๋ฒˆ ํ•€์— ์—ฐ๊ฒฐ๋œ LED๋ฅผ ์ผœ๊ณ  ๋•๋‹ˆ๋‹ค.

// gpio_control.js

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

// LED๋ฅผ ์ผœ๊ณ  1์ดˆ ํ›„์— ๋„๋Š” ํ•จ์ˆ˜
const blinkLED = () => {
    led.writeSync(1);  // LED ์ผœ๊ธฐ
    console.log('LED ON');
    setTimeout(() => {
        led.writeSync(0);  // LED ๋„๊ธฐ
        console.log('LED OFF');
    }, 1000);
};

// LED ๊นœ๋นก์ด๊ธฐ
blinkLED();

// ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์‹œ GPIO ๋ฆฌ์†Œ์Šค ํ•ด์ œ
process.on('SIGINT', () => {
    led.unexport();
});

์ด ์ฝ”๋“œ๋Š” GPIO 17๋ฒˆ ํ•€์— ์—ฐ๊ฒฐ๋œ LED๋ฅผ 1์ดˆ ๋™์•ˆ ์ผ  ํ›„ ๋•๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ sudo node gpio_control.js

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

Node.js์™€ Raspberry Pi๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด

Node.js์™€ Raspberry Pi๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ IoT ๋ฐ ํ•˜๋“œ์›จ์–ด ์ œ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Raspberry Pi์™€ Node.js๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

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

๊ฒฐ๋ก 

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

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