BeagleBone Blackにcloud9をインストールする

UbuntuをインストールしたBeagleBone Blackにcloud9 IDEをインストールしてみます。

cloud9 IDEとは

BeagleBone Blackに標準インストールのAngstrom上にプリインストールされている、Node.jsを利用したブラウザIDE環境です。今回はUbuntuに入れ替えてあるので、ここにcloud9 IEDを追加でインストールします。

cloud9 IDEのインストール

cloud9 IDEはgitihubに公開されていますので、これをインストールすれば動くはずです。

Requirements:

  • NodeJS >= 0.6.16
  • NPM >= 1.1.16
  • libxml2-dev

となっていますが、すでにNode.jsは0.8.22をnodebrewを使ってインストール済みで、同時にNPMもインストールされているので、libxml2-devをインストールします。

$ sudo apt-get install libxml2-dev

次にcloud9をインストールします

$ git clone https://github.com/ajaxorg/cloud9.git
$ cd cloud9
$ npm install

cloud9 IDEの起動

cloud9はデフォルトで起動すると、localhostからしかアクセスできないので、外部からブラウザ経由でアクセスするためには。以下のように起動します。

$ bin/cloud9.sh -l 0.0.0.0
make: Nothing to be done for `worker'.
Linux ARM
connect plugin start
Connect server listening at http://0.0.0.0:3131
IDE SERVER PLUGIN:  auth
IDE SERVER PLUGIN:  git
IDE SERVER PLUGIN:  gittools
IDE SERVER PLUGIN:  hg
IDE SERVER PLUGIN:  npm
IDE SERVER PLUGIN:  filelist
IDE SERVER PLUGIN:  search
IDE SERVER PLUGIN:  revisions
IDE SERVER PLUGIN:  settings
IDE SERVER PLUGIN:  shell
IDE SERVER PLUGIN:  state
IDE SERVER PLUGIN:  watcher
IDE SERVER PLUGIN:  node-runtime
IDE SERVER PLUGIN:  npm-runtime
IDE SERVER PLUGIN:  python-runtime
IDE SERVER PLUGIN:  apache-runtime
IDE SERVER PLUGIN:  ruby-runtime
IDE SERVER PLUGIN:  php-runtime
Started '/home/ubuntu/cloud9/configs/default'!
IDE server initialized. Listening on 0.0.0.0:3131

ポートは3131で起動していますので、BeagleBone BlackのIPアドレスを調べてアクセスしてみましょう。

f:id:tomo_watanabe:20131228220414p:plain

LEDの点灯・消灯サンプル

clou9が起動したら、サンプルアプリを動かしてみましょう。「New File」で新規ファイルを作成します。led.jsとかファイル名を付けておきます。下記はBoneScriptを使って、LEDを制御するプログラムです。

/**
 * LED点灯、2秒後に消灯
 */
var b = require('bonescript');

// LEDの設定
b.pinMode('USR0', b.OUTPUT);
b.pinMode('USR1', b.OUTPUT);
b.pinMode('USR2', b.OUTPUT);
b.pinMode('USR3', b.OUTPUT);

// LEDをONに
b.digitalWrite('USR0', b.HIGH);
b.digitalWrite('USR1', b.HIGH);
b.digitalWrite('USR2', b.HIGH);
b.digitalWrite('USR3', b.HIGH);

// 2秒後にLEDをOFFに
setTimeout(function() {
    b.digitalWrite('USR0', b.LOW);
    b.digitalWrite('USR1', b.LOW);
    b.digitalWrite('USR2', b.LOW);
    b.digitalWrite('USR3', b.LOW);
}, 2000);

実行してみます。

Running Node Process
Your code is running at 'http://0.0.0.0:21479'.
Important: in your scripts, use 'process.env.PORT' as port and '0.0.0.0' as host.
fs.js:338
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                ^
Error: EACCES, permission denied '/sys/class/leds/beaglebone:green:usr0/trigger'
    at Object.fs.openSync (fs.js:338:18)
    at Object.fs.writeFileSync (fs.js:756:15)
    at Object.f.pinMode (/home/ubuntu/cloud9/node_modules/bonescript/index.js:132:20)
    at Object. (/home/ubuntu/cloud9/myScript/led1.js:7:3)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)
    at process.startup.processNextTick.process._tickCallback (node.js:245:9)

どうやら、LEDへのアクセス権が無いということで怒られてしまいました....cloud9をroot権限で実行してやらないと、デバイスへのアクセスは出来ないようです。

$ sudo bin/cloud9.sh 
make: Nothing to be done for `worker'.
Linux ARM
bin/cloud9.sh: 18: bin/cloud9.sh: node: not found

今度はnodeが無いと怒られてしまいました。nodebrewをubuntuユーザでインストールしたため、rootユーザにnodeがインストールされていません。これを回避するには

  • rootでnodeをインストール
  • rootでcloud9を起動し、ubuntuユーザのnodeパスを指定

のどちらかを選択することになりますが、今回はnodeがすでにインストールされているので後者の方法で起動します。cloud.shを下記のように書き換えます。

Linux*arm*)  echo "Linux ARM"
    /home/ubuntu/.nodebrew/current/bin/node server.js "$@" -a x-www-browser
    ;;

BeagleBone Blackは"Linux ARM"なので、ここの部分をnodebrewのcurrentのnodeが起動するように修正します。これでもう一度起動して、先ほどのプログラムを実行します。

$ sudo bin/cloud9.sh -l 0.0.0.0
make: Nothing to be done for `worker'.
Linux ARM
connect plugin start
Connect server listening at http://0.0.0.0:3131
IDE SERVER PLUGIN:  auth
IDE SERVER PLUGIN:  git
IDE SERVER PLUGIN:  gittools
IDE SERVER PLUGIN:  hg
IDE SERVER PLUGIN:  npm
IDE SERVER PLUGIN:  filelist
IDE SERVER PLUGIN:  search
IDE SERVER PLUGIN:  revisions
IDE SERVER PLUGIN:  settings
IDE SERVER PLUGIN:  shell
IDE SERVER PLUGIN:  state
IDE SERVER PLUGIN:  watcher
IDE SERVER PLUGIN:  node-runtime
IDE SERVER PLUGIN:  npm-runtime
IDE SERVER PLUGIN:  python-runtime
IDE SERVER PLUGIN:  apache-runtime
IDE SERVER PLUGIN:  ruby-runtime
IDE SERVER PLUGIN:  php-runtime
Started '/home/ubuntu/cloud9/configs/default'!
IDE server initialized. Listening on 0.0.0.0:3131

今度はLEDが一斉に点灯して、2秒後に消灯するように動くはずです。

おわりに

BoneScriptは簡単にLEDやGPIOを制御できる便利なライブラリです。以前BoneScriptのライブラリ構成を調べましたが、socket.ioやserialportも入ってると思ったのですが、これらはBoneScript配下で使用されるようで、自分で意識して扱う場合には別途インストールする必要があるようです。

cloud9 IDEはBeagelBone Black上でGPIO制御などの動作確認やプロトタイピングにはいいのですが、実際にNode.jsサーバを動かすといった場合には、いつものようexpressなどを使うのが良いと思われます。おそらくBoneScriptはそのまま使えるので、上手く利用できるでしょう。