Raspberry Pi๋ ์ํ ์ปดํจํฐ๋ก ๋ค์ํ ์ ์ ๋ถํ ๋ฐ ์ปดํฌ๋ํธ๋ฅผ ์ ์ดํ ์ ์์ผ๋ฉฐ, Node.js๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ํ๋ก๊ทธ๋๋ฐํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ Node.js์ Raspberry Pi๋ฅผ ํ์ฉํด ์ฌ๋ฌ ๊ฐ์ง ๊ธฐ๋ณธ์ ์ธ ์ ์ ๋ถํ(์ปดํฌ๋ํธ)์ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. LED, ๋ฒํผ, ์ผ์์ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ํ๋์จ์ด ์ ์ด ๋ฐฉ๋ฒ์ ์ตํ๊ณ , ์ด๋ฅผ ํตํด IoT ํ๋ก์ ํธ๋ฅผ ํ์ฅํด ๋ณด์ธ์.
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 ์์คํ ์ ๊ตฌ์ถํด ๋ณด์ธ์!
๋๊ธ ์ฐ๊ธฐ