Responsive Advertisement

Node.js์™€ Raspberry Pi๋ฅผ ํ™œ์šฉํ•œ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ ์ œ์–ด ๊ฐ€์ด๋“œ

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

Node.js์™€ Raspberry Pi๋ฅผ ํ™œ์šฉํ•œ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ ์ œ์–ด ๊ฐ€์ด๋“œ


1. Raspberry Pi์™€ Node.js์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ

Raspberry Pi์—์„œ Node.js๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € Raspberry Pi์— Node.js๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

Node.js ์„ค์น˜

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

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

2. LED ์ œ์–ด

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ Raspberry Pi์™€ Node.js ํ”„๋กœ์ ํŠธ๋Š” LED๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ LED ์ผœ๊ณ  ๋„๊ธฐ๋ฅผ ํ†ตํ•ด GPIO ํ•€ ์ œ์–ด ๋ฐฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์žฌ๋ฃŒ

  • Raspberry Pi
  • LED 1๊ฐœ
  • 330ฮฉ ์ €ํ•ญ 1๊ฐœ
  • ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์™€ ์ ํผ ์ผ€์ด๋ธ”

ํšŒ๋กœ ๊ตฌ์„ฑ

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

Node.js ์ฝ”๋“œ

// led_control.js

const Gpio = require('onoff').Gpio;
const led = new Gpio(17, 'out');  // GPIO 17๋ฒˆ ํ•€์— ์—ฐ๊ฒฐ๋œ LED ์ œ์–ด

// LED ์ผœ๊ธฐ
led.writeSync(1);
console.log('LED ON');

// 5์ดˆ ํ›„ LED ๋„๊ธฐ
setTimeout(() => {
    led.writeSync(0);
    console.log('LED OFF');
    led.unexport();  // GPIO ๋ฆฌ์†Œ์Šค ํ•ด์ œ
}, 5000);

์ด ์ฝ”๋“œ๋Š” Node.js์™€ onoff ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Raspberry Pi์˜ GPIO ํ•€์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. 5์ดˆ ๋™์•ˆ LED๊ฐ€ ์ผœ์ง„ ํ›„ ์ž๋™์œผ๋กœ ๊บผ์ง‘๋‹ˆ๋‹ค.

3. ๋ฒ„ํŠผ ์ž…๋ ฅ ๊ฐ์ง€

Raspberry Pi์—์„œ ํ‘ธ์‹œ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ํŠน์ • ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์žฌ๋ฃŒ

  • Raspberry Pi
  • ํ‘ธ์‹œ ๋ฒ„ํŠผ 1๊ฐœ
  • 10kฮฉ ์ €ํ•ญ 1๊ฐœ
  • ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์™€ ์ ํผ ์ผ€์ด๋ธ”

ํšŒ๋กœ ๊ตฌ์„ฑ

  • ๋ฒ„ํŠผ์˜ ํ•œ์ชฝ ๋‹ค๋ฆฌ๋ฅผ GPIO 18๋ฒˆ ํ•€์— ์—ฐ๊ฒฐ
  • ๋‹ค๋ฅธ ํ•œ์ชฝ ๋‹ค๋ฆฌ๋ฅผ ์ €ํ•ญ์„ ํ†ตํ•ด GND์— ์—ฐ๊ฒฐ

Node.js ์ฝ”๋“œ

// button_input.js

const Gpio = require('onoff').Gpio;
const button = new Gpio(18, 'in', 'both');  // GPIO 18๋ฒˆ ํ•€์— ์—ฐ๊ฒฐ๋œ ๋ฒ„ํŠผ ์ž…๋ ฅ ๊ฐ์ง€

button.watch((err, value) => {
    if (err) {
        console.error('๋ฒ„ํŠผ ๊ฐ์ง€ ์˜ค๋ฅ˜:', err);
        return;
    }
    console.log('๋ฒ„ํŠผ ์ƒํƒœ:', value ? '๋ˆŒ๋ฆผ' : '์•ˆ ๋ˆŒ๋ฆผ');
});

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

์ด ์ฝ”๋“œ๋Š” ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ์™€ ๋†“์˜€์„ ๋•Œ ๊ฐ๊ฐ์˜ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. watch() ํ•จ์ˆ˜๋Š” ๋ฒ„ํŠผ์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

4. ์˜จ๋„ ๋ฐ ์Šต๋„ ์„ผ์„œ(DHT22) ์ œ์–ด

์˜จ๋„์™€ ์Šต๋„ ์„ผ์„œ๋Š” IoT ํ”„๋กœ์ ํŠธ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” DHT22 ์„ผ์„œ๋ฅผ ์‚ฌ์šฉํ•ด Raspberry Pi์—์„œ ์˜จ๋„์™€ ์Šต๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์žฌ๋ฃŒ

  • Raspberry Pi
  • DHT22 ์˜จ์Šต๋„ ์„ผ์„œ 1๊ฐœ
  • 10kฮฉ ์ €ํ•ญ 1๊ฐœ
  • ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์™€ ์ ํผ ์ผ€์ด๋ธ”

