センサー側の用意
.NET Micro Frameworkの最新版は4.3です。今回はこの.NET Micro Framework 4.3を使います。
.NET Gadgeteer
FEZ Spiderの特徴は.NET Micro Frameworkが動作するという点以外にも、.NET Gadgeteerにも対応しているという点があります。.NET Gadgeteerがどのようなものか実際に作成していましょう。
新規プロジェクト作成で[Gadgeteer]-[.NET Gadgeteer Application]テンプレートを選択します。
このテンプレートで作成するプロジェクトは、.NET Micro Framework上で動くアプリのプロジェクトになりますが、さらに、実際に使用するメインボードを選択することで、さまざまな恩恵にあずかれます。今回使用するのはFEZ Spiderなのでプロジェクト作成時に表示されるウィザードでもFEZ Spiderを選択しましょう。
.NET Gadgeteer対応のボードであれば、それは.NET Micro Frameworkが動き、さらに.NET Gadgeteerにも登録されているボードということになります。別々の関係というよりも含有関係になるので単なる.NET Micro Framework対応のボードよりも,NET Gadgeteer対応のボードの方が何かと便利です。
.NET Gadgeteerデザイナ
.NET Gadgeteerのいいところは.NET GadgeteerデザイナによりVisual Studio上でメインボードや各種モジュール(メインボードと接続可能なセンサーなどの部品)との接続を設計できる点です。例えば今回のサンプルでは次のような接続を行います。
左上の赤いモジュールはUSBモジュールのUSB Client DPです。USBポートは電源供給やPCからアプリの転送、Visual Studioからのリモートデバッグなどにも使用できます。USB Client DPは1番ソケットに接続します。なお、PCからアプリ転送後は不揮発性メモリ上にアプリが配置されるのでPCからUSBを切り離して電源につなぎかえれば自動的にアプリがブートします。
メインボードの右横にあるのがLANモジュールのethernetJ11Dです。このモジュールは7番ソケットに接続します。今回は有線LANを使いましたが、LANモジュールの代わりにWiFiモジュールを使ってさらにUSB Client DPへの電源供給をモバイルバッテリーなどにすればコードレスセンサーが完成します。
ボードの左側にあるのが今回のセンサーである温湿度モジュールのtempHumidS170になります。これを4番ソケットに接続します。
実機の配線
.NET Gadgeteerのいいところはコード上の表現だけではありません。デザイナ上できれいに配置しておけば、大きさなどの比率もあっていますので、実際のメインボードとモジュールを配置して同じように配置と配線できます。
センサー値の取得
デザイナ上で配線と実際のモジュールの配線を同じにすることで、例えばtempHumidS170からセンサー値を取得したいときは、コード上で「4番ソケットから取得」ではなく「tempHumidS170から取得」のように記述が可能になります。
Private Sub MeasureTimer_Tick(timer As GT.Timer) Handles MeasureTimer.Tick Me.MeasureTimer.Stop() Dim th = tempHumidSI70.TakeMeasurement '(1) SyncLock (Me) Me.LastTemperature = th.Temperature '(2) Me.LastHumidity = th.RelativeHumidity '(3) End SyncLock Me.MeasureTimer.Start() End Sub
- (1)センサー値の取得
- (2)温度の取得
- (3)湿度の取得
センサー値をクラウド側に送信
Microsoft Azure Mobile Servicesとの間はREST/JSONでデータ送信を行います。そのままコードを書いて実装してもいいのですが.NET Micro Framework向けの便利なライブラリがGitHubにありますので、それを使って省力化します。
GitHubからzipファイルを取得したら解凍してEGIoTKit.Utilityをプロジェクトに追加して参照設定を行います。
準備が完了したらProgram.vbファイルにコードを記述します。まずはLANモジュールの回線をオープンします。
If (Not ethernetJ11D.NetworkInterface.Opened) Then '(1) ethernetJ11D.NetworkInterface.Open() '(2) End If
- (1)オープンされていないかを確認
- (2)オープンされていなかったらオープン
次にデータ送信する部分を作成します。
Mainboard.SetDebugLED(True) '(1) Try Dim request = CType(HttpWebRequest.Create(UrlString + "tables/Item"), HttpWebRequest) Dim json = New EGIoTKit.Utility.SimpleJSON() request.Headers.Add("X-ZUMO-APPLICATION", "pQLVzEcLxynxQpHscpTmYtCGbqojTr76") '(2) request.Accept = "application/json" request.ContentType = "application/json" request.Method = "POST" json.Add("id", "") '(3) json.Add("DeviceId", DeviceId.ToString()) '(3) SyncLock (Me) '(3) json.Add("Temperature", Me.LastTemperature) '(3) json.Add("Humidity", Me.LastHumidity) '(3) End SyncLock '(3) Dim JsonStringParams = json.GetResult '(4) Dim postDataBytes As Byte() = Encoding.UTF8.GetBytes(JsonStringParams) '(4) request.ContentLength = postDataBytes.Length '(4) Using reqStream = request.GetRequestStream() '(4) reqStream.Write(postDataBytes, 0, postDataBytes.Length) '(4) End Using '(4) Using res = CType(request.GetResponse, HttpWebResponse) '(5) If (res.StatusCode = HttpStatusCode.OK) Then '(6) Using reader = New StreamReader(res.GetResponseStream()) '(6) Dim message = reader.ReadToEnd() '(6) Debug.Print(message) End Using End If End Using Catch ex As Exception Debug.Print(ex.Message) End Try Mainboard.SetDebugLED(False) '(7)
- (1)メインボード上のLEDを点灯してデータ送信開始を合図
- (2)アプリケーションキーを設定
- (3)JSONデータを作成
- (4)JSONデータを本文として設定
- (5)POSTメソッドを実行
- (6)応答内容を取得
実行
PCとUSBで接続してVisual Studioで実行を開始すると、まず、メインボードへアプリを転送し、その後に実行が開始されます。その流れはイミディエイトウィンドウに表示されます。
クラウドまで正しくデータが届いていれば、Azure管理ポータルで送信されてきたデータが表示できます。