第4回 Windows IoTで温度などのアナログデータを計測する:Windows 10 IoT Coreで始めるIoT入門(2/2 ページ)
今回はセンサー出力をアナログデータとして取り込む例を紹介。ただしRaspberry Pi 2 Model BにはA/D変換機能がないので、I2C対応の温度センサーを使用する。
I2CをWindows IoTプログラムから利用する
準備ができたら、次はI2Cを利用するプログラムを作成する。といっても、ゼロから作るのは大変なので、例によってWindows IoTのサンプルサイトから元となるプログラムを入手して、それをベースに開発を進める。以下のページが参考になるだろう。
- I2C Accelerometer Sample[英語](Windows IoTサンプルサイト)
- I2Cの温度センサーをWindows 10 IoT Core for Raspberry PI2で使う(デバイスとITの架け橋)(MSDNブログサイト)
今回作成したサンプルプログラムは次の通りである。これを開いて、以下の解説を参照していただきたい。
実行すると次のように、センサーが検出した温度が1秒ごとに表示される。
プログラムの内容は、I2Cのサンプルプログラムをほとんどのそのまま利用しているだけであり、特に面倒なところはないだろう。InitI2CTemp() ルーチンの最初でI2Cバス関連の初期化をした後、データを取得するタイマールーチンを起動している。
それぞれのI2Cデバイスは7bitのアドレスを持っていると前述したが、実際にどのアドレスが割り当てられているかはデバイスによって異なるので、システムに接続する前に必ず確認して、衝突しないように設定しておくこと。ADT7410の場合は0x48/0x49/0x4A/0x4Bのいずれかに設定可能だが(この情報はデータシートに書かれている)、今回使用したボードだと、デフォルトでは0x48を利用するようになっている。複数のボードを同じ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の温度データの変換
温度センサーからは全16bitのデータが得られるので(16bitモードに設定している場合)、これを2の補数(整数)と見なして解釈し、128.0で割れば摂氏温度になる。データの処理方法もデータシートを参照のこと。
バス上に複数のI2Cデバイスがある場合でも処理方法はほぼ同じであり、初期化ルーチン中の「var settings = new I2cConnectionSettings(TEMPIC_ADT7410_I2C_ADDR); 〜〜」から先の行の内容をコピーして、同様にI2Cデバイスを初期化していけばよい。特に難しいことはないだろう。
以上でI2Cデバイスの利用例の紹介を終わる。これ以外にもWindows IoTではさまざまなデバイスや機能が利用できるが、それらをいちいち全て取り上げるわけにもいかないので、後はWindows IoTのサンプルプログラムサイトなどを参照していただきたい。
- Docs and Samples[英語](Windows IoTサイト)
Windows IoTやその開発環境、およびAzure IoTはまだまだ開発途中で、頻繁に更新されており、何ができるかを知るには、結局のところサンプルプログラムを動かして体験してみるしかない。
Column「Windows IoTはリアルタイム処理が苦手?」
今回はI2C対応の温度センサーを接続する例を紹介した。これだけでは寂しいので、予定ではさらにサーボモーター(ラジコンの制御などによく使われるデバイス)を接続してPCをリモートから制御する装置を作ろうと考えていたが、Windows IoTのサンプルサイトに登録されているサーボモーターの制御プログラムがうまく動作せず、断念した。参考にしたサンプルプログラムは以下のものである。
- ServoMotorBasics(GitHub ms-iot/samples)(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 Experience(Windowsストア)
- Windows Virtual Shields for Arduino(Windowsストア)
Windows Remote Arduino
これは、Arduinoに接続したさまざまなセンサーやデバイスなどを、Windows 10のユニバーサルWindowsアプリから利用するための機能である。
Arduinoに「Firmata」というプログラム(ライブラリ。ホストとはFirmataプロトコルで通信する)を入れておくと、外部からArduinoのGPIOポートやそこに接続した各種のデバイスを制御できるようになる。これによりFirmataのホスト側(利用する側)では、デバイスの細かい仕様や制御などに煩わされることなく、Arduinoとそこに接続されたデバイスを利用できるようになる。ArduinoとWindowsシステムはUSBやシリアル、ネットワーク、Bluetoothなどで接続できる。Windows IoTが不得意な低レベルなデバイス制御は、Arduinoに任せてもいいかもしれない。
- Firmata Protocol Reference[英語](arduino.cc)
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は、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の活用方法については、いずれまた、機会を改めて紹介したい。
Copyright© Digital Advantage Corp. All Rights Reserved.