ํšŒ๋กœ ๊ตฌ์„ฑ

  • ์„ผ์„œ์˜ VCC ํ•€์„ Raspberry Pi์˜ 3.3V ํ•€์— ์—ฐ๊ฒฐ
  • ์„ผ์„œ์˜ GND ํ•€์„ Raspberry Pi์˜ GND ํ•€์— ์—ฐ๊ฒฐ
  • ๋ฐ์ดํ„ฐ ํ•€์„ GPIO 4๋ฒˆ ํ•€์— ์—ฐ๊ฒฐํ•˜๊ณ  10kฮฉ ์ €ํ•ญ์„ ์‚ฌ์šฉํ•ด ํ’€์—…(pull-up) ์ €ํ•ญ ์—ฐ๊ฒฐ

Node.js ์ฝ”๋“œ

// dht22_sensor.js

const sensor = require('node-dht-sensor');

// DHT22 ์„ผ์„œ ์ดˆ๊ธฐํ™”
sensor.initialize(22, 4);  // DHT22, GPIO 4๋ฒˆ ํ•€ ์‚ฌ์šฉ

setInterval(() => {
    const readout = sensor.read();
    console.log(`์˜จ๋„: ${readout.temperature.toFixed(2)}°C, ์Šต๋„: ${readout.humidity.toFixed(2)}%`);
}, 2000);  // 2์ดˆ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

์ด ์ฝ”๋“œ๋Š” DHT22 ์„ผ์„œ๋ฅผ ํ†ตํ•ด 2์ดˆ๋งˆ๋‹ค ์˜จ๋„์™€ ์Šต๋„๋ฅผ ์ฝ์–ด ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. node-dht-sensor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์†์‰ฝ๊ฒŒ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์„œ๋ณด ๋ชจํ„ฐ ์ œ์–ด

์„œ๋ณด ๋ชจํ„ฐ๋Š” ๊ฐ๋„ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๋ด‡์˜ ๊ด€์ ˆ์„ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ ์นด๋ฉ”๋ผ์˜ ๊ฐ๋„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์žฌ๋ฃŒ

  • Raspberry Pi
  • ์„œ๋ณด ๋ชจํ„ฐ 1๊ฐœ
  • ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ์™€ ์ ํผ ์ผ€์ด๋ธ”

ํšŒ๋กœ ๊ตฌ์„ฑ

  • ์„œ๋ณด ๋ชจํ„ฐ์˜ VCC๋ฅผ Raspberry Pi์˜ 5V ํ•€์— ์—ฐ๊ฒฐ
  • ์„œ๋ณด ๋ชจํ„ฐ์˜ GND๋ฅผ Raspberry Pi์˜ GND์— ์—ฐ๊ฒฐ
  • ์„œ๋ณด ๋ชจํ„ฐ์˜ ์‹ ํ˜ธ ํ•€์„ GPIO 17๋ฒˆ ํ•€์— ์—ฐ๊ฒฐ

Node.js ์ฝ”๋“œ

// servo_control.js

const Gpio = require('pigpio').Gpio;
const motor = new Gpio(17, { mode: Gpio.OUTPUT });

let pulseWidth = 1000;  // ์ดˆ๊ธฐ ๊ฐ๋„

setInterval(() => {
    motor.servoWrite(pulseWidth);
    console.log(`์„œ๋ณด ๋ชจํ„ฐ ๊ฐ๋„: ${pulseWidth}`);
    
    // ๊ฐ๋„ ๋ณ€๊ฒฝ
    pulseWidth = pulseWidth === 1000 ? 2000 : 1000;
}, 2000);  // 2์ดˆ๋งˆ๋‹ค ๊ฐ๋„ ๋ณ€๊ฒฝ

์ด ์ฝ”๋“œ๋Š” ์„œ๋ณด ๋ชจํ„ฐ์˜ ๊ฐ๋„๋ฅผ 2์ดˆ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•˜๋ฉฐ, pigpio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจํ„ฐ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

6. WebSocket์„ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ œ์–ด

Raspberry Pi์—์„œ WebSocket์„ ์‚ฌ์šฉํ•˜๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WebSocket ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์—์„œ Raspberry Pi์˜ ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebSocket ์„œ๋ฒ„ ์ฝ”๋“œ

// websocket_server.js

const WebSocket = require('ws');
const Gpio = require('onoff').Gpio;

const led = new Gpio(17, 'out');  // LED ์ œ์–ด๋ฅผ ์œ„ํ•œ GPIO ์„ค์ •
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
    console.log('ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ');

    ws.on('message', (message) => {
        const command = JSON.parse(message);
        console.log('๋ฐ›์€ ๋ฉ”์‹œ์ง€:', command);

        if (command.action === 'led') {
            led.writeSync(command.value);  // LED ์ƒํƒœ ๋ณ€๊ฒฝ
        }
    });

    ws.on('close', () => {
        console.log('ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ');
        led.writeSync(0);
        led.unexport();
    });
});

์ด ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ LED๋ฅผ ์ œ์–ดํ•˜๋Š” WebSocket ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ํŠน์ • ๋ช…๋ น์„ ๋ณด๋‚ด๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ Raspberry Pi์˜ GPIO ํ•€์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

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

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