Windows 10 IoT CoreをはじめとするUWPアプリでBLEデバイスを扱う

先ずは、IoT Kitハンズオントレーニング のデバイス側で、Windows 10 IoT CoreのUWPアプリ(Windows 10 PCでも実施可能)とTexas InstrumentsのSensor Tag(CC2541、CC2650)の組合せを追加したことをお知らせします。https://github.com/ms-iotkithol-jp/IoTKitHoLV3 のWinIoTCoreTIIoTHubAppフォルダーに入っているソリューション一式がそれです。TI Sensor TagをデバイスやPCとペアリングすれば、あとは、WpfEmuIoTHubAppと同じ要領で自学自習可能ですので、TI Sensor Tag持っている人は是非試してみてください。一般のPC、Raspberry Pi3やDragonBoardなどBLE対応のデバイスであれば特にBLEのドングルなどなくても実習可能です。 さて本題です。このアプリを作っている過程で、BLEデバイスにアクセスするためのWindows Runtime APIの使い方でてこずりました。ライブラリー群は、非同期メソッドなので、await 句を付けてコールすれば通常は問題なく使えるのですが、HandsOn.csファイルの中で、普通のやり方をやっても実行がブロックされて戻ってきません。では、Taskのまま受けて、Wait()で待って、結果をResultで受け取って…を試してみたら、デバッガーで一行一行ステップバイステップで動かすと、一応動くのですが、一気通貫で実行しようとすると、Wait()から帰ってこない!最悪のパターンだ…どうしよう、ってな状況になってしまいました。しかしなぁ…サンプルでは動いてるしなぁ…何が違うの? と考えて動くものと動かないものを比較した結果、解が得られました。どうやら、UWPアプリとして作ったプロジェクトの中ではawaitやWait()がうまく動かないらしく、UWPアプリプロジェクトを作った時に出来上がるソリューションに、別途UWPクラスライブラリプロジェクトを作って追加、そのクラスライブラリ上にBLEデバイスにアクセスするFindAllAsyncやらなんやらをコールするコードを置くとうまく動くんですな。Gitに挙げているサンプルもそういう作りになっています。 ってことで、await機能しないじゃん、なにこれ?…と首をかしげてる皆さん、この方法試してみてください。 ではでは

0

Starter Pack for Windows 10 IoT Core on Raspberry Pi 2のセンサーとかを使うライブラリってどこよ

MAKERSのみんなは、もう、持っているよね。Starter Pack for Windows 10 IoT Core on Raspberry Pi2‼ でも、このキットに入っている、BME280やTCS34725 、MCP3008 、昔懐かしいCDSの光センサーとか、半固定抵抗とかどないして使えばええねん‼ って思っている人たちもいるんじゃないかな⁈ ってことで、ここで紹介しておきますね。https://www.hackster.io/ のサイトを探すと大概あります。世界中のMAKERSが投稿してくれているんです。 BME280 つなぎ方は https://www.hackster.io/windows-iot/weather-station-v-2-0-8abe16?ref=search&ref_id=bme280&offset=2 ライブラリは、https://github.com/ms-iot/adafruitsample/tree/master/Lesson_203V2/FullSolution このセンサーは、環境情報の基本中の基本の温度、湿度、大気圧を測れるんだよね。人の快・不快とか心の浮つき加減とか、影響するらしいから、Azure Cognitive ServiceのEmotion APIとかと組み合わせると面白いかもよ TCS34725 いわゆる色センサーね。センサー付近の色をRGBで教えてくれる。 つなぎ方は、https://www.hackster.io/windows-iot/what-color-is-it-578fdb?ref=search&ref_id=TCS34725&offset=2 ライブラリは、https://github.com/ms-iot/adafruitsample/tree/master/Lesson_205/FullSolution MCP3008 お次は、Analog Digital Converterだっ。ラズパイにはアナログをデジタルに変えるチップがついてないんだよね。そのままだと、CDSの光センサーや半固定抵抗の抵抗値とかが取り込めないよ。これらってアナログだからね。このチップを使うと、アナログの連続値をデジタルに変換して読み込めるよ。 つなぎ方は、CDSの光センサー、半固定抵抗ひっくるめて、https://www.hackster.io/windows-iot/bright-or-not-v-2-0-30dec8 ライブラリはいろいろあるけど、https://github.com/porrey/mcp3008/tree/master/source/MCP3008%20Solution/Mcp3008 が一番いいかな。 BME280とかTCS34725とかはI2Cだけど、MCP3008はSPIでラズパイと通信するんだよ。SPIのサンプルにもなるね。 ってことで、軽いノリで紹介してみました。あ、そういやこれ、紹介したライブラリは、ラズパイだけでなく、ミノーボードやドラゴンボードでも使えるはず。 それと、Hackster はもちろん日本人も投稿オッケーなんで、腕に覚えのある人は是非、投稿してね

