LEGO Mindstorms EV3 を Xamarin Studio でデバッグする

怒涛の EV3 シリーズの第3弾めです。

LEGO Mindstorms EV3 を C# で動かす | Moonmile Solutions Blog では、Visual Studio で作成した実行ファイルを WinSCP でアップロードしていたのですが、これが結構手間です。プログラムを修正するたびにいちいちアップロードをしないといけませんね。バッチ化してアップロードしてもよいのですが、Xamarin Studio を使うとビルド後にアップロード、かつ C# でデバッグ実行ができるので、これを紹介します。

ET ロボコンで MonoBrick が使われている

etroboEV3 / Wiki / MonoBrickWin
http://sourceforge.net/p/etroboev3/wiki/MonoBrickWin/#11-monobrick-ev3-firmware

参加するのはなかなか(財布的に)大変なのですが、個人的に使ってみる分にはタダです。このサイトの解説で十分ではあるのですが、メモ的に Bluetooth 接続部分と Xamarin Studio のアップロード部分を補足しておきましょう。

ETロボコンには、TOPPERS/EV3RT という uTronベースのリアルタイム OS も使われているので、こっちのほうも後で試してみます。EV3RT のほうは C++ で記述するようです。RTOS の勉強によいかと。

Windows 10 では USB ケーブル接続ができない

最初に注意しておきますが、Windows 10 では MonoBrick との USB ケーブル接続ができません。Windows 7/8 の場合は可能なのですが、10 の場合は、RNDIS/Ethernet Gadget が自動的に COM ポートに割り当てられてしまうらしく、etroboEV3 / Wiki / MonoBrickWin にあるようにネットワークアダプタに割り当てられませんでした。

EV3 Connection problem – USB and BT – Windows 10 – leJOS 海外でも問題になっているようです。

Bluetooth 接続する

そんな訳で、Bluetooth を使って接続をします。WiFi ドングルの場合は、IP が割り当てられますが、Bluetooth のほうはどうするのかというと、TCP/IP on Bluetooth というのを使って、同じように IP アドレスで接続ができます。EV3 側が「10.0.1.1」にして接続ができます。

Bluetooth ドングルを EV3 インテリジェントブロックに差し込んで MonoBrick を起動します。以前、もともとの EV3 と接続している場合にはペアリングをやり直します。

image

ペアリングをすると、パスコードが出るのでそのまま「はい」を押してください。パスコード自体が インテリジェントブロック側に出て来ないので不安といえば不安ですがw。

image

うまくペアリングができると接続状態になります。

ここでネットワーク接続を開いて、×印になっている Bluetooth ネットワークをダブルクリックします。

image

ペアリングができていると、EV3 が見えていると思うのでこれを選択して、「接続方法」→「アクセスポイント」を選択します。

image

すると、Blueooth のマークが暫く出て接続が完了します。この「アクセスポイントに接続する」作業は EV3 を起動するたびに行います。

ping を飛ばすと、きちんと応答を返すし、

image

Tera Tearm で SSH 接続して、ifconfig を見ると 10.0.1.1 が割り当てられていることが解ります。

image

ちなみに、PC 側は 10.0.1.10 で接続が可能です。

image

Mono runtime をインストールする

デバッグ実行するのに、Mono Runtime が必要です。Xamarin Studio だけを入れた状態では入っていないので、別途入れます。

Download | Mono
http://www.mono-project.com/download/#download-win

からダウンロードしてインストールすれば ok です。

Xamarin Studio にアドインを入れる

MonoBrick EV3 Firmware | MonoBrick.DK
http://www.monobrick.dk/software/ev3firmware/

から Xamarin Studio の Add-in をダウンロードします(もともと、MonoBrick とワンセットなんですね)。ファイル名は「addin.mpack」です。

Xamarin Studio を起動して、「Install from file」から、先の addin.mpack をしてします。

image

インストールができると「ツール」→「オプション」の「その他」の項目に MonoBrick が増えているのが解ります。

