Bluetoothでデバイスと通信するには

Rfcomm WindowsRuntimeではBluetoothの通信プロファイルの一つである、Rfcommをサポートしています。 Rfcommとは、通信上はBluetoothで接続されているデバイスと通信を行いますが、見かけ上はただのシリアル通信としてプログラミングできるプロファイルです。   シリアル通信とはCOMポートを使って有線で通信を行う方法ですが、RfcommではBluetoothで繋がったデバイスに仮想的なCOMポートを提供し、そのCOMポートにむかってシリアル通信をするだけで見かけ上のシリアル通信を無線で実現することができます。   RBT-001 今回は接続するデバイスとして、ArduinoとRBT-001というBluetoothモジュールを用いて通信を行います。 回路図はこんな感じです。 ArduinoのRXソケットをRBT-001のTXソケットに、TXソケットをRXソケットにつなぎます。     あらかじめArduino側にプログラムを書き込んでおきます。 シリアル通信でデータが流れてくるとそのままデータをシリアル通信で流し、LEDを1秒光らせる単純なものです。 int ledPin=13; void setup(){ pinMode(ledPin,OUTPUT); Serial.begin(9600); } void loop(){ int data=Serial.read(); if(data!=-1){ Serial.write(data); digitalWrite(ledPin,HIGH); delay(1000); digitalWrite(ledPin,LOW); } } ここまでできると、RBT-001からBluetoothの電波が飛ぶのでWindows側から認識できます。 ペアリングしておきましょう。PINコードはデフォルトで「0000」です。   SeviceGUID RBT-001でRfcommを使うとき、サービスを一意に特定するためにGUID値を利用します。 これはあらかじめRBT-001が提供するGUID値を使います。   コントロールパネルからEasyBTのプロパティを見ます。 ハードウエアのタブからBluetoothリンク経由の標準シリアルを選択し、「プロパティ」を押します。     詳細タブを開き、BluetoothサービスGUIDを見るとGUIDを取得できます。 このGUIDを使用するのでコピ-しておきます。   マニフェストファイルに書き込む Rfcommで通信するにはマニフェストファイルに書き込まなければいけません。 Package.manifestファイルを右クリックして「コードを表示」をおしましょう。   Capabilityタグ内に以下のタグを追加します。 m2:FunctionタグのType属性値は先ほど取得したGUIDに置き換えてください <m2:DeviceCapability Name=”bluetooth.rfcomm”> <m2:Device…

WinUSBデバイスとシリアル通信するには

WinUSB WindowsRuntimeでは、サードパーティー製のドライバで接続されたデバイスとのシリアル通信が禁止されています。 基本的にWindowsストアアプリなどからUSBデバイスとシリアル通信を行うには、USBデバイスが「WinUSB.sys」というドライバで認識されていなければいけません。 たとえばエレコムのUC-SGTなどは、RS232C→USBの変換ケーブルですが、公式でWinUSBをインストールするドライバパッケージ(中身はinfファイル)が提供されているのでドライバを入れれば、UC-SGTで接続されたデバイスはWindowsストアアプリからシリアル通信が可能となります。 とにかく、WindowsRuntimeでシリアル通信を行うには、デバイスをWinUSBというドライバで認識できなければ使うことができません。   デバイスをWinUSBとして認識させる2つの方法 デバイスをWinUSBとして認識させるには2つの方法があります。 カスタムinfファイルを作成する方法 (条件 端末に物理キーボードが付いている場合) レジストリにGUIDを登録する方法 (条件 レジストリをいじっても問題無い場合)   1番目のカスタムinfファイルを作成する方法は、端末に物理キーボードが付いていることが条件になります。 なぜなら、オリジナルなinfファイルをつくり、インストールするためデジタル証明の無いドライバーをインストールする許可を端末に与えなければいけません。 Windows8.1でデジタル証明のないドライバをインストールする許可を与えるには、PCの設定→保守と管理→回復→PCの起動をカスタマイズする→トラブルシューティング→詳細オプション→その他の修復オプションを表示→スタートアップ設定に行き、 「7キー」を押してドライバー署名の強制を無効にするを押さなければいけません。     しかし端末に物理キーボードなどがついていない場合、7キーを押すことができません。USBキーボードを接続しても認識しない場合が多いので、ラップトップなど、PCに物理キーボードが標準で付いている場合はこちらのカスタムinfファイルを作成する方法をとれますが、端末に物理キーボードがついていない場合、レジストリをいじる必要があります。   2番目のレジストリにGUIDを登録する方法は、端末に物理キーボードがついていない場合使用します。 そもそもすべてのデバイスはデバイスマネージャからWinUSBドライバをドライバとして選択すればドライバを適用できます。 しかし、認識するときにシステムが登録されているGUIDにデバイスと一致するものがあるかどうか見に行くのですがその時にデバイスのGUIDがなくて認識できません。 そこで、レジストリにデバイスのGUIDを登録することでデバイスを認識することができます。 GUIDとはGlobally Unique Identifierの略でなにかを一意に決定する識別子(ID)です。 このような形をしています。{d53fa365-5ag4-4436-938b-9db4734c6ca3}   Arduinoを接続してみる Arduinoマイコンとは様々IOが標準で搭載されたAVRマイコンで非常に使い勝手がよく、シリアル通信をすることもできます。 今回はArduino UNOを接続してみたいと思います。   カスタムinfファイルを作成する方法 こちらの方法でデバイスが認識できればGUIDを追加する方法はしなくてもよいです。 infファイルとは、Windowsのソフトウエアをインストール用の設定が記述されたファイルのことです。 事前にOSにinfファイルをインストールしておくと、デバイスが接続されたときそのinfファイルを仲介してWinUSBドライバを読み込んでくれます。 カスタムinfファイルとは、そのinfファイルを自分で記述して事前にインストールしておくことを指します。   ではカスタムinfファイルを作成してみましょう。 以下のテキストデータをテキストエディタで書き込みます。 ; ; ; Installs WinUsb ; [Version] Signature = “$Windows…

