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๋ฅผ ์ฌ์ฉํ ํ๋์จ์ด ์ ์ด์ ๊ธฐ์ด๋ฅผ ์ตํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋๋ฅผ ๋ฐํ์ผ๋ก ๋ ๋ณต์กํ ํ๋์จ์ด ํ๋ก์ ํธ์ ๋์ ํด๋ณด์ธ์!
๋๊ธ ์ฐ๊ธฐ