0

Windows 10 IoT Coreの時計合わせ

Windows 10 IoT CoreデバイスをAzure IoT Hubをはじめとする、SAS Tokenを使って接続するサービスにつなぐためには、ボード上の時間がある程度正確でなければなりません。時間が非常にずれていると、SAS Token Expiredとなり認証エラーになってしまいます。 そんな風なExceptionが発生している場合、以下の手順で時計合わせを行ってください。 先ず、Windows 10 IoT Core Dashboardを起動し、時計合わせをしたいデバイスのIPアドレスを確認します。以降、”<IoTC IP Address>”と記載します。※もちろん実際には、4つの0~255からなる、xxx.xxx.xxx.xxxの形式です。 次にPCの左下の”WebとWindowsを検索”に、”PowerShell”と入力し、検索表示された”Windows PowerShell”を右クリックし、”管理者として実行”を選択し、PowerShellを起動します。 起動して、 PS C:\WINDOWS\System32> と表示されたら、以下のコマンドを順に入力していきます。 > net start WinRM > Set-Item WSMan:\localhost\Client\TrustedHosts -Value <IoTC IP Address> > Enter-PSSession -ComputerName <IoTC IP Address> -Credential <IoTC IP Address>\Administrator ここで、パスワードを聞いてきます。変更していなければ、p@ssw0rd です。接続するのにしばらくかかります。接続が成功したら、先頭が[<IoTC IP Address>]: PS で始まる文字列に代わります。この状態になると、Windows 10 IoT Coreボードをリモート操作可能になります。 この状態で、 > set-date…

0

Windows 10 IoT Core開発セットアップ方法

いまさらな感じもしますが、2016年1月28日時点でのWindows 10 IoT Coreのインストール方法と開発環境のセットアップ方法を解説します。 ※もしあなたがだいぶたってからこの投稿を読んでいる場合は、情報が古くなっている可能性があるので、他に新しい解説がないか確認してくださいね。※この投稿は、http://dev.windows.com/ja-jp/iot を元に記載しています。そちらにも目を通すことをお勧めします。  Windows 10 IoT Coreで制御アプリを開発するには、以下の3つが必要です。  Windows 10 IoT Coreが動くハードウェア Windows 10 IoT CoreのOSイメージファイル アプリケーション開発環境用PC  Windows 10 IoT Coreが動くハードウェア 2016年1月28日現在、Windows 10 IoT Coreが動作するのは、以下の3種類のボードです。 Raspberry Pi2 MinnowBoard MAX DragonBoard 410c  それぞれ特色があるので、各自の目的にあったボードを選択してください。 Windows 10 IoT CoreのOSイメージファイル OSイメージファイルの取得、及び、インストールは、Windows 10 IoT Core Dashboardというアプリを使って行います。 http://ms-iot.github.io/content/en-US/GetStarted.htm の というボタンをクリックして、Setup.exeをダウンロード&インストールし、Windows 10 IoT Core Dashboardを起動します。PCにSDカードを挿入してから、  ”新しいデバイスのセットアップ”をクリックし、セットアップ用タブを表示させます。 PCにSDカードを挿入します。”デバイスの種類”で使用するボードを選択します。”ドライブ”に挿入したSDカードが表示されているか確認し、”ダウンロードとインストール”をクリックします。SDカードのクリアやEULAなどに”OK”してしばらくするとSDカードへのOSイメージのインストールが完了します。SDカードをボードに挿入し、ボードをネットワークケーブルでネットワークに接続し、電源をオン(電源コードをボードにつないで通電)します。このとき、SDカードへのインストール作業を行っているPCと同じネットワークにつながっている必要があります。Windows 10 IoT Core…

0

Windows 10 IoT Core for Raspberry Pi2 と周辺機器をシリアル通信(RS232c)でつなぐ