image

ここで、デバッグ先の EV3 の IP を指定(Bluetooth 接続なので 10.0.1.1)しておきます。

Xamarin Studio でプログラミングする

やっとこさ準備が整ったのでデバッグ実行してみます。Xamarin Studio を立ち上げて、新しいプロジェクトを作るときに、「その他」→「Miscellaneous」→「MonoBrick Project」を選択します。

F# でも作れるのですが、少しコツがいるので、また後で。

image

サンプルプロジェクトが作成されます。

image

Visual Studio で作ったときと同じように、コマンドラインのプロジェクトで、MonoBrickFirmware を読み込んでいるところです。

ダイアログ(EV3 の液晶ディスプレイ)にメッセージを表示させてモーターを3秒間だけ動かします。

(現状ではテンプレートに間違いがあるらしく、一か所だけ修正が必要です。InfoDialog クラスのコンストラクタにある ture を削除してください)

デバッグ実行をする前に「プロジェクト」→「有効なランタイム」で、「Mono 4.0.3 …」のほうを選択しておきます。

image

Microsoft .NET にしておくとビルドは通るのですが、デバッグ実行時に You must use the Mono runtime for debugging! のエラーがでます。もちろん、

image

有効なランタイムを Mono に変更してビルド、そしてデバッグ実行をすると、以下のようにアプリケーション出力がでて、EV3 インテリジェントブロックへアセンブリが自動アップロード、かつ実行されます。

image

インテリジェントブロックにダイアログが出るので、真ん中の OK ボタンを押します。すると、モーターが3秒だけ動いて、プログラムが終了します。

image

ブレークポイントは貼れないみたいですね。ダイアログを表示しているときに、一時停止ボタンを押すとスタックトレースが出るので、何らかのブレークはできそうです。

Debug.WriteLine をしても何処にも出ないので、いわゆるプリントデバッグは難しそうですね。インテリジェントブロックの液晶ディスプレイに出すか、別途 PC にログを飛ばす方式を考えたほうがよさそうです。

やっぱり F# で作ってみる

往年の F#er(ってほど使ってないけど)、としては F# プロジェクトを使ってみたいですよね。

そんな訳で C# と同じように組んでみます。

open System
open System.Threading
open MonoBrickFirmware
open MonoBrickFirmware.Display.Dialogs
open MonoBrickFirmware.Display
open MonoBrickFirmware.Movement

let main() = 
    Lcd.Clear()
    LcdConsole.WriteLine("Hello World!")
    Thread.Sleep(2000)
    Lcd.Clear()

    let dialog = InfoDialog("Attach a motor to port A in F#")
    let b = dialog.Show()
    let motor = Motor(MotorPort.OutA)
    motor.SetSpeed(sbyte(50))
    Thread.Sleep(3000)
    motor.Off()
    Lcd.Clear()
    Lcd.Update()

main()

F# の場合は、何故かビルド時に「有効なランタイム」を Mono にするとビルドができないので、

  • ビルド時には「Microsoft .NET」を選択する
  • 実行時には「Mono 4.0.3 …」を選択する

という妙なことをやります。

image

こんな風に無事 F# で動いていることが解ります。

Mono 4.0.3 を使ってビルドをするとこんな感じになります。

image

「指定された実行可能ファイルはこのOSプラットフォームに対して有効なアプリケーションではありません」と出るので、Mono 4.0.3 のランタイムと F# コンパイラのバージョンがずれていると思うんですけどね。これは後で調査しましょう。

Visual Studio では動かないのか?

アドインのコードは、monoev3/AddIn at release · Larsjep/monoev3 にあるので、SCP で送るだけなのでなんとかなるかなと。SshNet を使って SCP しているようなので、monoev3/AddIn/Source at master · Larsjep/monoev3 アドイン自体のコード量はそう多くないので、おいおいに。

カテゴリー: C#, EV3, Xamarin パーマリンク