第4回 Windows IoTで温度などのアナログデータを計測するWindows 10 IoT Coreで始めるIoT入門(2/2 ページ)

» 2015年11月25日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
前のページへ 1|2       

I2CをWindows IoTプログラムから利用する

 準備ができたら、次はI2Cを利用するプログラムを作成する。といっても、ゼロから作るのは大変なので、例によってWindows IoTのサンプルサイトから元となるプログラムを入手して、それをベースに開発を進める。以下のページが参考になるだろう。

 今回作成したサンプルプログラムは次の通りである。これを開いて、以下の解説を参照していただきたい。

 実行すると次のように、センサーが検出した温度が1秒ごとに表示される。

サンプルの実行例 サンプルの実行例
1秒ごとに温度情報が表示され、更新される。

 プログラムの内容は、I2Cのサンプルプログラムをほとんどのそのまま利用しているだけであり、特に面倒なところはないだろう。InitI2CTemp() ルーチンの最初でI2Cバス関連の初期化をした後、データを取得するタイマールーチンを起動している。

 それぞれのI2Cデバイスは7bitのアドレスを持っていると前述したが、実際にどのアドレスが割り当てられているかはデバイスによって異なるので、システムに接続する前に必ず確認して、衝突しないように設定しておくこと。ADT7410の場合は0x48/0x49/0x4A/0x4Bのいずれかに設定可能だが(この情報はデータシートに書かれている)、今回使用したボードだと、デフォルトでは0x48を利用するようになっている。複数のボードを同じI2Cバス上に接続して使うなら、衝突しないように変更する。

changeaddr01 I2Cデバイスのアドレスの変更例
ボードに付属のデータシートより引用。今回使用したボードでは、アドレスを変更するにははんだ付け作業が必要である。

 ADT7410はデフォルトでは13bitの精度となっているので、初期化ルーチンの中でConfigurationレジスターに0x80を書き込んで16bitモードに変更している。

 1秒ごとに実行されるタイマールーチンでは、次のようなコードでI2Cデバイスからデータを取得している。

byte[] RegAddrBuf = new byte[] { TEMPIC_ADT7410_REG_MSB };
byte[] ReadBuf    = new byte[2];  /* 2 byte value */
TEMPIC_ADT7410.WriteRead(RegAddrBuf, ReadBuf);


 1行目はI2Cデバイスに送信するコマンド列、2行目はデータを受け取るためのバッファーの指定である。WriteRead(RegAddrBuf, ReadBuf) でコマンドを書き込むと、それに対応するデータがI2Cデバイスからバッファーに書き込まれるので、それを表示すればよい。送信するコマンドや受け取るデータの形式は当然チップごとに異なるので、データシートやインターネット検索などで確認すること。

 ADT7410の場合、受け取ったデータは2byte(16bit)で次のような構成になっているので、これ全体を16bitの整数(2の補数表現)として解釈し、最後に128.0で割れば摂氏で表現した温度表現になる。最上位bitは符号であり、温度が0か正なら0、マイナス(零下)なら1になるので、それを考慮して適宜変換する。

ADT7410の温度データの変換 ADT7410の温度データの変換
温度センサーからは全16bitのデータが得られるので(16bitモードに設定している場合)、これを2の補数(整数)と見なして解釈し、128.0で割れば摂氏温度になる。データの処理方法もデータシートを参照のこと。

 バス上に複数のI2Cデバイスがある場合でも処理方法はほぼ同じであり、初期化ルーチン中の「var settings = new I2cConnectionSettings(TEMPIC_ADT7410_I2C_ADDR); 〜〜」から先の行の内容をコピーして、同様にI2Cデバイスを初期化していけばよい。特に難しいことはないだろう。

 以上でI2Cデバイスの利用例の紹介を終わる。これ以外にもWindows IoTではさまざまなデバイスや機能が利用できるが、それらをいちいち全て取り上げるわけにもいかないので、後はWindows IoTのサンプルプログラムサイトなどを参照していただきたい。

 Windows IoTやその開発環境、およびAzure IoTはまだまだ開発途中で、頻繁に更新されており、何ができるかを知るには、結局のところサンプルプログラムを動かして体験してみるしかない。

Column「Windows IoTはリアルタイム処理が苦手?」

 今回はI2C対応の温度センサーを接続する例を紹介した。これだけでは寂しいので、予定ではさらにサーボモーター(ラジコンの制御などによく使われるデバイス)を接続してPCをリモートから制御する装置を作ろうと考えていたが、Windows IoTのサンプルサイトに登録されているサーボモーターの制御プログラムがうまく動作せず、断念した。参考にしたサンプルプログラムは以下のものである。

 これをビルドしてRaspberry Pi 2 Model Bに接続したサーボモーターを駆動させたが、どうしてもサーボが静止せず、常にプルプル/ジーコジーコと細かく動き続ける、実に落ち着きのない挙動を示した。

 サーボのアーム(ホーン)を例えばセンター位置で静止させるためには、幅1500マイクロ秒(1.5ミリ秒)、周期20ミリ秒程度のPWM(パルス幅変調。「モータ制御に欠かせない技術“PWM”って何?」参照)の矩形波をサーボに与え続ける必要がある。だが上のサンプルプログラムではパルス幅をソフトウエアのループなどで制御・実現しており、パルスの幅が安定していない。オシロスコープで波形をチェックしたところ、常に数十マイクロ秒程度(パルス幅の数%に相当)の変動があり、このせいでサーボが常にふらふらと動き続けているようである。これでは安心して使えないし、消費電力やサーボの摩耗なども心配である。I2C接続のモータードライバー基板などを購入するという方法もあるのだが、それだと誰でも利用するというわけにはいかない。

 Raspberry Piはハードウエア的なPWM機能を持っており、それを使えばサーボもきちんと制御できるのだが、現在のWindows 10 IoT Coreではサポートされていないようである。IoTのライブラリなどは常時更新されているので、今後の改訂に期待したい。


