JavaScript로 Arduino 제어하기 Johnny-Five

😢 이 페이지는 다음 주소로 변경될 예정입니다.

요즘 출퇴근 하는 시간에는 눈도 쉴 겸 팟캐스트를 자주 듣는다. 그 중 Hanselminutes을 애청하고 있는데 Scott Hanselman이 여러 분야 사람들을 인터뷰하는 방식으로 진행되는 팟캐스트다. 이 팟캐스트에서 진행한 Getting started making NodeBots and Wearables 에피소드에서 NodeBots 프로젝트Johnny-Five.io에 대해 알게 되어 살펴보게 되었다.

NodeBots

NodeBots 프로젝트는 말 그대로 JavaScript를 이용해 로봇공학을 배우는 프로젝트로 세계 각지에서 진행되고 있다고 한다. JS를 사용할 수 있는 이점을 살려 쉽고 재미있는 과정을 제공하고 있는데 2015년 7월 25일은 국제 NodeBots의 날로 각 지역별로 프로그램이 진행된다.(멜번에서도!) 아쉽게도 한국에는 아직 오거나이저가 없는 것 같다.

Johnny-Five는

Johnny-Five는 JavaScript 로봇공학 프로그래밍 프레임워크로, 이전 포스트인 ino toolkit으로 Arduino 맛보기에서 C 문법 스타일의 sketch를 사용한 반면 이 프레임워크로 JavaScript를 이용해 제어할 수 있다. 그리고 REPL을 제공하고 있어서 실시간으로 데이터를 확인하거나 nodejs의 다양한 라이브러리도 활용할 수 있다. NodeBots 세션에서는 손쉽게 웹API로 만들어 브라우저를 통해 제어하는 등 이전 환경에서는 만들기 까다로웠던 부분을 재미있게 풀어가는데 활용하고 있다. 게다가 이 프레임워크는 아두이노에만 국한된 것이 아니라 다양한 개발 보드를 지원하고 있는 것도 장점이다.

그 사이 주문한 서보 모터는 도착했는데 서보 실드나 브래드보드가 도착하지 않아서 여전히 LED 깜빡이는 수준이라 아쉽다. 🙁 이 포스트에서는 Raspberry Pi에 Arduino Uno를 연결해서 진행했다.

요구 환경

OSX에서는 Node.js, Xcode, node-gyp가 필요하고 Windows에서는 Node.js, VS Express, Python 2.7, node-gyp가 필요하다.

$ npm install --global node-gyp

요구 사항은 Getting Started 페이지에서 확인할 수 있다.

Firmata 설치하기

Arduino에서 Johnny-Five를 사용하기 위해서는 Firmata를 먼저 설치해야 한다. Firmata는 마이크로 컨트롤러를 소프트웨어로 조작하기 위한 프로토콜인데 펌웨어 형태로 제공되고 있어 arduino에 설치하기만 하면 된다.

Arduino IDE를 사용하고 있다면 아두이노를 연결한 후, File > Examples > Firmata > StandardFirmata 순으로 선택한 후 Upload 버튼을 클릭하면 된다고 한다.

CLI 환경에서 작업하고 있는 경우에는 Firmata 코드를 받아 ino로 빌드 후 업로드할 수 있다. 여기서는 v2.4.3 이지만 Firmata github에서 최신인지 확인하자.

$ wget https://github.com/firmata/arduino/releases/download/v2.4.3/Arduino-1.6.x-Firmata-2.4.3.zip
$ unzip Arduino-1.6.x-Firmata-2.4.3.zip
$ cd ./Firmata/

# StandardFirmata.ino를 복사해서 빌드에 포함시킴
$ cp ./examples/StandardFirmata/StandardFirmata.ino ./src

이 상황에서 바로 빌드하면 에러가 난다. StandardFirmata.ino를 에디터로 열어 다음 코드를 찾는다.

#include <Firmata.h>

그리고 다음처럼 Firmata.h 파일을 폴더 내에서 찾도록 수정한다.

#include "./Firmata.h"

모든 준비가 끝났다. USB로 연결한 후, ino로 빌드와 업로드를 진행한다.

$ ino build
$ ino upload

Firmware를 생성하고 업로드하는 과정을 화면에서 바로 확인할 수 있다. 이제 Johnny-five를 시작하기 위한 준비가 끝났다.

Johnny-five로 LED 깜빡이 만들기

앞서 과정은 좀 복잡했지만 johnny-five를 사용하는건 정말 간단하다. 먼저 nodejs가 설치되어 있어야 한다. 프로젝트를 만들고 johnny-five를 npm으로 설치한다.

$ mkdir helloBlinkWorld
$ cd helloBlinkWorld
$ npm init # 프로젝트 정보를 입력
$ npm install --save johnny-five

설치가 모두 완료되면 blink.js를 생성해 다음 JavaScript 코드를 입력한다.

var five = require("johnny-five"),
    board = new five.Board();