このポストでは、Windows 10 IoT Coreで動くRaspberry Pi2を、大昔からの定番、RS232cシリアル通信で周辺機器と接続する方法を解説します。 ※本ポストは、http://ms-iot.github.io/content/en-US/win10/samples/SerialSample.htm を元に書いています。※本ポストは、2015/10/30現在の情報を元に記載しています。OSの機能サポートの状況など、適宜確認してくださいね。 昔からPCや制御用コンピュータと周辺機器をつないで装置を開発していた皆さんなら全員ご存じのはずのRS232Cによるシリアル通信で、かつ、評価ボード系の周辺デバイスをリード線等でつなぐケースを解説します。 まずはつなぎ方です。 図の様に、 GND ‐ Pin 6 TX – Pin 8 RX – Pin 10 でつなぎます。TXは送信、RXは送信なので、接続先の周辺機器はつなぎ方が逆になります。この接続で、Windows 10 IoT Coreは、URT0というポートでシリアル接続されたと認識します。 ※この投稿を実際に試すには、10/30現在、http://ms-iot.github.io/content/en-US/Downloads.htm から公開中のInsider Previewのほうをダウンロードして作成したOSイメージを使ってくださいね プログラムの大まかな流れは、 シリアルポートを探す シリアルポートを開く データ送信・受信を行う です。アプリケーションは、Windowsのユニバーサルアプリ形式で開発してください。※GPIOやI2Cを使ったアプリを組むのに必要だった、IoT Extensionの参照追加は必要ありません。 シリアルポートを利用するには、Package.appxmanifestファイルにシリアルポート利用の宣言が必要です。プロジェクトが格納されているフォルダーを開き(ソリューションエクスプローラーで、ソリューション、もしくは、プロジェクトを右クリックして、”エクスプローラーでフォルダーを開く”を選択すれば開けます)、あらかじめ起動しておいたメモ帳にファイルエクスプローラーでPackage.appxmanifestを選択しドラッグ&ドロップし、<Capability>…</Capability>を以下の様に修正します。   <Capabilities>    <Capability Name=”internetClient” />    <DeviceCapability Name=”serialcommunication”>      <Device Id=”any”>        <Function Type=”name:serialPort” />      </Device>    </DeviceCapability>  </Capabilities> ※赤字の部分を追加 修正したら保存を忘れずに。 さてプログラムです。まず、シリアルポートを探すロジックですが、         List<DeviceInformation>…

0

IoT HubにWindows 10 IoT Coreでつなぐ

さてと… ※この投稿は、2015/10/22現在の公開情報を元に記載しています。最新の情報がないか確認してくださいね。 IoT Hubのプレビューが9/30に公開されました。タイミング的にちょっと遅い気もしますが、Raspberry Pi2で動作するWindows 10 IoT CoreデバイスをIoT Hubに接続する方法を説明します。とりあえず試す方法が、https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-csharp-csharp-getstarted/  に書かれています。この説明は、.NET Framework上でC#を使ったサンプルで、Windows 10 IoT Coreの場合はWindows RT上で動くUniversal Windows Applicationという違いがあって、そのままでは、動かすことができません。更に、プレビュー状態のため、説明通りにいかない部分もあるので、ここで解説しておきます。 ※IoT Hubにつなぐ部分、送受信する部分は、通常のWindows 10のUWAでも利用できます。 折角なので、加速度センサー(ADXL345)、温度センサー(BME280)を使ってIoT Hubに送ってみましょう。基本の部分は、https://doc.co/4dEWrJ を見てください。ハードウェアの構成は、このドキュメントに記載の これに加えて、LEDも追加します。   次に、センサーやLEDをI2CやGPIOで制御するために、IoT Extensionを参照に加えます。 そして、https://doc.co/4dEWrJ に記載に従って、MainPage.xaml.csのProgramクラスにdeviceId(Guid値)と、プロジェクトにSensorクラスを追加してください。 次は、IoT Hubへのアクセス用ライブラリの追加です。本来ならNuGetを使ってインストールできるのですが、本投稿を書いている時点でははうまくいかないので、 ※現在既にNuGetでの組込みが可能になっています。ソリューションエクスプローラーで、プロジェクトの参照を右クリックし、”Nuget”を選択して、Azure Devices Clientで検索を行い、Microsoft.Azure.Devices.Client.PCLを選択してインストールを行ってください。 ブラウザで、 https://github.com/Azure/azure-iot-sdks/ を開き、表示されたページの右横にある、”Download ZIP”をクリックし、どこかにZIPファイルを保存、ZIPファイルのプロパティでブロックを外し(必ずやってくだいね)、適当な場所に保存します。 csharp/Microsoft.Azure.Devices.Client.WinRTに入っているMicrosoft.Azure.Devices.Client.WinRT.csprojをプロジェクトに参照追加します。 ソリューションエクスプローラーで、ソリューションを右クリックし、”追加”→”既存のプロジェクト”を選択し、Microsoft.Azure.Devices.Client.WinRT.csproj を選択し、ソリューションに追加してください。 次に、追加したSDKのプロジェクトを、作成中のプロジェクト参照として追加します。これで、NuGetで組み込んだのと同じ状態になります。 これで、IoT Hubにアクセスする準備は完了です。 後は、Modelsという名前でフォルダーをプロジェクトに作成し、そのフォルダーにSensorReadingという名前でクラスを作成し、 と、コーディングしてください。このクラスを使ってセンサー計測値をJSONに変換します。 さて、MainPage.xaml.csのnamespaceの中身を以下の様に編集します。 コードの中で、deviceId、iotHubUri、deviceKeyという変数がありますが、まずはGuid生成ツールで新規にGuidを作成して設定し、 https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-csharp-csharp-getstarted/ に記載のCreateDeviceEntryアプリでDevice Keyを作成して、deviceKeyの値とし、作成したIoT HubのURLにあわせてiotHubUri変数を編集すれば動きます。チュートリアルと上のコードを見比べてみてください。IoT Hubとの送受信の部分は基本同一です。 1秒ごとにセンサー計測値を貯めて、2分ごとにIoT Hubに貯めたデータを一括送信します。チュートリアルのReadDeviceToCloudMessagesを起動しておくと送信したデータを確認できます。また、…