Arduinoとの連携

 最後に、別のボードコンピューターシステム「Arduino」とWindows IoTとの連携機能について少し触れておく。Arduinoとは、IoTや電子工作などでRaspberry Piと並んでよく使われている小型ボードコンピューターの1つだ。

 現在Windowsストアに以下のようなアプリが登録され、利用できるようになっている。これらは、Windows IoT Core(上のアプリ)とArduinoを連携させるためのツールである。うまく使えば、Windows IoT Coreだけではできないようなアプリを実現できる可能性がある。

Windows Remote Arduino

 これは、Arduinoに接続したさまざまなセンサーやデバイスなどを、Windows 10のユニバーサルWindowsアプリから利用するための機能である。

 Arduinoに「Firmata」というプログラム(ライブラリ。ホストとはFirmataプロトコルで通信する)を入れておくと、外部からArduinoのGPIOポートやそこに接続した各種のデバイスを制御できるようになる。これによりFirmataのホスト側(利用する側)では、デバイスの細かい仕様や制御などに煩わされることなく、Arduinoとそこに接続されたデバイスを利用できるようになる。ArduinoとWindowsシステムはUSBやシリアル、ネットワーク、Bluetoothなどで接続できる。Windows IoTが不得意な低レベルなデバイス制御は、Arduinoに任せてもいいかもしれない。

Windows Remote ArduinoでArduinoを利用する Windows Remote ArduinoでArduinoを利用する
「Windows Remote Arduino」を使うと、Arduinoに接続されているデバイスをユニバーサルWindowsアプリから利用できるようになる。

 FirmataはWindows専用ではなく、ProcessingやPython、Perl、Java、Ruby、……、など、さまざまな処理系から呼び出せるように作られている。Windows Remote Arduinoを使えば、WindowsのユニバーサルWindowsアプリからもFirmataのライブラリを呼び出して、Arduino経由でハードウエアの制御が可能になる。

 「Windows Remote Arduino Experience」の機能を使うには、Windowsストアアプリを作成するときにVisual Studioにこれらの機能をロードする(「参照を追加」する)必要がある。具体的な手順については以下のページを参照のこと。

 なお、Windowsストアに登録されている「Windows Remote Arduino Experience」というアプリは、Windows Remote Arduinoの機能をテストするためのツールである。これを使ってFirmataがインストールされているArduinoに接続すると、そのGPIOポートやアナログポート、PWMポートなどを操作(データの送信など)できる。

Windows Remote Arduino ExperienceによるArduinoの制御 Windows Remote Arduino ExperienceによるArduinoの制御
Windows Remote Arduino Experienceは、Windows Remote Arduinoの機能を確認するためのWindowsストアアプリである。FirmataをインストールしたArduinoに接続して、データを入出力させて、その動作を確認できる。Windows IoTは多数のタスクが動いているため、例えばシビアなタイミング制御などは難しいがArduinoは得意だ。
  (1)GPIOピンをデジタル/アナログ/PWDモードに設定して動作チェックする。
  (2)これはピン6をPWMモードに設定して、PWMのパルスを出力させているところ。

Windows Virtual Shields for Arduino

 これは上のWindows Remote Arduinoとは逆に、Arduinoのプログラム(スケッチという)から、Windows Virtual Shields for ArduinoをインストールしたWindows 10やWindows Phoneシステム内蔵のデバイス(キーボードやタッチ画面、カメラ、姿勢センサー、Cortanaなど)を利用するための機能である。Arduinoでは拡張機能/ボードのことをシールドというが、Windows 10システムがArduino上で動作するプログラムのユーザーインターフェース用のシールドとなる。

 詳細は以下のページを参照のこと。


 全4回でWindows 10 IoT Coreについて、その導入方法や簡単なサンプルプログラムを実行させる方法を紹介してきた。

 スイッチをオン/オフしたり、センサーやデバイスを制御したりといったローレベルな制御なら、すでにArduinoやRaspberry Pi(とRaspbian OS)などがあるので、特にWindowsである必要はないだろう(しかもいちいちWindows IoT向けに書き換えないといけないので面倒)。

 だがGUIやWindows環境との相互運用性、Azureとの連携などを重視していたり、Windowsでの開発に慣れていたりする開発者ならば、Windows IoTは向いているかもしれない。これらの分野における、より進んだWindows IoTの活用方法については、いずれまた、機会を改めて紹介したい。

「Windows 10 IoT Coreで始めるIoT入門」のインデックス

Windows 10 IoT Coreで始めるIoT入門

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。