Raspberry Pi์ GPIO ํ์ ์ฌ์ฉํ๋ฉด ๋ค์ํ ํ๋์จ์ด ์ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ Node.js๋ฅผ ์ฌ์ฉํ์ฌ LED ์ฌ๋ฌ ๊ฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ผ๊ณ ๋๋ ํ๋ฅด๋ LED ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ด ์์ ๋ GPIO ํ ์ ์ด์ ๊ธฐ๋ณธ์ ์ตํ๊ณ , ๋ค์ํ LED ์ ์ด ํจํด์ ๋ฐฐ์ฐ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ค๋น๋ฌผ
ํ๋ฅด๋ LED ํ๋ก์ ํธ๋ฅผ ์งํํ๊ธฐ ์ํด ํ์ํ ์ค๋น๋ฌผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Raspberry Pi (๋ชจ๋ธ์ ์๊ด์์ด ๊ฐ๋ฅ)
- LED 4๊ฐ
- ์ ํญ 4๊ฐ (330ฮฉ)
- ๋ธ๋ ๋๋ณด๋์ ์ ํผ ์ผ์ด๋ธ
ํ๋ก ๊ตฌ์ฑ
Raspberry Pi์ GPIO ํ์ LED 4๊ฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฐ๊ฒฐํฉ๋๋ค:
- ๊ฐ LED์ ๊ธด ๋ค๋ฆฌ(์๊ทน)๋ฅผ 330ฮฉ ์ ํญ์ ๊ฑฐ์ณ Raspberry Pi์ GPIO ํ์ ์ฐ๊ฒฐํฉ๋๋ค (GPIO 17, 18, 27, 22).
- ๊ฐ LED์ ์งง์ ๋ค๋ฆฌ(์๊ทน)๋ฅผ Raspberry Pi์ GND ํ์ ์ฐ๊ฒฐํฉ๋๋ค.
์ด์ LED๊ฐ ์์ฐจ์ ์ผ๋ก ์ผ์ง๊ณ ๊บผ์ง๋ ํ๋ฅด๋ LED ํจ๊ณผ๋ฅผ ๊ตฌํํ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค.
Node.js์ onoff ํจํค์ง ์ค์น
Raspberry Pi์ GPIO ํ์ ์ ์ดํ๊ธฐ ์ํด onoff
ํจํค์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋จผ์ Node.js์ onoff
ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
1. Node.js ์ค์น
$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt install -y nodejs
2. onoff ํจํค์ง ์ค์น
$ npm install onoff
Node.js์ onoff
ํจํค์ง๋ฅผ ์ฌ์ฉํด ์ด์ GPIO ํ์ ์ ์ดํ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค.
Node.js ์ฝ๋ ์์ฑ: ํ๋ฅด๋ LED ๊ตฌํ
์๋ ์ฝ๋๋ GPIO ํ์ ์ฐ๊ฒฐ๋ 4๊ฐ์ LED๋ฅผ ์์ฐจ์ ์ผ๋ก ์ผ๊ณ ๋๋ ํ๋ฅด๋ LED ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ ์์ ์ ๋๋ค.
// flowing_leds.js
const Gpio = require('onoff').Gpio; // onoff ํจํค์ง ์ํฌํธ
const leds = [ // LED๋ฅผ ์ ์ดํ GPIO ํ ์ค์
new Gpio(17, 'out'),
new Gpio(18, 'out'),
new Gpio(27, 'out'),
new Gpio(22, 'out')
];
let currentLed = 0; // ํ์ฌ ์ผ์ง LED๋ฅผ ์ถ์ ํ๋ ๋ณ์
// ๋ชจ๋ LED๋ฅผ ๊บผ์ฃผ๋ ํจ์
const turnOffAllLeds = () => {
leds.forEach(led => led.writeSync(0));
};
// LED๋ฅผ ์์ฐจ์ ์ผ๋ก ์ผ๊ณ ๋๋ ํจ์
const flowLeds = setInterval(() => {
turnOffAllLeds(); // ๋จผ์ ๋ชจ๋ LED๋ฅผ ๋
leds[currentLed].writeSync(1); // ํ์ฌ LED๋ฅผ ์ผฌ
console.log(`LED ${currentLed + 1} ON`);
currentLed = (currentLed + 1) % leds.length; // ๋ค์ LED๋ก ์ด๋
}, 500); // 500ms ๊ฐ๊ฒฉ์ผ๋ก LED๊ฐ ์์ฐจ์ ์ผ๋ก ์ผ์ง
// ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์ GPIO ๋ฆฌ์์ค ํด์
process.on('SIGINT', () => {
clearInterval(flowLeds); // ์ธํฐ๋ฒ ์ ์ง
turnOffAllLeds(); // ๋ชจ๋ LED ๋
leds.forEach(led => led.unexport()); // GPIO ๋ฆฌ์์ค ํด์
console.log('ํ๋ก๊ทธ๋จ ์ข
๋ฃ, GPIO ๋ฆฌ์์ค ํด์ ์๋ฃ');
process.exit();
});
์ด ์ฝ๋๋ setInterval()
์ ์ฌ์ฉํด LED๋ฅผ ์์ฐจ์ ์ผ๋ก ์ผ๊ณ ๋๋๋ค. 500ms ๊ฐ๊ฒฉ์ผ๋ก LED๊ฐ ํ๋ฅด๋ ํจ๊ณผ๋ฅผ ๋ํ๋
๋๋ค.
์ฝ๋ ์คํํ๊ธฐ
GPIO ํ์ ์ ์ดํ๋ ค๋ฉด ๋ฃจํธ ๊ถํ์ด ํ์ํ๋ฏ๋ก, ๋ค์๊ณผ ๊ฐ์ด sudo
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
$ sudo node flowing_leds.js
์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด 4๊ฐ์ LED๊ฐ 500ms ๊ฐ๊ฒฉ์ผ๋ก ์์ฐจ์ ์ผ๋ก ์ผ์ง๊ณ ๊บผ์ง๋๋ค. Ctrl + C
๋ก ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํ๋ฉด ๋ชจ๋ LED๊ฐ ๊บผ์ง๊ณ , GPIO ๋ฆฌ์์ค๊ฐ ์์ ํ๊ฒ ํด์ ๋ฉ๋๋ค.
์ฝ๋ ์ค๋ช
์ ์ฝ๋์์ ์ฌ์ฉ๋ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Gpio ํด๋์ค:
onoff
ํจํค์ง์Gpio
ํด๋์ค๋ฅผ ์ฌ์ฉํด ๊ฐ GPIO ํ์ ์ ์ดํฉ๋๋ค. 17, 18, 27, 22๋ฒ ํ์ ์ฐ๊ฒฐ๋ LED๋ฅผ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ ํฉ๋๋ค. - flowLeds ํจ์:
setInterval()
์ ์ฌ์ฉํ์ฌ 500ms ๊ฐ๊ฒฉ์ผ๋ก LED๋ฅผ ์์ฐจ์ ์ผ๋ก ์ผ๊ณ ๋๋๋ค. - turnOffAllLeds ํจ์: ๊ฐ ๋ฃจํ๊ฐ ์คํ๋ ๋ ๋ชจ๋ LED๋ฅผ ๋๊ณ , ๊ทธ๋ค์ ์ผ์ง LED๋ฅผ ์ง์ ํฉ๋๋ค.
- SIGINT ์ด๋ฒคํธ ์ฒ๋ฆฌ:
Ctrl + C
๋ก ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋ ๋ชจ๋ LED๋ฅผ ๋๊ณ GPIO ๋ฆฌ์์ค๋ฅผ ํด์ ํฉ๋๋ค.
GPIO ์ ์ด ํ์ฅ
์ด ์์ ๋ ๊ธฐ๋ณธ์ ์ธ ํ๋ฅด๋ LED ๊ตฌํ์ด์ง๋ง, Raspberry Pi์ Node.js๋ฅผ ์ฌ์ฉํด ๋ ๋ณต์กํ ํ๋ก์ ํธ๋ก ํ์ฅํ ์ ์์ต๋๋ค:
- ๋ฉํฐ ์ปฌ๋ฌ LED ์ ์ด: RGB LED๋ฅผ ์ฌ์ฉํด ๋ค์ํ ์์์ ์์ฐจ์ ์ผ๋ก ํ์ํ๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- PWM์ ์ฌ์ฉํ LED ๋ฐ๊ธฐ ์ ์ด: PWM(ํ์ค ํญ ๋ณ์กฐ) ์ ํธ๋ฅผ ์ฌ์ฉํด LED์ ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ํ์ฌ ์ ์ ๋ฐ์์ง๊ฑฐ๋ ์ด๋์์ง๋ ํจ๊ณผ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์ผ์์ ์ฐ๋: ์จ๋ ์ผ์, ๊ฑฐ๋ฆฌ ์ผ์ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก LED์ ์ํ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ด๋ฒ ๊ธ์์๋ Node.js์ Raspberry Pi๋ฅผ ์ฌ์ฉํด ํ๋ฅด๋ LED ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. ์ด ์์ ๋ GPIO ํ์ ํ์ฉํ ํ๋์จ์ด ์ ์ด์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ค๋ฃจ๋ฉฐ, ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ ๋ณต์กํ ํ๋ก์ ํธ๋ก ํ์ฅํ ์ ์์ต๋๋ค. Raspberry Pi์ Node.js๋ก ์ฌ๋ฌ๋ถ๋ง์ ์ฐฝ์์ ์ธ LED ์ ์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์!
๋๊ธ ์ฐ๊ธฐ