0

Windows 10 IoT Core+WebCam+Azureで簡単定点観測カメラ

Windows 10 IoT Core on Raspberry PI2のWebCam接続が確認できたので、一筆。 PCとUSBで接続可能なWebCamがあれば、定期的に画像を記録する仕掛けは簡単にできますね。しかしそのためにずっとPCを一台動かしているのはなんだか無駄。じゃあRaspberry PI2使おう…しかし、ずっと画像を蓄積続けるためにはストレージが足りないね…ということで、Microsoft AzureのBlob ストレージに貯めよう。そうすればセキュアに遠隔から画像も取り出せるし… ということで、やり方をざっくり紹介。 まず、Visual Studio 2015で、新規プロジェクトを作成します。テンプレートは、Visual C#→Windows→ユニバーサル→空白のアプリを使います。プロジェクトができたら、MainPage.xamlの<Grid>…</Grid>を のように、CanvasとCaptureElementタグを追加します。WebCamの画像はいったんこのCaptureElementに割り付けます。 次に、AzureのBlobにアクセスするために、Azure Storage SDKをインストールします。ソリューションエクスプローラーで参照を右クリックして、NuGetパッケージの管理を選択、Azure Storage SDKと検索窓に入力し、表示されたらインストールしてください。 そして、MainPage.xaml.csを開き、 と、MainPageクラスの内容を書き換えます。名前空間が一部足りないのでusing宣言を適宜加えてください。storageAccountNameとstorageAccountKeyは、AzureのポータルでStorageを作成して取得してください。 あとは、Package.appxmanifestをコードで開くで開き(もしソリューションエクスプローラーで開けなければ、メモ帳などで開いてください。)、以下のように<Capability>タグに使用する機能を追加宣言します。 これでOK.すべて完了。15分ごとにAzureのBlobストレージにアップロードします。センサーで計測しながら画像を蓄積しておけば、センサーがある値を記録した時に何が起こっていたかを記録することができるわけです。ちなみにこのコード、ユニバーサルアプリで作っているので、Windows10 の普通のPCでも動きます。WebCam持っている人ぜひお試しを。 ※WebCamの中にはWin10IoTCore Raspberry Pi2に対応していない機種もあるのでご注意。 なおこの投稿の詳細な手順は、今後、https://aka.ms/IoTKitHoL にて公開しますんで、ご期待ください。    

0

Windows 10 IoT Core for Raspberry PI2でAzure Event Hubに接続する

