木曜日 6 12, 2008

[ English version is here ]

ここからは servocar-spots のソースコードをざっくりとみていきましょう。まずはじめに、リリース 1.0.0 のコードを以下↓のようにリポジトリからチェックアウトしてください(ただしコンピュータに subversion のクライアントがインストールされていることを前提にしています。また java.net のアカウントも必要ですので両方お持ちでない場合は準備ください)。

$ mkdir work; cd work
$ svn co https://servocar-spots.dev.java.net/svn/servocar-spots/tags/REL-1.0.0 servocar-spots --username <username> 
もちろん trunk から最新のコードをチェックアウトしても結構ですが、以後の説明はこのリリース(1.00)を前提としています。

チェックアウトしたら、servocar-spots ディレクトリにある2つの Sun SPOT アプリをそれぞれビルド、デプロイします。1つめはリモコン用のアプリ("ServoCar-Controller")でもうひとつはサーボ駆動用のアプリです("ServoCar-OnCar")。
$ cd servocar-spots/ServoCar-Controller
$ ant deploy
$ cd ../ServoCar-OnCar
$ ant deploy
次回は ServoCar-Controller のソースコード、特に Sun SPOT ネットワークと EDemoBoard の加速度センサを中心に見ていく予定です。

金曜日 6 06, 2008