ヒューマンインタフェイスデバイス(HID)を使うには

ヒューマンインターフェイスデバイス ヒューマンインターフェイスデバイス(HID)とは、マウスやキーボードなど、人とPCとの基本的なやりとりをする装置を統一的なプロファイルで表したもので、HID対応デバイスならばどのようなデバイスであっても統一的な処理でアクセスすることができます。   どのようなHIDデバイスがあるのかはUSB.orgのサイトにあるHID Usage tableのPDFを見るとわかります。 非常に沢山あり、KeyboardやGame ControlsからVR Controlsまで、様々なデバイスをサポートしています。 自分のPCにどのようなHIDデバイスがあるのかは、デバイスマネージャーからヒューマンインターフェイスデバイスの項目を見るとわかります。     WindowsRuntimeでは標準でHIDデバイスの入出力をサポートしており、HIDDeviceクラスによって扱うことができます。 今回はHIDデバイスの一つであるXBOX360のコントローラを使って入力値をとってみたいと思います。   デバイスを特定するID HID対応のデバイスを特定するには4つのIDが必要となっています。 UsagePage(デバイスのカテゴリID) UsageId(デバイスの種類ID) VendorId(デバイスの製造者ID) ProductId(デバイスの製品ID) の4つが必要となります。   UsagePageとUsageIdについてはUSB.orgのサイトにあるHID Usage tableのPDFを見て調べます。 GamePadはGeneric DesktopPage(0x01)のGame Pad(0x05)なので UsagePageは0x01、UsageIdは0x05となります。   続いてVendorIdとProductIdです。 これはデバイスのプロパティを見るとわかる場合が多いです。 デバイスマネージャーからXBox360コントローラのプロパティを見て、詳細タブのプロパティからハードウエアIDの項目を見ると、VIDとPIDがわかります。 したがってこの場合、VendorIDはVIDのところを見て、0x045E、ProductIDはPIDのところを見て0x028Eということがわかります。   もしこの方法でVendorIDとProductIDが取得できない場合、取得ツールが公開されているのでMicrosoftの太田さんの記事を呼んでVendorIDとProductIDを取得してください。 WindowsストアアプリからHIDデバイスを制御する   マニフェストファイルを編集する 4つのIDを取得できたら、マニフェストファイルに4つのIDを書いておく必要があります。 ソリューションエクスプローラーからPackage.manifestファイルを右クリックして、コードを表示します。   Packageタグにxmlns:wb=”http://schemas.microsoft.com/appx/2013/manifest”属性を追加します。 <Package xmlns=”http://schemas.microsoft.com/appx/2010/manifest” xmlns:m2=”http://schemas.microsoft.com/appx/2013/manifest” xmlns:wb=”http://schemas.microsoft.com/appx/2013/manifest” > そしてCapabilityタグ内に<wb:DeviceCapability>タグを追加します。 DeviceタグのId属性には”vidpid:{vendorId} {productID}”の形式でVendorIDとProductIDを入力します。 FunctionタグのType属性には”usage:{UsagePage} {UsageId}”の形でUsagePageとUsageIDを指定します。  …