こちらは、2015年8月14日現在の状況をもとに書いています。 Windows Runtime API上のアプリでAzure Event Hubに接続する場合、3つの方法があります。 Windows Azure Service Bus SDKを使う AMQL Liteを使う HTTPSでSASTokenを作成してヘッダーに埋め込むコードを書く Windows系なら1番目が一番簡単ですが、8/14現在、まだ対応するSDKが公開されていないので使えません。※ソリューションエクスプローラーで、参照フォルダーを右クリックし、NuGetパッケージの管理を選択し、”Windows Azure Service Bus SDK”を検索し、インストールしてみてください。インストールがうまくいったらこれ以上読む必要はありません。 2番目ですが、AMQP Liteは、Windows系だけでなく、.NET Micro Framework、Monoでも使えるので、マルチプラットフォームな組込み機器開発の場合でソースコードを共通化したい時などに便利です。こちらは現時点で使うことができます。使い方は、ソリューションエクスプローラーで、参照フォルダーを右クリックし、NuGetパッケージの管理を選択し、”AMQP Lite”で検索し、インストールボタンをクリックすれば、インストール完了です。https://aka.ms/IoTKitHoL から公開中のハンズオンコンテンツのStep1接続編に具体的なコードが紹介しているのでそちらも参照してほしいのですが、この投稿でも基本的な使い方を紹介しておきます。 まず、Event Hubへの接続ですが、  conststring sensorName = “win10iotrpi2”;conststring ehName = “[event hub name]”;conststring accessKey = “[Access Key]”;conststring ehNamespace = “Service Bus Namespace]”;conststring policyName = “[Access Policy Name]”;conststring partitionId = “2”;string amqpAddress =…

1

PinKitセンサーボードの加速度センサーをラズパイにつなぐ

あ、そういえば、PinKitのセンサーボードにADXL345が載ってるね…ってこで、Windows 10 IoT Core For Raspberry PI2で、PinKitセンサーボードの加速度センサーを使う方法を紹介します。 ADXL345のピンは、PinKitセンサーボードのピンに D15 → SCL D14 → SDA VDD → VDD GND → VDD の様に対応しているので、Raspberry PI2のピンに図の様につなげばよい。 ちょっと余計なものが写っているのだが、ブレッドボードを使って、 こんな風につなげばよい。 後は、http://ms-iot.github.io/content/en-US/win10/samples/I2CAccelerometer.htm のサンプルのACCEL_I2C_ADDRの値を、0x1dにセットすれば、加速度読み取れます。 PinKitとRaspberry PI2の両方を持っている人は試してみてくださいね。以上、ひつまぶし、あ、暑さのために間違いました、ひまつぶしのTips投稿でした。

0

Node.jsでWindows 10 IoT Coreのセンサーを使う

いやぁ…私がこのブログでJavaScriptとかNode.jsの事を書く時代が来るとはね… Raspberry PI2で動く、Windows 10 IoT Coreでは、C#、VB、VC++に加えて、Node.js、PythonでUniversal Windows Applicationの開発が可能です。 Node.jsを使うには、http://ms-iot.github.io/content/en-US/win10/samples/NodejsWU.htm で紹介されているように、Visual Studio 2015 RC に IoT Core用のMSIツールをインストール後、追加で、NTVS(Node.js Tools for Visual Studio)Bundle VS2015を更にインストール。このツールを使うと、Node.js用のプロジェクトテンプレートが出現します。 プロジェクトの作成は、 と、プロジェクトテンプレートで、カテゴリを”JavaScript”→”Node.js”を選択して表示されたテンプレートの”(Windows Universal)”と名前の後ろについているテンプレートを使います。 npmを使うには、ソリューションエクスプローラーで、プロジェクト直下のnpmアイコンを右クリックして、”Install New npm Packages… を選択すれば、所望のパッケージをインストール可能です。 更に、実機(例えば、Raspberry PI2)で動かすには、ソリューションエクスプローラーでプロジェクトを右クリックし、”プロパティ”を選択し、表示されたページの、”Remote Machine”の項目にWindows IoT CoreデバイスのIPアドレスを入力すればOK。 では、センサーのデータを取得するJavaScriptコードをお見せしましょう。センサーは、加速度センサーのADXL345を使います。http://ms-iot.github.io/content/en-US/win10/samples/I2CAccelerometer.htm や、私の以前のポストを参照して、配線してください。 おっと、元々私は、JavaScriptやNode.jsはまるっきり素人なので、どれぐらい素人かというと、Node.jsがサーバーサイド向けのライブラリだと知ったのがこれを書いているつい最近(でもNode.jsと知らないうちから使ってはいましたが)知ったというぐらい、素人です。だから、「普通JavaScriptだったら、そんな風に書かねぇよ」とかいう方がいたら、「この方が楽よ」と、コメント頂ければ幸い。 現状のサンプルには、Node.jsでI2Cセンサーを使うサンプルは公開されていないのと、ま、私がジャバスク素人で普段はC#使いでもあるので、ロゼッタストーン的にC#と並べて、紹介することにします。早速ロゼッタストーンです。 C# JavaScript Node.js string aqs = I2cDevice.GetDeviceSelector(“I2C1”); var dis = await DeviceInformation.FindAllAsync(aqs); var settings = new I2cConnectionSettings(0x53);I2CAccel…

0