センサー側の用意
.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管理ポータルで送信されてきたデータが表示できます。








