Mindstorms NXT Swift Playground Book for iPad #tryswifthack

2017-03-02, 03, 04 と行われていた try! Swift Tokyo の最終日に行われたハッカソンで、一人チームを結成し (?)、Lego Mindstorms NXT を操作するプログラミングを Swift Playgrounds iPad を使って学習できる、Book を開発しました。

How it works

Mindstorms NXT Swift iPad Playgrounds from Atsushi Nagase on Vimeo.

以下の様な Swift コードから、上のデモムービーのような動きを実装します。

let nxt = NXT(name: "Hello NXT") // initialize robot

nxt.rotate(motor: .a, power: 100, angle: 145.0) // change angle of motor

// define sub routine
let sub = nxt.sub { nxt in
    nxt.forward(length: 100, turn: 0)
    nxt.wait(msec: 500)
    nxt.reverse(length: 100, turn: 0)
    nxt.wait(msec: 500)
}

// call sub routine
sub.call()

Mindstorms NXT

Mindstorms NXT は 2006年に発売された、一昔前の教育用ロボット作成キットです。

現行版の EV3 のように、iOS SDKコントローラーアプリ などは用意されていません。

そのため、以下の様なしくみで、プログラムを NXT に転送しています。

  1. Playgrounds で書いた Swift から NXC を書き出す
  2. 書き出した NXC のコードをローカルネットワーク上のウェブサーバーに POST する
  3. ウェブサーバーで受け取ったソースコードを nbc NXC コンパイラコマンドにコンパイルさせる
  4. USB で NXT にバイナリを転送し、実行する

以下のセットアップ方法を記載しますので、押し入れに眠っている NXT があったら、引っ張り出してきて、もう一度活躍させてあげてみてください。

NXC とは

NXC は Lego Mindstorms シリーズのために開発されたC言語ライク (Not eXactly C) なプログラミング言語です。

参照: NXCを使った LEGO NXT ロボットプログラミング (和訳)

Mindstorms NXT の標準プログラミングソフトウェアは、ブロックをつなぎ合わせて実行内容・条件を組み立てる、グラフィカルなものです。

今回、上記フローの通り、サーバーサイドでコマンドライン実行でコンパイルできるプログラムを扱う必要があったので、この NXC を採用しました。

環境セットアップ

NXC を使うためには、NXT 本体にカスタムファームウェアをインストールする必要があります。

Homebrew の定義ファイル (Formula) を用意したので、以下のコマンドを実行するだけで、準備が完了します。

brew tap ngs/formulae

brew cask install nxt-fantom-driver # USB ドライバ
brew install nexttool nbc # コマンドラインツール

# カスタムファームウェアを解凍してインストール
wget http://bricxcc.sourceforge.net/lms_arm_nbcnxc.zip 
unzip lms_arm_nbcnxc.zip
nexttool -firmware="lms_arm_nbcnxc/lms_arm_nbcnxc_132.rfw"

以上で下準備は完了です。Homebrew でインストールした nbc コマンドで NXC プログラムを実行してみましょう。

echo 'task main () { OnFwdSync(OUT_A, 100, 0); Wait(1000); }' > test.nxc
nbc -r test.nxc

出力ポート A に接続されているモーターが1秒間回転したと思います。

ウェブサーバーの起動

このコマンドを HTTP で受信して実行するサーバーを起動します。

サーバーサイドのアプリケーションも Swift で開発しました。

Tokyo Server Side Swift Meetup 主催の Takei さん (@noppoMan) 作の Go 言語ライクな システム+ネットワーキング/HTTP ライブラリ Prorsum を利用しました。

git clone git@github.com:ngs/mindstorms-nxt-playground-book.git
cd mindstorms-nxt-playground-book/Server
swift package generate-xcodeproj
open NXCBuild.xcodeproj

Xcode が開くので、NXCBuild ターゲットを上のスクリーンショットと同じように選択し、⌘+ R でサーバーアプリケーションを起動します。

プログラムを HTTP Body にして POST リクエストを送信します。

curl --data 'task main () { OnFwdSync(OUT_A, 100, 0); Wait(1000); }' \
    http://localhost:3000

先ほどとおなじように、一秒間モーターが回ったと思います。

Playgrounds Book を iPad に転送

Playgrounds Book は Air Drop か、iCloud Drive 経由の転送をサポートしています。

リポジトリ に含まれている NXT.playgroundbook を Air Drop で iPad に転送するか、iCloud Drive にある Playgrounds フォルダにコピーしてください。

iPad で Swift Playgrounds を開くと、NXT というブックが追加されていると思います。

以上でセットアップは完了です。

TODOs

今回のハッカソンは (遅刻したため) 時間が短かったので、モーターを動かす、サブルーチンを作成する、までしか実装できていません。

今後、以下のような、機能を追加して、より複雑な操作が行えるようにしたいと思います。

ハッカソン

各地からあつまった Swift 好きのエンジニアの方々が、Swift 縛りで開発を行う、というもので、どのチームの作品もとても魅力的でした。

次回も是非参加したいと思います。

Balto を運営されている Goodpatch 社さんからスポンサー賞: Baltoの Medium Plan - 1年間分をいただいきました、ありがとうございます。

balto(Goodpatch)賞
Mindstorms NXT Playground Book for iPad | Devposthttps://t.co/50KxmeHZ6X
#tryswiftconf #tryswifthack pic.twitter.com/FbGvQDpnoG

— にわタコ (@niwatako) March 4, 2017

Swift meets Mindstorms by .@ngs #tryswiftconf #tryswifthack pic.twitter.com/KZNbZG7iOk

— Yasuhiro Inami (@inamiy) March 4, 2017

発表資料