スキャナーを使ってスキャンするには

スキャナーを取得する WindowsRuntimeではイメージスキャナーを標準でサポートしています。 使用するスキャナーを決定するためにはDeviceInformationクラスのFindAllAsyncでDeviceClass列挙体のImageScannerを渡してスキャナーを列挙します。   コレクションからどのスキャナーを使うかを決定し、そのIdをImageScannerクラスのFromIdAsyncメソッドに渡してImageScannerを初期化します。 ImageScanner scanner;   DeviceInformationCollection collection = await DeviceInformation.FindAllAsync(DeviceClass.ImageScanner); DeviceInformation info = collection.First();//今回は1番目のスキャナーを使う string printerName = info.Name; scanner = await ImageScanner.FromIdAsync(info.Id); DeviceClassを使いましたがImageScannerのGetDeviceSelectorをFindAllAsyncメソッドにわたすことでフィルタリングも可能です。 DeviceInformationCollection collection = await DeviceInformation.FindAllAsync(ImageScanner.GetDeviceSelector());   スキャンしてStorageFileに保存する スキャナーが決定できたらScanFileToStorageFolderAsyncメソッドによってスキャンを開始することができます。 今回は画像ライブラリに保存するのでマニフェストファイルの機能→画像ライブラリにチェックを入れましょう。 StorageFolder folder =KnownFolders.PicturesLibrary; await scanner.ScanFilesToFolderAsync(scanner.DefaultScanSource,folder);   スキャンしてプレビューする プレビュー機能のあるスキャナーならばスキャン結果をプレビューすることが可能です。 IsPreviewSupportedメソッドをつかって、プレビュー機能をスキャナーがサポートするかを判断し、 ScanPreviewToStreamAsyncメソッドつかってストリームにプレビューデータを流します。 あとはInMemoryRandomAccessStreamをつかってImageコントロールにストリームを流します。 if (scanner.IsPreviewSupported(scanner.DefaultScanSource)) { BitmapImage image=new BitmapImage(); using (InMemoryRandomAccessStream stream…

プリンターを使って印刷するには

プリンターへのアクセス WindowsRuntimeでは周辺機器へのアクセスはDeviceInformationクラスでデバイスを列挙して特定しますが、プリンターの場合はチャームのデバイス→印刷を表示することで現在アクセス可能なプリンター一覧が表示され、ユーザーが任意のプリンターを選択するという形になります。   したがって、プリンターで印刷をするために開発者側がすることは、プリントしたいドキュメントをPrintManagerクラスに投げるだけです。 どのプリンターで印刷するか、印刷をするかどうかはユーザーの選択に任せることになっています。   印刷用ページの作成 WindowsRuntimeで印刷を行うことができるものは、UIElementとそれを継承するクラスです。 UIElementはほとんどのXAMLコントロールの基底となるクラスですのでほとんどのコントロールは印刷が可能です。 したがって、画像やドキュメントなどを印刷したい場合、一度XAMLコントロール上に置きます。   今回は3ページ印刷するために一つ一つのページをCanvasコントロールで定義します。 <Canvas x:Name=”canvasPage1″ HorizontalAlignment=”Left” Height=”500″ VerticalAlignment=”Top” Width=”500″> <Canvas.Background> <LinearGradientBrush EndPoint=”0.5,1″ StartPoint=”0.5,0″> <GradientStop Color=”#FF6C1A1A” Offset=”0″/> <GradientStop Color=”#FFAC5B5B” Offset=”1″/> </LinearGradientBrush> </Canvas.Background> <TextBlock Text=”Page1″ FontSize=”20″ /> </Canvas> <Canvas x:Name=”canvasPage2″ HorizontalAlignment=”Left” Height=”500″ VerticalAlignment=”Top” Width=”500″> <Canvas.Background> <ImageBrush Stretch=”Fill” ImageSource=”Assets/1.PNG”/> </Canvas.Background> <TextBlock Text=”Page2″ FontSize=”20″ Foreground=”#FF171717″ /> </Canvas> <Canvas x:Name=”canvasPage3″ HorizontalAlignment=”Left”…