board.on("ready", function () {

  // 13은 보드에 설치된 LED 핀 번호
  var led = new five.Led(13);

  // 500ms으로 깜빡임
  led.blink(500);

});

정말 js다운 코드다. 위 파일을 저장하고 node로 실행하면 보드와 연동되는 것을 확인할 수 있다. (아쉽게도 동영상은 만들지 않았다 🙂 더 재미있는 예제를 기약하며)

$ node blink.js

JavaScript가 다양한 영역에서 사용되고 있다는 사실은 여전히 신기하다. 이 프레임워크도 상당히 세세하게 많이 구현되어 있어서 단순히 JS 로보틱스 입문 이상으로도 충분히 활용할 수 있겠다는 인상을 받았다. 조만간 Tessel 2도 나올 예정인데 이 기기의 js 사랑도 이 라이브러리와 견줄만 할 정도라 많이 기대된다.

ino toolkit으로 Arduino 맛보기

😢 이 페이지는 다음 주소로 변경될 예정입니다.

지난번 구입한 Raspberry Pi에 이어 이번엔 Arduino가 도착했다. 첫인상으로 비교했을 땐 Raspberry Pi는 똑똑하고 Arduino는 우직한 기분이 든다. 🙂 Arduino는 모든 정보가 오픈소스로 공개되어 있어서 훨씬 다양한 종류의 보드가 존재한다. Arduino가 적혀 있는 공식 보드도 있지만 자체 브랜드가 적혀있거나 아예 아무 내용도 적혀있지 않은, 저렴한 보드도 있다.

Arduino의 모습

ebay를 통해서 5달러로 ATmega328P가 탑재된 아두이노 호환 보드를 구입했다. 이외에도 소켓 브레드보드, ESP8266 WIFI 무선 송수신 모듈, Servo를 위한 모듈을 구입했는데 오늘 보드가 먼저 도착했다. 저항도 구입해야 하는데… 낱개로는 저렴하지만 결국 비싼 취미가 되고 있는 느낌이다.

별도 모듈 없이 보드 자체만 가지고서는 보드에 있는 LED를 껐다 켰다 하는 것이 할 수 있는 전부다. 기본적으로 보드 메모리에 설치되어 나오는 것도 이 LED를 껐다 켰다 하는 blink인데 전원을 넣으면 LED가 깜빡이는 것을 확인할 수 있다. 다음 사진에서 빨간 LED는 전원이고 초록색은 조작할 수 있는 LED다.

이 포스트에서는 Raspberry Pi에 Arduino를 USB로 연결해 진행했다. 여기서 사용한 ino 툴킷은 아쉽게도 맥과 리눅스 환경에서만 구동 가능하다. 만약 윈도우 환경이라면 Arduino IDE를 사용하자.

먼저 Raspberry Pi와 Arduino가 서로 통신할 수 있도록 드라이버를 설치한다. sudo를 쓰지 않아도 되는 환경이라면 사용하지 않아도 무관하다.

$ sudo apt-get install arduino

GUI 환경에서는 Arduino IDE를 설치하면 되지만 콘솔에서 작업하고 싶다면 Python으로 작성된 ino 툴킷을 사용하면 된다. 이 라이브러리는 pip 또는 easy_install로 설치할 수 있다.

$ sudo pip install ino

pip가 없다면 다음과 같이 easy_install을 사용할 수 있다. 물론 리포지터리를 받아 setup.py를 실행해도 된다.

$ sudo apt-get install python-setuptools
$ easy_install ino

Arduino의 HelloWorld인 blink 프로젝트를 만들어보자. blink 프로젝트를 템플릿으로 사용해 프로젝트를 초기화한다.

$ mkdir helloWorld
$ cd helloWorld
$ ino init --template blink

lib 디렉토리와 src 디렉토리, 그리고 src/sketch.ino 가 생성된 것을 확인할 수 있다. sketch.ino를 열어보면 blink 템플릿 내용을 확인할 수 있다.

#define LED_PIN 13

void setup()
{
    pinMode(LED_PIN, OUTPUT);
}

void loop()
{
    digitalWrite(LED_PIN, HIGH);
    delay(100);
    digitalWrite(LED_PIN, LOW);
    delay(900);
}

이제 이 코드를 빌드해서 arudino에 올려보자. ino buildino upload로 간단하게 빌드, 업로드 할 수 있다.

$ ino build

위 명령어를 입력하면 빌드 과정을 보여준다. firmware.hex가 변환되고 업로드 할 준비가 완료된다. 이제 업로드를 진행한다.

$ ino upload

업로드가 진행되고 arduino에 있는 LED가 위에서 입력한, 새로운 패턴으로 깜박이게 된다.


아직 다양한 모듈이 없어서 맛보기만 했지만 LED 깜빡이는 것만 봐도 신기하다. 조만간 다른 모듈이 오면 더 재미있는 Thing을 만들 생각에 기대된다.