JS ํ์ฌ๐ ํ๋์จ์ด โ Nodebots ๋ฐ Johnny Five ์์
JavaScript ๋ฐ ํ๋์จ์ด?์ด๋ป๊ฒ
ํ๋์จ์ด ๊ฐ๋ฐ์ ์ํด JavaScript๋ฅผ ์ฌ์ฉํ๋ ๋ค์ํ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค.์ผ๋ถ๋ Tessel ๋๋ Espruino ๊ฐ์ ํน์ ํ๋์จ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.์ด ๋ ํญ๋ชฉ์ ๋ชจ๋ ํ๋ฅญํ์ง๋ง, ๋ณธ๊ณ ์์ ์ฐ๋ฆฌ๋ ๋ ๋ค๋ฅธ ์ ํ์ ์ฃผ๋ชฉํ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ต์ ์ npm ๋ชจ๋
johnny-five
์ด๋ค.Johnny Five๋ ์ผ๋ถ ํ๋์จ์ด์๋ง ๊ตญํ๋์ง ์๊ณ supports a wide range of different microcontroller platforms (including the Tessel) ๋ค์ํ ์
์ถ๋ ฅ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํฉ๋๋ค.์ ์ผํ ๋จ์ ์ ๊ทธ ์ค ์ผ๋ถ ํ๋ซํผ(์๋ฅผ ๋ค์ด Arduino)์์ ์ง์ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ์์ JS ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.๋ฐ๋๋ก ํธ์คํธ ์์คํ
์์ ์คํํ ์ ์์ต๋๋ค.Arduino์ ์์ ๋ฐฉ์์ Node๋ฅผ ์ฌ์ฉํ์ฌ ํธ์คํธ ์์คํ (์๋ฅผ ๋ค์ด ์ปดํจํฐ)์์ JS ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ ๋๋ค.js์
johnny-five
๋ชจ๋์ serialport
๋ชจ๋์ ํตํด ๋์ firmata
firmware์ ์คํํ๋ Arduino์๊ฒ ์ ์กํฉ๋๋ค. ์ด Arduino๋ ์๊ฒฉ ์ ์ด Arduino์ ์ฌ์ฉ๋ฉ๋๋ค.์ด๋ ๊ฒ ํ๋ฉด ํ๋์จ์ด๊ฐ ์ฐ๋ฆฌ ์ปดํจํฐ์ ์ฐ๊ฒฐ๋ ๋ ์ฐ๋ฆฌ๋ ํ๋์จ์ด๋ฅผ ์์ ํ ์ ์ดํ ์ ์๋ค.์๊ตฌ ์ฌํญ
๋ณธ ๊ฐ์ข์ ๋ํด ๋น์ ์ ์ฝ๊ฐ์ ๋ฌผ๊ฑด์ด ํ์ํฉ๋๋ค.๋จผ์ ์ปดํจํฐ์ ๋ค์ ์ฅ์น๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
Node.js ๋ฐ npm
firmata
ํ์จ์ด๋ฅผ ์
๋ก๋ํ๋ Arduino IDEfirmata ํ์จ์ด ์ค์น
์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ฒซ ๋ฒ์งธ ์ผ์ ๋น์ ์ Arduino๊ฐ ์ ํํ๊ฒ ์๋ณ๋ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.์ปดํจํฐ์ ์ฝ์ ํ๊ณ
Tools
๋ฉ๋ด๋ฅผ ํด๋ฆญํฉ๋๋ค.๊ทธ๊ณณ์์ ๋น์ ์ด ์ฌ์ฉํ๊ณ ์๋ ๊ฐ ํ์ ์ ํํ๊ณ ์ถ์ต๋๋ค. - ์ ์ํฉ์์ ์ ๋ Arduino ๋๋
ธ๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.๋ํ
Tools โ Port
์์ ์ฌ๋ฐ๋ฅธ ํฌํธ๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.๊ทธ๊ฒ์ usbserial
๊ฐ์ ๋ด์ฉ์ ํฌํจํด์ผ ํ๋ค.์ด๋ฌํ ํฌํธ๊ฐ ๋์ด๋์ง ์์ผ๋ฉด Arduino์ ํ์ํ ๋๋ผ์ด๋ฒ๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธํฉ๋๋ค.๋ค์์ Arduino์firmata ๋ถํ์ ์ค์นํ์ฌ ํต์ ํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
Servo
๋ฅผ ํด๋ฆญํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฒ์ํ์ฌ Arduino IDE๋ฅผ ์ด๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ๋
Sketch โ Include Library โ Manage Libraries
ํ์ผ์ ์ฐ๋ฆฌ์ Arduino ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์ ๋ค์ด๋ก๋ํ๊ณ (๊ธฐ๋ณธ์ ์ผ๋ก Mac์ StandardFirmataPlus.ino
์๋) ์ฐ๋ฆฌ์ Arduino์ ์
๋ก๋ํด์ผ ํ๋ค.๊ธฐ๋ณธ ์ค์ ์ ๋ค์ด๊ฐ์ Sketchbook ์์น๋ฅผ ์ฐพ์ผ๋ฉด Arduino ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.Download the
~/Documents/Arduino
file from GitHub ๋ฐ Arduino ๋๋ ํ ๋ฆฌ์ StandardFirmataPlus.ino
๋๋ ํ ๋ฆฌ์ ๋ฐฐ์นํฉ๋๋ค.StandardFirmataPlus
ํ์ผ์ ์ด๊ณ ์
๋ก๋ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.์ด๊ฒ์ ์ปดํ์ผ๋ ์์น๋ฅผ Arduino์ ์
๋ก๋ํฉ๋๋ค.์
๋ก๋๊ฐ ์๋ฃ๋๋ฉด Arduino IDE๋ฅผ ๋ซ์ ์ ์์ต๋๋ค.์ด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋์ด์!์ฐธ๊ณ : ์ฝ๋๋ฅผ ์ ๋ก๋ํ์ง ๋ชปํ๋ฉด "Servo"๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก "Firmata"๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ์ญ์์ค.
ํ๋์จ์ด์ "์ข์ ์ธ์"
ํ๋์จ์ด ์ธก๋ฉด์์ Hello World์ ๋ฑ๊ฐ ๊ธฐ๋ฅ์ LED๋ฅผ ๊น๋ฐ์ด๊ฒ ํ ์ ์์ต๋๋ค.์ข์ต๋๋ค. Arduinos๋ ๋ณดํต ํ๋กํ์ LED๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ด ์ ์์ ์ธ์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ค ๊ฒ๋ ์ฐ๊ฒฐํ ํ์๊ฐ ์์ต๋๋ค.์์ํฉ์๋ค!
์ ๋ ธ๋๋ฅผ ์์ฑํฉ๋๋ค.๋ช ๋ น์ค์์ ์คํํ๋ฉด ์ปดํจํฐ์ ๋ชจ๋ ์์น(์๋ฅผ ๋ค์ด ํ ๋๋ ํฐ๋ฆฌ)์์ js ํ๋ก์ ํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
mkdir nodebots
cd nodebots
npm init -y
๋ค์ ์ค์นStandardFirmataPlus.ino
๋ชจ๋:npm install johnny-five --save
johnny-five
๋ผ๋ ํ์ผ์ ๋ง๋ค๊ณ ๋ค์ ์ฝ๋๋ฅผ ๋ฃ์ต๋๋ค.const { Led, Board } = require('johnny-five');
const board = new Board();
board.on('ready', onReady);
๊ทธ๋ฌ๋ฉด ์ ๋ณด๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ index.js
์ด๋ฒคํธ๊ฐ ์คํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Arduino์ ์ฐ๊ฒฐ๋์ด ์์์ ์๋ฏธํฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ฌ์ ํ ๋ถ์กฑํ ready
ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.johnny-five
์๋์ ๋ค์ ํ์ ๋ฐฐ์นํ์ฌ ์ถ๊ฐํฉ๋๋ค.function onReady() {
// if we don't pass a port to the Led constructor it will use
// the default port (built-in LED)
const led = new Led();
// This will grant access to the led instance
// from within the REPL that's created when
// running this program.
board.repl.inject({
led: led
});
led.blink();
// run in the REPL led.stop() to make it stop blinking
}
์ง๊ธ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ์ฐ๋ฆฌ์ ๊ฐ๋ณธ์ ์์ํ๋ ๊ฒ์ด๋ค.node index.js
์ฝ์์์ ๋ฉ์์ง๋ฅผ ๋ด๋ณด๋ด๊ณ ๋ค์ REPL์ ์์ํด์ผ ํฉ๋๋ค.๋ํ ํ๋ก ๊ธฐํ์ LED๊ฐ ๊น๋ฐ์ด๊ธฐ ์์ํ๋ ๊ฒ์ ๋ณด์์ผ ํฉ๋๋ค.REPL์ ๋ค์ ๋ด์ฉ์ ์ ๋ ฅํ์ฌ ๊น๋ฐ์์ ์ค์งํ ์ ์์ต๋๋ค.
led.stop()
ํ๋ก๊ทธ๋จ์ ์ค์งํ๋ ค๋ฉด onReady
๋ฅผ ์
๋ ฅํ๊ฑฐ๋ index.js
๋ฅผ ๋ ๋ฒ ๋๋ฆ
๋๋ค.์ธ๋ถ LED์ ๋ํ
์ง๊ธ์ ์ฐ๋ฆฌ๊ฐ ํต์์ ์ผ๋ก ํ๋์จ์ด๋ฅผ ๊ณต๊ฒฉํ ๋ ํ๊ณ ์ถ์ ์ผ์ด ์๋๋ผ ํ๋กํ์์๋ง ํ๋์จ์ด๋ฅผ ๋ ผ์ํ๋ ๊ฒ์ด ์ ํ์ด๋ผ๋ ๊ฒ์ด ๋ถ๋ช ํ๋ค.์ด๋ฅผ ์ํด, ์ฐ๋ฆฌ๋ ์ธ๋ถ ํ๋์จ์ด์ ๋ํด ํ ๋ก ํด์ผ ํ๋ค.๋ค์ ํ๋์จ์ด๋ฅผ ์บก์ฒํด ๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ํ๋ก๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
Pin D6 on your Arduino (or any other digital pin) โ one side of your resistor โ the long leg of your LED (anode) โ short leg of your LED (cathode) โ GND on your Arduino
์ด ํ๋ก๊ฐ ์์ผ๋ฉด, ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ํธ๋ํฐ
.exit
๋ฅผ ์ด๋ฉด, ๊ทธ๊ฒ์ LED๋ฅผ ์ผ๊ธฐ ์์ํ ๊ฒ์ด๋ค.์ด์ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ์ฌ LED๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Ctrl+C
๊ตฌ์กฐ ํจ์์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.๋ค๋ฅธ Arduino๋ ๋ค๋ฅธ ํฌํธ๋ฅผ ์ ํํ๋ฉด ๋ค๋ฅผ ์ ์์ต๋๋ค.D6
์์ ๋ณ๊ฒฝ:function onReady() {
const led = new Led(6);
// โฆ leave remaining code
}
ํ๋ก๊ทธ๋จ์ ๋ค์ ์คํํ๋ฉด ์ฐจ๋ LED ๋์ ์ธ๋ถ LED๊ฐ ๊น๋ฐ์ด๊ธฐ ์์ํฉ๋๋ค.๐๋ฒํผ์ ๋๋ฅด๋ค
๋ง์ฝ ์ผ๋ถ ์ฌ์ฉ์์ ์ํธ์์ฉ์ด ์๋ค๋ฉด ํ๋์จ์ด ํด์ปค๋ ๋ฌด์์ ๋๊น?ํผํฉ์ ๋จ์ถ๋ฅผ ์ถ๊ฐํฉ์๋ค.๋๋จธ์ง ๊ตฌ์ฑ ์์๋ฅผ ์บก์ฒํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ญ์์ค.
Connect one pin to 5V on your Arduino and the diagonally one to both a 10kฮฉ resistor and to pin D5 on your Arduino. Connect the other end of the resistor to GND of your Arduino to close the circuit.
ํ์ฌ ์ค์ ์ ๋ค์๊ณผ ์ ์ฌํด์ผ ํฉ๋๋ค.
๋ฒํผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋์จ์ด ํด์ปค๋ค์ด ์ง์ ์ผ๋ก ๋น๋๋ ๊ณณ์ด๋ค.๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๋จ์ถ๊ฐ ๋๋ฆฌ๊ฑฐ๋ ํ๋ ค๋ฌ๋์ง ์๊ณ ์ถ๋ค๋ฉด, ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ์ฒญ์ทจ
6
/Led
์ฌ๊ฑด์ด๋ค.์ด๋ ๊ฒ ๊ฐ๋จํด.๋ณ๊ฒฝ ์ฌํญindex.js
:const { Led, Board, Button } = require('johnny-five');
const board = new Board();
board.on('ready', onReady);
let button;
let led;
function onReady() {
button = new Button(5);
led = new Led(6);
button.on('press', () => led.on());
button.on('release', () => led.off());
// This will grant access to the led instance
// from within the REPL that's created when
// running this program.
board.repl.inject({
led: led
});
// led.blink();
// run in the REPL led.stop() to make it stop blinking
}
์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ ์์ํ๊ณ ๋จ์ถ๋ฅผ ๋๋ฅด๊ธฐ ์์ํฉ๋๋ค.๋ฒํผ์ ๋๋ฅด๋ฉด LED๊ฐ ์ผ์ง๊ณ , ๋ฒํผ์ ๋์ผ๋ฉด LED๊ฐ ์ผ์ง์ง ์์ต๋๋ค.API๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ์ฒด npm ์ํ๊ณ๋ฅผ ์ด์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.๋ฐ๋ผ์
press
์น ์๋ฒ๋ฅผ ๋น ๋ฅด๊ฒ ์์ํ๊ณ ์์ฒญ๋ง๋ค LED๋ฅผ ๋ฐํ ๋ค์ release
์RequestBin์ ์ฌ์ฉํ์ฌ HTTPindex.js
์์ฒญ์ ์คํํฉ๋๋ค.express
๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ชจ๋์ ์ค์นํฉ๋๋ค.npm install express got --save
๋ค์์ผ๋ก, ์ฐ๋ฆฌ๋ ์ด ๋ ๊ฐ์ ์์กดํญ์ ํ์๋ก ํ๊ณ , express ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์ผ ํ๋ค.์์ ์ฌํญgot
:const { Led, Board, Button } = require('johnny-five');
const express = require('express');
const got = require('got');
const board = new Board();
const app = express();
app.get('*', (req, res) => {
led.on();
// turn off LED after 1 second
setTimeout(() => led.off(), 1000);
res.send('Hello!');
});
board.on('ready', onReady);
๋ค์์ ๋จ์ถ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ์ ์กฐ์ ํ๊ณ express ์๋ฒ๋ฅผ ํ์ํด์ผ ํฉ๋๋ค.function onReady() {
button = new Button(5);
led = new Led(6);
button.on('press', () => {
got
.post('YOUR_REQUEST_BIN_URL')
.then(() => {
console.log('Made request');
})
.catch(err => {
console.error(err);
});
});
// button.on('release', () => led.off());
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
// This will grant access to the led instance
// from within the REPL that's created when
// running this program.
board.repl.inject({
led: led
});
}
POST
๋ฅผ ์ ํจํ RequestBin URL๋ก ๊ต์ฒดํด์ผ ํฉ๋๋ค.๋๋ ๊ทธ๋ค์ ์ฌ์ดํธ์ ํ๋๋ฅผ ๋ง๋ค ์ ์๋ค.์๋ฒ๊ฐ ํ์งํ๊ณ ์์์ ํ์ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ํฉ๋๋ค.http://localhost:3000๋ก ์ด๋ํ๋ฉด LED๊ฐ 1์ด ๋์ ์ผ์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์น๋ฉด ๋ค์ ๋ณผ ์ ์์ต๋๋ค.๊ทธ๋ฐ ๋ค์ ๋ฒํผ์ ๋๋ฅด๊ณ RequestBin ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์ณ์ ์์ฒญ์ ๋ณด์ญ์์ค.
๋ค์์ ๋ญ์์?
๋๋ฌด ์ข์, ๋ฐ๋ก ์ด๊ฑฐ์ผ!๋๋ ๋ฐฉ๊ธ ๊ท์ฌ์ด ๋ ธ๋๋ณด์ธ ์ธ๊ณ์์ ์ฒซ๋ฐ์ ๋ด๋๋ ๋ค.ํ์ง๋ง ์์์ผ ๋ฟ์ด๋ค.ํ๋ก์ ํธ๋ฅผ ์ฐพ์ ํ์ํ ๋ถ๋ถ์ ์ฐ๊ตฌํ ๋๊ฐ ๋์๋ค.๋ง์ฝ ๋น์ ์ด ์ด ์ผ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์๊ณ ์ถ๋ค๋ฉด, ๋์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผhow I hacked a coffee machine using Johnny-Five and a Tessel์ ๋ณด์ญ์์ค.๋๋ ๋ง๋ ํ check if there is a local nodebots meetup around you ํด์ผ ํ๋ค.๊ธฐํ ์ ์ฉํ ๋ฆฌ์์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
npm
๋ฐ ๊ทธ ๊ฐ์ข
์ฐ์ตReference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(JS ํ์ฌ๐ ํ๋์จ์ด โ Nodebots ๋ฐ Johnny Five ์์), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/dkundel/js--hardware--getting-started-with-nodebots-and-johnny-five-hkํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค