読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

いろんな方法でWindowsストアアプリとマイコンを接続してみた

f:id:garicchi:20140919150652j:plain

以前からWindowsRuntimeのデバイス関係の情報が少ないなと思ってたのでせっかくの夏休みを利用してWindowsRuntimeデバイス強化週間と勝手に決めていろいろ試してみました。

そもそも、一度ArduinoWindowsストアアプリでシリアル通信をしようとして、WPFのようにCOMポートを指定してするだけではデバイスを認識できなくて挫折した経験があったのでなんとかしたかったのも事実です。

今回接続するマイコンArduino UNOを使います。

シリアル通信

おそらくいちばん回路erがやりたい接続方法ではないのかなーとか思う方法ですが、簡単に言うとマイコンタブレットUSB(もしくはRS232C)で物理的に接続して、シリアル通信を行うという方法です。

タブレットなら無線だろJK...みたな感じではありますが物理的に接続されてるので一番安心します。

f:id:garicchi:20140919151345p:plain

シリアル通信とは、USBまたはRS232Cみたいなケーブルで接続されたデバイス同士で、データの送信スピードを決めて相互通信するUSBなどの通信方法の代表的なヤツです。

シリアル通信とは 【 serial communication 】 〔 シリアル転送 〕 - 意味/解説/説明/定義 : IT用語辞典

WindowsストアアプリでUSB接続されたデバイスとシリアル通信を行うには、WinUSBというドライバでデバイスが認識されていなければいけません

WindowsRuntimeではWinUSBで接続されていないデバイスとのシリアル通信は禁止されています。

かならずストアアプリからシリアル通信したいデバイスは、WinUSBというドライバでタブレットと接続しなければいけません。

ということは、デバイスを提供するベンダー(製品制作側)が、WinUSBとして認識するようなドライバを提供しなければUSBでシリアル通信はできないということになります。

たとえばエレコムのUC-SGTなどは、RS232C→USBという変換ケーブルですがエレコムがWinUSB対応ドライバを公開しているのでこれを使えばWinUSBとして認識できるらしいです。

しかし必ずしもベンダー側がドライバを提供してくれるとも限らないので接続したいPC側で、デバイスをWinUSBとして認識する方法が2種類あります。

  • カスタムinfファイルを作る方法
  • レジストリをいじってGUIDを追加する方法

この2種類ですが、この記事で長々というのもアレなのでまたいつか方法を解説したいと思います。

とにかく、Windowsストアアプリからシリアル通信するには少し特殊な方法を使わなければいけないということだけ理解できてればおkです。

で実際やってみた動画がこちら

スライダーの値に合わせてサーボモーターが回転しています。

タブレットのUSBにガシュッとつけて使うデバイスとかに向いています。

ソケット通信

ソケット通信とは、TCP/IPプロトコルで通信を行うクライアント・サーバー方式の通信です。 もっと砕けた言い方をすると、ネットワーク上にある特定のIPアドレスのデバイスと通信を行う方法です。

ブラウザでWebページを見るという通信も元をたどればソケット通信です。

f:id:garicchi:20140919153340p:plain

特徴としては、デバイスがインターネットに接続されていればデバイスがどれだけ離れていても通信をすることができます。

さきほどのUSBシリアル通信ではUSBケーブルが届く範囲でしか通信できませんでしたが、ソケット通信でデバイスと通信するとデバイスがどこにいても問題ないという利点があります。

ということでArduinoをデバイスに接続する方法として、ArduinoEthernetシールドを使います。

Arduino イーサネットシールド

Arduino イーサネットシールド

WindowsRuntimeでソケット通信を行うにはStreamSocketというAPIとつかいます。 ArduinoにはEthernet用のライブラリがありました。

通信してみた動画がこちら

撮影がアレなのでわかりにくいですが、タブレット側に一切ケーブルが繋がっていない状態です。

せっかくのタブレットアプリなのでケーブルなしで通信したいですね。そういうときにソケット通信は便利です。

デバイスがどこにいてもインターネットがあれば問題ないので自宅をセンサーで常に監視して外出先からタブレットで遠隔操作とかのデバイスに向いています。

Bluetooth通信

Bluetoothについてはもはや解説する必要はないと思いますが、WindowsRuntimeではサポートするBluetoothのプロファイルとして、

  • Generic Attribute Profile(GATT)
  • RFCOMM

の2種類のプロファイルをサポートしています。

GATTとは、さまざまな用途に向けてプロトコルをたくさん用意しているプロファイルです。 つまりいちいち受信データ解析をがんばらなくても、プロトコルに応じたデータ形式で送られてくるので解析が楽です。最近だとヘルスメーターなどのスマートデバイスに対応しています。

RFCOMMとは、Bluetoothでペアリングされているデバイスに仮想的なCOMポートを作り、接続している方法はBluetoothなのにデータを送受信するときはまるでシリアル通信をしているようなことができるプロファイルです。

ようするにRFCOMMがサポートされていれば、ペアリングさえできればシリアル通信と同じ方法で通信ができます。

WindowsRuntimeではRFCOMMにはStreamSocketを使います(.NetではSerialPortだった)

f:id:garicchi:20140919155138p:plain

タブレット側はBluetoothがサポートされていれば問題ありませんが、ArduinoBluetoothにデフォルトではつながらないのでBluetoothモジュールというものを使います。

今回使ったRBT-100は、技適も取得しているBluetoothモジュールです。 RXとTXというシリアル通信用のポートを使ってシリアル通信とおなじ感覚でBluetooth通信ができます。

BluetoothモジュールRBT-001 - スイッチサイエンス

ソケット通信では、デバイス同士が同一のネットワークに繋がっていないと通信できません。

しかしBluetoothで接続すると、ネットワークがなくても、デバイスがある程度近距離にいればデバイスだけで通信することができます。

この手軽さからタブレットとデバイスの接続はBluetoothが一般的です。

デバイスだけあれば簡潔するので、外出時に使えるようなタブレットと連携するデバイスだとか、そういうのに使えます。

なんとなくできそうだなーと思う通信方法

今まで上げた3つの通信方法は代表的なWindowsストアアプリとデバイスとの通信方法です。

それ以外に2つ通信方法を思いついたので試してませんができると面白いかも。

HIDデバイスとして通信

WindowsRuntimeではHID(Human Interface Device)を公式でサポートしています。

なのでマウスやキーボード、ゲームコントローラーなどはHIDデバイスであれば標準で認識をサポートしています。

XBOX360コントローラーをHIDデバイスとして認識してみた動画

コレを利用して、ArduinoをHIDデバイスとして認識できれば通信ができるんじゃないかなとか思っています。

実際、「Arduino HID」とか検索するとHIDキーボードとして認識している例があるので行ける気がします。

HIDデバイスで認識できればWinUSBドライバとか面倒臭いことかんがえないでマイコンと通信ができると思います。

NetduinoはHIDとして認識できる用のドライバとかあるらしいですけど在庫切れ

Arduino USB HID Keyboard | MitchTech

イヤホンジャックから通信

WindowsPhoneは日本で技適を取得していないのでソケット通信、Bluetooth通信、NFC通信などを利用することは日本では禁止されています。

さらにWindowsPhoneはUSBでのシリアル通信やUSBからHIDデバイスの認識はサポートしていません。

つまりWindowsPhoneとデバイス連携は絶望的です。

そこで、イヤホンジャックからの電圧出力を信号として取り出す方法があります。

スマートフォンでクレジット決済を行うSquareなどはこの方法で通信を行っています。

Square - iPhone、Android、iPadでクレジットカード決済。

しかしイヤホンジャックからの出力電圧は微小なものなので、アンプ回路で信号を増幅させる必要があります

オペアンプ買ってくるのもめんどくさいんですけど、WindowsPhoneでデバイス連携できる唯一の方法なんじゃないかなーという期待をしています。

結論

まあ電子回路と通信しなくてもタブレットにはセンサーとかたくさんついてるんで楽しいことはできるんですけど、ソフトウエアだけでなくハードウエアとの連携をすると、アイデアの幅やアプリの世界がグッとひろがります。

これはWindowsPhone*1からソケット通信をしてホームセンターで買ってきたテレビリモコンのスイッチにマイコンから電圧を与えて、WindowsPhoneからテレビを操作した動画です。

このように、デバイス連携の真骨頂は、「既存のデバイスのスイッチを制御することで既存のデバイスの機能を活用」することができるというところにあります。

テレビリモコンというテレビを操作する機能を持っているデバイスのスイッチをマイコンで制御して、ソフトウエアと連携するだけでWindowsPhoneからテレビが操作できたりするんですよね。

ぜひみなさんもソフトウエアの世界に限らず、Windowsストアアプリとデバイスを連携して、ライフハックしてみてください。

このバトルタイタンをWindowsストアアプリから操作したいなーとかおもってる今日このごろ

http://www.marutsu.co.jp/images/mm12/080401/0000000000169952_1.jpg

【MR-9101】バトルタイタン 【マルツパーツ館WebShop】

参考URL

WindowsストアアプリとデバイスIoTに関してはMicrosoftの太田さんが詳しくまとめておられます。

Windows 8.1 ストアアプリと連携できる周辺機器概要 - デバイスとITの架け橋 - Site Home - MSDN Blogs

デバイス、プリンター、センサーの統合 (XAML) - Windows app development

*1:WindowsPhone7.5だから問題ないんだからねッ