[ English version is here

Sun SPOT アプリケーション (MIDlet) のクラスは "javax.microedition.midlet.MIDlet" を拡張して作成し、ライフサイクルは startApp() メソッドから始まります。

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
// ...
public class SunSpotApplication extends MIDlet {
// ...

protected void startApp() throws MIDletStateChangeException {
System.out.println("Hello, world");
// ...
Sun SPOT を使ってサーボをまわすために必要なコードは以下の2行だけです。
Servo serv0 = new Servo(EDemoBoard.getInstance().getOutputPins()[EDemoBoard.H0]);
serv0.setValue(2000);

サーボモータの動かしかたや動作原理の詳細については Servomechanism などを参照ください。Google で検索してもたくさんヒットすると思います。ここでは定期的に方形波・パルス(一定周期で "High" or "Low" を瞬間的に繰り返す波形)をサーボに送り続けるとサーボが回転し、方形波の周期中の "High" の長さによって回転角度(または continuous rotation の場合は速度)が変化するということが分かれば十分です。一般のサーボの場合は、このパルスの周期が 20 ミリ秒で 1500 マイクロ秒(つまり 1.5 ミリ秒) "High" が続くパルスを送った場合に 90 度回転します(この位置を "Neutral" position といいます)。他のパルスではこの 1500 を中心として、

  • 1500 - value マイクロ秒: 0 度
  • 1500 + value マイクロ秒: 180 度

回転します。上の "value" というパラメータはサーボによって異なりますが、一般的には 250 から 500 の間になっているようです(使用前に確認する必要があるかもしれません)。上の "Servo#setValue(2000)" はパルス中の "High" の長さを 2000 マイクロ秒にセットし、そのパルスをサーボに送り続けるコードになります。Sun SPOT においてサーボを動作させるコードはこれですべてです!

組み込みのプログラミングを組んだ方なら、同じことを C で書くのがこれほど簡単ではないことにお気づきかもしれません。もちろん使用しているマイコンの種類とか、どれだけライブラリが整備されているかによりますが、基本的には多くの include ファイルを取り込んだ後、使用するレジスタやシリアル通信用のコマンドシンタックス(フォーマット)を調べる必要があります。それからパルスを手動で発生させる場合はデジタルポートに対して "high" の送出 → 1.5 ms 待つ → "low" の送出を繰り返すコードを書く必要があります。またたとえ ATmega88 "8-bit Timer/Counter2 with PWM and Asynchronous Operation" などのような少し高レベルなオペレーションを使って PWM (pulse-width modulation) を発生させたとしても組み込み C における根本的な複雑さを解決できたとはいえません。

どうでしょうか?少しでもいいかも?と感じていただければ Sun SPOT への乗り換えを試してみる時期かもしれません!!

水曜日 5 28, 2008

[ English version is here ]

サーボ用の簡単な Sun SPOT プログラムを書いてみましょう。まず ${SUNSPOT_DIRECTORY}/Demos ディレクトリ内の "SunSpotApplicationTemplate" を Sun SPOT プロジェクトのひな形として使用しましょう(${SUNSPOT_DIRECTORY} は Windows では通常 "C:\Program Files\Sun\SunSPOT" ですが、ここの blog 通り試された場合は "C:\Sun\SunSPOT" になっているかもしれません)。

デモをまだインストールしていない場合は前回同様 web からダウンロードできます(Sun SPOT SDK のインストール を参照ください)。以下にデモのインストール方法について簡単にまとめておきます。

  1. http://www.sunspotworld.com/spotmanager/ にアクセス後、Sun SPOT icon をクリックし Sun SPOT Manager tool を立ち上げる
  2. "SDKs" タブを選択する
  3. 右下(Available SDKs の下)の "Demos" アイコンをクリック
  4. "Demo Installer" パネルの "Install" を押す

デモをインストール後、${SUNSPOT_DIRECTORY}/Demos/CodeSamples/SunSpotApplicationTemplate ディレクトリを適当な作業ディレクトリにコピーしてください。

$ mkdir ~/work
$ cp -r ${SUNSPOT_DIRECTORY}/Demos/CodeSamples/SunSpotApplicationTemplate ~/work/ServoTest
$ cd ~/work/ServoTest
そしてエディタで src/org/sunspotworld/demo/SunSpotApplication.java を以下のように編集してください。
  1. L.56 "long ourAddr = .." から L.66 ("notifyDestroyed();" の上まで)を削除
  2. 以下のコードを追加(太字部分)
<..snip..>
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.sensorboard.peripheral.Servo;
import com.sun.spot.peripheral.radio.IRadioPolicyManager;
<..snip..>
public class SunSpotApplication extends MIDlet {
private static final int CENTER = 1500;
private static final int RANGE = 1000;

private ITriColorLED [] leds = EDemoBoard.getInstance().getLEDs();

protected void startApp() throws MIDletStateChangeException {
System.out.println("Hello, world");
new BootloaderListener().start(); // monitor the USB (if connected) and recognize commands from host

EDemoBoard demo = EDemoBoard.getInstance();
Servo serv0 = new Servo(demo.getOutputPins()[EDemoBoard.H0]);
Servo serv1 = new Servo(demo.getOutputPins()[EDemoBoard.H1]);
serv0.setValue(0);
serv1.setValue(0);
Utils.sleep(500);

for (int i = 0; i < 4; i++) {
int r = (i % 2 == 0) ? RANGE / 2 : -RANGE / 2;
serv0.setValue(CENTER + r);
serv1.setValue(CENTER - r);
System.out.println("serv0 value: " + serv0.getValue());
System.out.println("serv1 value: " + serv1.getValue());
Utils.sleep(2000);
serv0.setValue(0);
serv1.setValue(0);
}

notifyDestroyed(); // cause the MIDlet to exit
}
<..snip..>
}

その後 "ant jar-app" を用いてプロジェクトをビルドします。このコマンドはプロジェクト以下のすべてのコードをコンパイルし、"suite" ディレクトリ以下に jar ファイルを作成します。

$ ant jar-app
$ ls suite
SunSpotApplicationTemplate_1.0.0.jar
この jar ファイルを Sun SPOT Servo Car (configured before) にデプロイ(配備)しアプリケーションを実行させてみましょう。そのためには Sun SPOT と PC を USB ケーブルで接続した後、以下のコマンドを実行してください。
$ ant deploy
<..snip..>
deploy:

BUILD SUCCESSFUL
Total time: 8 seconds
$ ant run
<..snip..>
-run-spotclient-once:
[java] SPOT Client starting...
[java] [waiting for reset]

[java] Local Monitor (purple-071018)
[java] SPOT serial number = 0014.4F01.0000.01A8


[java] ** VM stopped: exit code = 0 **


[java] Squawk VM Starting (purple-071018)...
[java] [NetManagementServer] starting on port 20
[java] Hello, world
[java] serv0 value: 2000
[java] serv1 value: 1000
[java] serv0 value: 1000
[java] serv1 value: 2000
[java] serv0 value: 2000
[java] serv1 value: 1000
[java] serv0 value: 1000
[java] serv1 value: 2000


[java] ** VM stopped: exit code = 0 **


[java] Exiting

-run-spotclient-multiple-times-locally:

-run-spotclient:

-post-run:

run:

BUILD SUCCESSFUL
Total time: 14 seconds

ひとつのサーボが時計回り(2秒)、反時計回り(2秒)、時計回り(2秒)、反時計回り(2秒)の順で回転し、他方のサーボがその逆方向に回転すればプログラムは正しく Sun SPOT にデプロイされています。次回はこのコードをもう少し詳しくみていきましょう。

日曜日 5 25, 2008

[ English version is here ]

前回 Sun SPOT SDK のインストールの仕方 を書きましたが、いくつかここで補足します。

まず Sun SPOT プロジェクトの公式 URL は http://www.sunspotworld.com/ です。Sun SPOT の SDK、チュートリアル、マニュアルなどはすべてここからダウンロードできます。また Sun SPOT に関して何か疑問点があれば大変活発な forum がありますのでどんどん質問してみましょう。もちろん Sun SPOT (正式には Sun SPOT Java Development Kit)の購入もここからできます(が、残念ながら 2008/5/25 日現在日本一般向けの発売はまだです。もうしばらくお待ちください)。Sun SPOT 生活をはじめるためにはまずこのサイトからスタートしましょう。

また話が若干前後しますが、Sun SPOT SDK をインストールする前には以下のソフトウェアがコンピュータにインストールされていると仮定しています。

(インストール方法は省略します。また詳細は Sun SPOT Java Development Kit の "installation instructions" を参照ください)。

これで Sun SPOT Servo Car のコードを書くためのハード、ソフトの両方の準備が整いました。次回はいきなり Servo Car ではなく、まず簡単なプログラムからはじめる予定ですが、すぐ Servo Car のコードを試したい方はいつでも自由に https://servocar-spots.dev.java.net/ からコードをチェックアウトできますのでお試しください。

金曜日 5 23, 2008

[ Enlgish version is here

Software setup

それでははじめての Sun SPOT アプリケーション Servo Car を書いていきましょう!本格的な Sun SPOT のアプリを書くには NetBeans のような IDE を使用すれば便利ですし、普段は私も使っています。ただ最初は最小限の開発環境 - Sun SPOT SDK、お好みのテキストエディタ、端末エミュレータ - ではじめてみましょう。

Sun SPOT SDK はバージョンによって色分けされています。2008/05/23 現在ステーブルなバージョンは v3 ("Purple" release) です。このデモではこの Purple を使用することにします。

Purple SDK CD-ROM の入った Sun SPOT Java Development Kit が手元にあれば CD から SDK をインストールできます。もしなければ http://www.sunspotworld.com/spotmanager/ からインストールすることもできます。このサイトでは v3 だけではなく、ベータ版を含めてすべてのリリースが保存されていますのでこちらの方がお勧めです。以後はこのサイトからのインストール方法を説明します。

Sun SPOT SDK のインストールの仕方

  1. http://www.sunspotworld.com/spotmanager/ にアクセス後、この Sun SPOT icon をクリックし Sun SPOT Manager tool を起動
  2. "SDKs" タブを選択
  3. purple-071018 ("Purple Beta RC5" とラベルがついてるかもしれません)を "Available SDKs" から選択。ここに利用できるバージョンがひとつもないときは "Available SDKs" の下にある "Refresh" ボタンを押す
  4. "Install" を押すと "Sun SPOTs SDK Installer Tool" が立ち上がる
  5. "New SDK Directory Location" 以外はデフォルト値を選択(ただし Windows を使用していなければすべてデフォルト値で OK)。Windows の場合はこの値が "C:\Program Files\Sun .." ではじまっており、この "C:\Program Files" 以下に SDK をインストールすると(通常の Sun SPOT アプリの開発には特に問題はないのですが) Sun SPOT エミュレータを使用する場合に問題があることが報告されています。ですのでこのディレクトリ以下でない(例えば. "C:\Sun ..")ところにインストールしましょう(詳細は https://www.sunspotworld.com/forums/viewtopic.php?p=2809 を参照ください)
  6. "Install" を押しインストール終了後 "Done" を押す
  7. "Installed SDKs" に今インストールしたバージョンが現れる

もし上記で "New SDK Directory Location" を変更した場合は .sunspot.properties (通常は C:\Documents and Settings\<user> にあります)内の "sunspot.home" の値を上記の変更にあわせて編集してください。

インストールを確かめるためには Sun SPOT と PC を USB ケーブルで接続し端末エミュレータを開いて以下のコマンドを実行してください。

$ cd $(SDK_DIRECTORY_LOCATION) <- 適宜変更
$ ant info
<..snip..>
-run-spotclient-once:
[java] SPOT Client starting...
[java] [waiting for reset]

[java] Local Monitor (purple-071018)
[java] SPOT serial number = 0014.4F01.0000.01A8

[java] Application slot contents:
[java] C:\cygwin\home\miyake\tmp\ServoTest
[java] 2350 bytes
[java] last modified Fri May 23 11:58:24 JST 2008

[java] Startup:
[java] Squawk startup command line:
[java] -flashsuite:10900000
[java] -Xboot:268763136
[java] -Xmx:478000
[java] -Xmxnvm:128
[java] -isolateinit:com.sun.spot.peripheral.Spot
[java] -dma:1024
[java] -MIDlet-1
[java] OTA Command Server is enabled
[java] Configured to run the current application

[java] Library suite:
[java] hash=0xa2fb25
[java] Installed library matches current SDK library
[java] Installed library matches shipped SDK library
[java] Current SDK library matches shipped SDK library

[java] Security:
[java] Owner key on device matches key on host

[java] Configuration properties:
[java] spot.external.0.firmware.version: 1.9
[java] spot.external.0.hardware.rev: 5.0
[java] spot.external.0.part.id: EDEMOBOARD_REV_0_2_0_0
[java] spot.hardware.rev: 5
[java] spot.mesh.management.enable: true
[java] spot.mesh.traceroute.enable: false
[java] spot.ota.enable: true
[java] spot.powercontroller.firmware.version: PCTRL-1.79
[java] spot.sdk.version: purple-071018

[java] Exiting

-run-spotclient-multiple-times-locally:

-run-spotclient:

BUILD SUCCESSFUL
Total time: 2 seconds


"ant info" は接続された Sun SPOT の情報を表示します。上記と同じような出力になればおめでとうございます!インストールは正しく行われています。

木曜日 5 22, 2008

[ English version is here ]

java.netSun SPOT Servo Car 用の新プロジェクト (https://servocar-spots.dev.java.net/) を立ち上げ、すべてのソースコードをインポートしました。フィードバック、コメント、ご質問大歓迎です!

[ English version is here

ハードウェアセットアップ(つづき)

概要

一般的なブレッドボードは穴同士が電子的に接続されています。どの穴同士が接続されているかはブレッドボードごとに多種多様です。 今回は下の図のようなレイアウトのブレッドボードを使用しました(同じ赤い線上にある穴が相互に接続されています)。
 

 
サーボは Vdd、GND、I/O ピンの3つのコネクタをもっています。I/O ピンはパルス波を送るために使うので Sun SPOT の Hxx ピン(H0 ~ H3)に接続する必要があります(どのピンを使用したかはプログラムで設定可能です)。ここでは右タイヤ用に H0、左タイヤ用に H1 を使用することにします。またこのサーボのケーブルの色は I/O ピンが白、Vdd が赤、GND が黒です(下の図を参照)。使用前にお持ちのサーボのスペックをよく確認してください。
 

 
電源パックは当然+と-の線がありますので、このサーボを Sun SPOT と組み合わせて動かすためには結局以下の接続が必要です。

  • 電源+ <---> サーボ Vdd <---> Sun SPOT VH ピン
  • 電源- <---> サーボ GND <---> Sun SPOT GND ピン
  • サーボ I/O ピン <---> Sun SPOT H0 (または H1) ピン

 
つなぎかた

1. ヘッダピンを2つブレッドボードに差します

 
2. 最初のサーボを最初のヘッダピンに接続します


3. ブレッドボードに電源を接続します


4. Sun SPOT と最初のヘッダピンを接続します (SPOT's H0 to I/O pin, SPOT's VH to Vdd and SPOT's GND to GND)


5. 2つ目のサーボを2つ目のヘッダに接続します。またこの2つ目のサーボにも電源を供給するために、以下のようにヘッダピン同士を接続する必要があります(ヘッダ間のオレンジ色の線をチェックしてください)


6. Sun SPOT と2つ目のヘッダを接続します (SPOT's H1 to I/O pin)


7. おしまい


次回は接続が正しくできているかを確認するための簡単なプログラムを書いてみましょう。

火曜日 5 20, 2008

[ English version is here ]

ハードウェアセットアップ

それではハードの設定からはじめましょう。Servo Car 用に以下のパーツが必要になります(ただし車輪などは除いてます)。

 

 

 

  • Sun SPOT x 2 (車用とリモコン用)
  • ブレッドボード x 1
  • ヘッダピン x 3
  • 電源 (1.5V x 4) と電源パック
  • サーボ x 2 (右・左車輪駆動用)
  • ジャンパー線

注意深くみると前回のくるまとの違いに気づくかもしれません。そう、前回のくるまはブレッドボードを使用してませんでした(配線がごちゃごちゃするため)。しかし、はんだその他のあまり本質でないところでの失敗を避けるため、まず最初はこのブレッドボードを使ったキットで試してみましょう。

サーボは基本的にどのようなものを使用しても構いませんが、ひとつだけ注意点があります。それはこのデモではいわゆる "continuous rotation" のサーボを選択しなければならない点です(なぜだかおわかりでしょうか?)。サーボはロボット(の関節)などにもよく使用されていますので、必ずしも一方向にずっと回転しつづけるものばかりが売られているわけではなく、他にも 90/180/270 度回転のものなどが販売されています(そして一般にそのようなものの方が安く売られています)。ただしここでは車輪用として使うために必ず "continuous rotation" のサーボを選択しましょう。

次回はコンポーネント間の配線をじっくりみていきましょう。

[ English version is here ]


ぼちぼちとここでも Sun SPOT アプリケーションの詳細について書いていこうと思います。iRobot Create + Sun SPOT もそのようなアプリの候補ですが、まずよりシンプルな "Servo Car" と命名した簡易版ラジコンカーからはじめようと思います(ちなみに以前は先頭部分が車輪でなくペンでお絵かきするロボットであったため "DrawBot" と呼んでいました)。ハード・ソフトの詳細に入る前にまずはここのビデオを見て完成形をイメージしてみましょう!

木曜日 5 15, 2008

[ English version is here ]

 


OpenSolaris 2008.05 がリリースされました。自分の Laptop にインストールしてみたところ wifi 周りを含めて特別な設定なしにすぐ使える状態になっています(素晴らしい)。少なくともこの Laptop へのインストールに関しては Ubuntu 8.04 より初心者向けかもしれません。ひとつだけ変更を加えたのは(X Window での)Caps Lock と Control キーの swap です。以下のような感じで変更できます(Ubuntu では gnome-control-center から設定できますが opensolaris 2008.05 では同様の設定がみつかりませんでした)。

  1. single-user モードに移行

    GRUB メニューから:Edit モードに入るため "e" を押し "kernel" line を編集するため再度 "e" を押す。このラインの最後に " -m milestone=single-user" を追加。その後 "b" を押し single-user モードで起動する。

    または

    コマンドプロンプトから:ルートユーザーで "svcadm milestone single-user" を実行

  2. ログイン後、xorg.conf を作成、設定するため以下のコマンドを実行する

    # /usr/X11bin/xrogcfg

    GUI パネルで以下の要領でキーボードの設定をする

    - 上の方にあるキーボードのアイコンを押す -> "Add new keyboard" を選択 -> "config" ウインドウが表示されるので↓を設定

    Keyboard model -> Japanese 106-key
    Keyboard layout -> Japan
    Xkb options -> Control key position -> Swap Control and CapsLock

    - "config" ウインドウ上の ok を押す
    - "xorgcfg" ウインドウの Quit を押す(この後すべての質問に "yes" ボタンを押してデフォルトの答えを受け入れる)

  3. multi-user mode に戻るため以下を実行

    # svcadm milestone all

木曜日 4 17, 2008

[ English version is here

2日目(4/10/2008)は以下のセッションに参加しました。

  • Project Caroline
  • Project Darkstar / Project Wonderland

以下、要約です。

Project Caroline

Project Caroline はインターネットベースのサービス(アプリケーション)の開発とデリバリー(配備)の両方を支援するホスティング・プラットフォームです。このプラットフォームは「プログラミングを使って設定できる」仮想的な CPU、ストレージ、ネットワークのリソースなどから構成されています。Project Caroline はソフトウェア・プロバイダがサービスを迅速に、また商用サービスのアップデートを頻繁に行うことを可能にします。また実際の要求に応じてサービスへのリソースの割り当てを自動的に調整します。

インターネットのサービスは単に「プログラムコードを書く」というところから「コードを書いて実行する」という方向に移行していますが、この作業は想像以上に大変なものです。なぜならそれは開発者のワークフローが単にプログラムを書くだけでなくアプリケーションの配備・メンテナンスを含めたものになるためです。このような管理の煩雑さを開発者から解放するために、Sun Labs では "Project Caroline" と呼ばれるリサーチ・プロジェクトを発足させ、長期に渡って実行されるインターネットサービスの開発と配備の両方のためのプラットフォームづくりを進めてきました。

Project Caroline の大きな特徴のひとつとして「分散リソースの完全なプログラム制御」が可能なことが挙げられます。つまり、開発者はアプリケーションを書くように Java, JRuby, Perl, Python などを用いてネットワークのリソース管理が行えるわけです(これらは現在では基本的に設定ファイルを手動で、もしくはなんらかの GUI ツールを用いて編集するのが一般的です)。例えばレイヤー4ロードバランサーを次のような Java コード(一部)で作成・設定することが可能です。

scfg = new L4VirtualServiceConfiguration();
scfg.setExternalNetworkAddress(extAddr.getUUID());
scfg.setPort(80);
scfg.setProtocol(Protocol.TCP);
scfg.setRealServices(Arrays.asList(
new RealService(intAddr.getUUID(), 8080)));
myLB = grid.createNetworkSetting(“myLB”, scfg);

以下は DNS record を作成する別の例です。

bcfg = new HostNameBindingConfiguration();
bcfg.setHostName(“www”);
bcfg.setAddresses(Arrays.asList(extAddr.getUUID()));
myDNS = grid.getExternalHostNameZone().createBinding(
“myDNS”, bcfg);

このセッションでは他に Project Caroline を用いて Facebook のアプリケーションのリソースを制御するデモを披露していました。プロジェクトに関する詳細なドキュメント・他のサンプルなどについては https://www.projectcaroline.net/ を参照してください。

Project Darkstar / Project Wonderland

Project Darkstar はオンラインゲームのような大規模かつ最小限のレイテンシーが求められるアプリケーションのためのソフトウェアサーバですべて Java で実装されています。このプロジェクトはオープンソース(GPLv2)で利用可能であり、商用ライセンスも提供可能です。このプロジェクトの主目的は CPU などのリソースを効率的に利用できるインフラを提供する一方、開発者に対してはシンプルなイベント・ドリブンかつ単一のシステムとしてこのプロジェクトを利用できるようにしています。現在のフォーカスとしては、ひとつのオンラインゲームを複数のマシンが強調して提供する、いわゆるクラスタリングのサポートをメインに行っています。このプロジェクトに関する詳細に関しては http://projectdarkstar.com/ を参照ください。

Project Wonderland は Java ベースの 3D 仮想空間を構築するためのツールキット(Java 版 Second Life のようなもの)です。この世界では実世界に近い音声を使って互いにコミュニケーションをとったり、Web ブラウザや OpenOffice (文書も含めて)などのアプリケーションを共有することが可能です。そしてこの Project Wonderland は先ほどの Project Darkstar をベースとして実装されています。このセッションではスループットの問題を克服するためにどのように Wonderland client のデザインを変更したか、また Project Darkstar Server によりよく適応するためにどのような変更をしたかなどが詳細に語られていました。

水曜日 4 16, 2008

[ English version is here

 

この Sun Labs Open House 2008 では Sun SPOT HOL (hands-on lab) も同時に開催されていました。この HOL は5月6-9日に開催予定の JavaOne 2008 で行われるものとまったく同じものを特別に今回用意したものです。ですのでもし JavaOne 2008 に参加する機会のある方はぜひトライしてみてください。私自身は別のセッションと重なってしまい直接参加できなかったのですが、インストラクターがキットを1セット1日貸してくれたのでホテルに帰ってから試しました。

この HOL のゴールは 2つの Sun SPOT を使用して bend センサー(折り曲げた角度によって電圧値が変化するアナログセンサー)からの入力値をもとにリモートでサーボ(HiTec HS-311 Servo)を回転させるというものです。実際の完成品はここのビデオをみてください。

このエクササイズは以下のように5つのパートに分かれていて、

  • bend センサーのハードウェア設定
  • Sun SPOT 上で bend センサー制御のプログラミング
  • サーボのハードウェア設定
  • Sun SPOT 上でサーボ制御のプログラミング
  • 2つの Sun SPOT のネットワークプログラミング
電子回路の設計に(はんだでなく)ブレッドボードを使用します。ですので、ソフトウェア開発者の方で Sun SPOT および電子工作はビギナーだけれども興味がある、という方にぴったりな内容に仕上がっていると思います。

火曜日 4 15, 2008

[ English version is here ]

Sun Labs Open House 2008 初日です。今回このイベントに参加するために Menlo Park Sun Labs にやってきました。Sun Labs へ来るのは昨年6月に2週間 Sun SPOT の技術習得およびデモ作成のために来て以来になります。そういう関係上、やはり今回もメインは Sun SPOT  関連が中心ですが、それ以外にも最先端の技術が目白押しでした。ここではできる限りそれをお伝えできればと思います。

午前中は JVM に関するいくつかの興味深い話を聞きましたが、すべて internal only のセッションのため、ここでは割愛します。午後は次のようなセッション・デモに参加しました。

  • Sun Small Programmable Object Technology (SPOT)
  • Project Live* [live star]
  • Project Squawk

以下、要約です。

Sun Small Programmable Object Technology (SPOT)

このセッションは Sun SPOT の Overview、デモ、最新の "in-the-field" の説明が中心でした。アジェンダはいくつかのトピックに分かれており(introduction, hardware, squawk, networking, security, solarium, emulator, in the field and hands on labs)、各担当エンジニアがそれぞれのトピックを説明するという形式でした。

Sun SPOT デバイスは3層に分かれており、それぞれバッテリー、プロセッサーボード(無線)、センサーボードになります。プロセッサーボードはそれ単体でベースステーションとして機能します。ベースステーションとは他の Sun SPOT と通信するために USB 経由で PC に接続される(センサーボードのない) Sun SPOT です。ユーザーはこのデバイスを標準的な Java のツール・IDE(NetBeans など)を用いてプログラムすることが可能です。

以下はプロセッサーボード("eSPOT" とも呼ばれます)のスペックです。

  • 180 MHz 32 bit ARM920T core processor (Atmel AT91RM9200)
  • 512K RAM/4M Flash PROM
  • 2.4GHz 802.15.4 Radio Transceiver (TI CC2420)
  • USB interface - mini-b connector
  • Real Time Clock and Power Management Processor (Atmega88)
  • 3.6V rechargeable 750 mAh lithium-ion battery
  • 30 pin high density interboard connector
  • “Java on the metal” - No OS. Squawk VM runs on the bare metal

eDemoboard(センサーボード)のスペックは↓です。

  • 2G/6G 3-axis accelerometer
  • Light sensor
  • Temp sensor
  • 2 push buttons
  • 8 RGB 24 bit LEDS, power/control LED
  • 6 analog inputs readable by a 12 bit ADC
  • 5 General Purpose I/O pins (GPIO) and 4 high current output pins w/ Atmega88 IO processor

Sun SPOT ハードウェアは自作することもできます。eDemoboard は Sun SPOT developer's kit で現在出荷されているこのような実装の一種にすぎません(詳しくは eBones project を参照ください)。

Sun SPOT developer's kit は以下のものを含みます。

  • 2 x Full Sun SPOTs with eDemoSensor boards and batteries
  • 1 x base-station Sun SPOT
  • Software (Squawk VM, Java SDK, Netbeans)
  • Other equipments (USB cable, Mounting clips, 2 x wall mounts, 1 x PC board mount)

Sun SPOT の無線機能は IEEE 802.15.4 (Zigbee) をベースにしており Bluetoosh (802.15.1) や Wi-Fi (802.11) と比較して速度は遅いが低コスト・低電力という特徴があります。スペック的には 128 バイトパケット、レンジ ~70m、250kbps、2.4GHz そして通信範囲を動的に拡大可能なメッシュネットワークです。また HTTP、TCP/IP* 経由でインターネットに接続されたデバイスと簡単に接続することが可能です(* ただし TCP/IP の実装は現在進行中です)。

セキュリティー関連の新機能(将来の SDK で予定)は SSL のサポートです。SSL をサポートするためには現在の radio stream 接続をオープンするための以下の構文を

conn = Connector.open(“radiostream://” + addr + “:” + port);

次のように変更するだけです。

conn = Connector.open(“sradiostream://” + addr + “:” + port);

Sun SPOT SDK には素晴らしいエミュレーターも含まれてますのでたとえ実際にSun SPOT をもっていなくてもプログラムを作成することができます!

"In-the-field" セッションでは Sun SPOT を実際に使用したプロジェクトが紹介されていました。例えば "Project Blackbox" では移動中の状態監視に利用したり、Yggdrasil というプロジェクトではデータ収集の共通フレームワークとして利用されたりしているようです。

Project Live* [live-star]

Projct Live* はソフトウェアの配布と構成に関する新しい手法に関するプロジェクトです。Live* ではソフトウェアは "immutable" なファイルシステムイメージ(CD イメージのようなもの)として構成されます。そのイメージは OS、データベース、アプリケーションサーバーなどのコンポーネントで構成されます。起動時に Live* は動的にこれらのモジュール(コンポーネント)を集めてひとつの仮想ソフトウェア環境として構成します。シンプルなファイルシステムの仮想化技術を使用することによって、Live* はこれらの構成をすべての既存のソフトウェアに対して完全に透過的に実行することができます。

家電などで使用されるソフトウェア同様に Live* ではシステムのカスタマイズや構成をオリジナルのソフトウェアとは別のリポジトリにおきます(あくまでオリジナルのソフトウェアは "immutable" です)。この技術ではソフトウェアの配布の概念をいわゆる LiveCD のようなイメージの形に拡張し、純粋なカスタマイズの "modularity" と柔軟性を提供します。

デモのコーナーでは、Linux distribution のアップグレードに関する以下のようなデモを行ってました。

  • ユーザーが xVM 上で Live* に対応した Red Hat version A を動作させています。
  • このユーザーはネットワークやフォントの設定などさまざまなカスタマイズを Red Hat version A 上で行います。
  • ユーザーは新バージョンの Red Hat version B (Live* 対応)にアップグレードします。
  • インストール後、普段は最初から上記の各種設定(ネットワークの設定など)をやりなおす必要がありますが、設定内容はディストリビューション上でなく Live* リポジトリに保存されてるので透過的に前回の設定のまま Red Hat version B を使用することができます。

Live* はVMware、xVM (Xen)、Virtual Box などと組み合わせて使用するとより利点がでます。ロバスト性とセキュリティーを改善しつつ管理をより簡素化することができます。

Project Squawk

Squawk は Sun SPOT のようにリソースの制限が厳しいデバイス用に設計された Virtual Machine です(また現在のところ LEGO Mindstorms NXT や Custom FPGA に移植される予定です)。Squawk は以下のような特徴をもってます。

  • J2ME CLDC 1.1/IMP 1.0 Profile 実装
  • Runs on the bare metal (No OS)
  • メモリー制限の厳しいデバイス向けに設計
  • 主に Java を使って実装
  • 複数のアプリを実行可能(isolates)でデバイスをまたがってアプリの移行が可能
  • Solaris, Linux, Mac, Windows 対応
  • 移植が容易
標準の JVM と比較して、ローダ、ガベージコレクタ、コンパイラ、デバイスドライバなど Squawk VM の多くの機能が Java で書かれています。"isolates" という機能を使えば1つの JVM プロセス上で複数のアプリケーションを実行することができ、さらにそのアプリケーション同士で(いくつかの)メモリを共有することも可能です。

月曜日 4 14, 2008

[ English version is here ]

iRobot Create Open Interface (OI) は多くの機能をもっています。例えば LED の制御、サウンド演奏およびセンサー(壁検出)制御などです。しかし、iRobot Create + Sun SPOT demo のためには以下のコマンドだけを理解すれば十分です。

  • Start コマンド
  • Mode コマンド
  • Drive コマンド

"Start" コマンドは OI を開始するためのトリガーです。iRobot Create はその制御レベル(ユーザーがどの程度 iRobot Create を制御できるか)に応じて4つのオペレーティングモード(Off, Passive, Safe, Full)をもっています。iRobot Create + Sun SPOT demo では常に iRobot Create を完全に制御できる "Full" モードを利用しますが、今回は "Safe" モードを使用します。Safe モードは Full モードとほぼ同じですが、安全のためにがけ・脱輪センサーなどが働き、危険時には動作がストップする点が異なります(詳細については iRobot Create 仕様 を参照ください)。

"Drive" コマンドは iRobot Create の車輪を駆動させるためのコマンドで、iRobot Create + Sun SPOT demo のメインのコマンドです。前回使用したシリアル接続 + Realterm を使用してこのコマンドを試してみましょう。

Drive コマンドの syntax (シリアルシーケンス)は

[137] [Velocity high byte] [Velocity low byte] [Radius high byte] [Radius low byte]

です。直進速度の範囲は -500 から 500 mm/s、回転速度の範囲は -2000 から 2000 mm です。"radius value" に関しては以下のような3つの特別なケースがあります。

  • 0x8000 or 0x7FFF: 直進(+ Velocity 前進、- Velocity 後進)
  • 0xFFFF: 回転(時計回り)
  • 0x0001: 回転(反時計回り)

つまり、iRobot Create をここのビデオのように動かしたい場合は以下のようなコマンドを送ればよいわけです。

  • 128 131 (Start OI and puts the OI into Safe mode)
  • 137 0 100 128 0 (move forward at 100 mm/s)
  • 156 1 44 (until traveling 300 mm (3 s))
  • 137 0 0 128 0 (stop)
  • 155 20 (wait for 20 * 1/10 = 2 s)
  • 137 255 156 128 0 (move backward at -100 mm/s)
  • 156 254 212 (until traveling -300 mm (3 s))
  • 137 0 0 128 0 (stop)
  • 155 20 (wait for 20 * 1/10 = 2 s)
  • 137 0 100 0 1 (move counter-clockwise at 100 mm/s)
  • 157 1 105 (until rotating 360 degrees)
  • 137 0 0 128 0 (stop)
  • 155 20 (wait for 20 * 1/10 = 2 s)
  • 137 0 100 255 255 (move clockwise at 100 mm/s)
  • 157 254 152 (until rotating -360 degrees)
  • 137 0 0 128 0 (stop)

上記の "Wait" コマンドについてはまだ説明していませんでしたのでここで説明します。iRobot Create OI はいくつかの「待機」コマンドをもっており、文字通りなんらかのイベントが起きるまで次のコマンドの実行を「待機」するコマンドです。"Wait Distance (Opcode: 156)" は iRobot Create がある距離(mm)進むまで待機するコマンドです。ですから上の "156 1 44" は 100 mm/s で進んでいる場合には (256 + 44) / 100 = 3 秒待つという意味になります。また、"Wait Angle (Opcode: 157)" はある角度(度)動くまで待機するコマンド、"Wait Time (Opcode 155)" はある一定時間待機するコマンドです。

話はそれますが、OI を使用するためには(上記のフォーマットでの)10 進→ 16 進変換をよく行いますのでそのためのツールを準備しておくと便利かもしれません。Ruby を使用した場合は↓のようなスクリプトで上記で使用した -100, -300, -360 を変換することができます。

$ cat conv.rb
#!/usr/bin/env ruby

ARGV.each {|n|
s = sprintf("%.4x", n)
puts "#{n} => #{s} (#{s[0,2].hex} #{s[2,4].hex})"
}
$ ./conv.rb -100 -300 -360
-100 => ff9c (255 156)
-300 => fed4 (254 212)
-360 => fe98 (254 152)

上記コマンドを Realterm 上で実行するには iRobot Create の電源を入れた後、"128 131" を最初に送信した後、残りのコマンドを一度に送信することができます:

137 0 100 128 0 156 1 44 137 0 0 128 0 155 20 137 255 156 128 0 156 254 212 137 0 0 128 0 155 20 137 0 100 0 1 157 1 105 137 0 0 128 0 155 20 137 0 100 255 255 157 254 152 137 0 0 128 0

今までシリアル通信と Realterm を用いて iRobot Create の動作をテスト・理解してきましたが、iRobot Create をプログラムから制御できればもっと楽しくないでしょうか?次回からはその方法についてみていきましょう。

[ English version is here ]

過去2回のエントリーで iRobot Create + Sun SPOT デモの概要について書きました。ここからは iRobot Create の内部について詳しくみていきましょう。

iRobot Create を制御するためには "iRobot Create Open Interface (OI)" と呼ばれる API を使用します。iRobot Create は 7 pin MINI-DIN コネクターと DB-25 コネクターの2つの(電子的な)インタフェースをもっており、そのどちらを使用しても OI コマンドを送信することができます。iRobot Create + Sun SPOT デモでは iRobot Create を制御するために 7 pin MINI-DIN を利用しています。ここではいくつかの基本的な OI コマンドを組み込みのシリアル通信機能を使用して試してみましょう。

実際に以下のコマンドを確認したい場合は、シリアル端末をコンピューター上にインストールする必要があります(もしまだの場合は "Realterm" を iRobot Create site からダウンロード可能です。Realterm は iRobot 社が公式に推奨するシリアル端末です)。

iRobot Create のキットには 7 pin MINI-DIN 用のシリアルケーブルとドライバーが付属しています。Realterm(もしくは他の端末)を使用するためには、iRobot へ接続するためのシリアルの COM port 番号を控えておく必要があります(Windows ではデバイスマネージャ→ポートで確認することができます)。


iRobot と PC を接続した後、Realterm を起動し "Port" タブをクリックしてください。ここでは Baud = 57600 (iRobot Create のデフォルトのシリアル速度です)と先ほどチェックしたポート番号を設定してください。そして "Change" ボタンをクリックしてください(クリックするまで設定が反映されません)。接続がきちんとできているかどうかは iRobot の電源をいれたときに Realterm 上に以下のような起動メッセージがでているかどうかで確認することができます。もしメッセージが確認できない場合はポート番号がきちんと設定されているかどうか確認してください。

 各 Open Interface コマンドは非常にシンプルです。フォーマットは1バイトの「オペコード」にそのオペコードに応じた0バイト以上のデータバイトがつづいたものになります。例えば、iRobot Create の Play LED(">" ボタンのとなりの LED です)を光らせるためには、以下のコマンドを送信します。

128 132 139 2 0 0

各データの意味は↓です。

  • 128 (Opcode) = OI 開始
  • 132 (Opcode) = OI を Full mode へ
  • 139 (Opcode) = LED 制御
  • 2 0 0 (Opcode 139's data bytes) = 1バイト目:LED の場所 ("2" = Play LED, "8" = Advance LED (near ">>|" button) or "10" = both of them)。2バイト目:LED color (0 = green, 255 = red)。3バイト目:LED 強度。

実際にこのコマンドを送るためには、"Send" タブを選択し "128 132 139 2 0 0" を左上のフィールドに入力した後、"Send Numbers" ボタンを押します。iRobot Create の電源を入れた後、Power LED が光り Advanced LED が点滅します。このコマンドを送った後 Play LED だけが光るようになれば、最初の OI コマンドは成功です!