工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Win 10 IoT-CoreRPI2を搭載した汎用シリアルBluetooth

コンポーネントと消耗品

>
Raspberry Pi2モデルB
× 1
汎用BluetoothUSBドングル
× 1
Arduino UNO
× 1
SparkFunBluetoothモデム-BlueSMiRFシルバー
× 1

アプリとオンラインサービス

>
Microsoft Windows 10 IoT Core
Microsoft Visual Studio 2015

このプロジェクトについて

さらに

このプロジェクトについては、embedded101.comで詳しく説明されています:

「Win10IoT-Core:BluetoothユニバーサルWindowsシリアルアプリ」

このプロジェクトは、汎用Bluetooth USBドングルを使用して、Bluetoothシリアルプロファイルを介してRaspberry PI2などのIoTコアデバイスを組み込みBluetoothデバイスに接続するユニバーサルWindowsアプリです。

背景

.Bluetoothは、短距離でのピアツーピアネットワークをサポートします。 Wi-Fiネットワークとは異なり、Bluetooth接続は1対1です。 2つのデバイスが接続して相互作用できます。たとえば、2つのデバイスは、シリアルプロファイルとそれらの間の生データを使用して対称的に接続できます。ただし、一般的に、Bluetooth接続は非対称であり、一方の端が特定のデータ形式を生成し、もう一方の端で消費されます。たとえば、携帯電話はA2DP(Advanced Audio Distribution Profile)プロファイルを実装し、HSP(Headset)プロファイルを実装するヘッドセットにオーディオをストリーミングできます。OBEX(Object Exchange)は、2つのデバイス間でデータを交換する際の対称接続です。

Microsoft IOT-Core Bluetoothサンプルプロジェクトは、GATT(汎用属性プロファイルプロファイル)を使用します。これにより、Bluetooth LowEnergyプロトコルのプロファイル検出および記述サービスが提供されます。このプロトコルを使用すると、単純な低電力デバイスを一方の端に接続して、複雑なプロセッサで消費されるデータを生成できます。

これは、Microsoftのサンプルよりもはるかに単純なプロジェクトです。これは、RFCOMMプロファイルに基づくより一般的なSPP(シリアルポートプロファイル)のみに関係します。非常に古いUSBBluetoothドングルを使用して開発されたため、どのBluetoothドングルでも動作するはずです。

IoTアプリ

このアプリは、シンプルなBluetoothシリアルユニバーサルWindows(Windows 10)テストアプリです。まず、アプリが実行されているデバイスとBluetoothでペアリングされているすべてのデバイスを(リストとして)列挙します。 1つは、接続を開始するダブルクリックによって選択されます。送信するテキストはテキストボックスに入力され、ボタンが押されたときに送信されます。アプリは、送信されたテキストを自動的に受信します(そして表示します)。したがって、エンドポイント(上記のように)が受信したテキストを単にエコーすると、送信されたテキストはUWアプリの受信ボックスに再表示されます。

<図>


エンドポイント

Bluetoothアダプターを使用してArduinoUnoをテストするために使用されます。 Bluetooth接続で受信した文字をエコーバックするシンプルなシールドがあります:

シールドの設定:

  //シリアルループバックアプリ//過去のセットアップ//接続されたシステムによって開始// BTデバイスのRxTxがArduinoボードのTxRxに接続されているBluetoothでメモを使用できます。 //プログラミングのためにBTアダプタを切断する必要があります。voidsetup(){//私のアダプタはこのBAUD115200に設定されています//これはArduinoからBTへのアダプタのポートレートです// BTアダプタがコマンドモードのときに設定されます。 //設定できないBTレートではありません。 Serial.begin(115200); delay(333); while(!Serial); delay(1000); Serial.println( "速い茶色のキツネが怠惰な犬を飛び越えます!");}  

シールドループ:

  void loop(){char ch =Serial.read(); while(255 ==(byte)ch){ch =Serial.read(); } Serial.print(ch);}  

ペアリング

Bluetoothはピアツーピアのシナリオです。 Bluetooth経由で接続する前に、ペアリングする必要があります。これはアプリ内では行われません。パスキーとのペアリングは、多くの場合ヘッドレスであり、ポップアップをサポートしない可能性があるため、組み込みデバイス間で問題になる可能性があります(IoT-Coreはサポートしていません)。これを行うためのIoT-CoreWebポータルと、SSHシェル上で実行できるデバイス上のコマンドラインユーティリティがあります。 OS Webポータルの最新バージョンは、Windows 10RTMの頃にはなかったパスキーペアリングをサポートしています。 「Win10IoT-Core:Bluetooth Universal Windows Serial App」では、このコンテキストでのペアリングについて詳しく説明しています。

プロジェクトの開始

アプリプロジェクトは、ユニバーサルWindowsアプリテンプレートを使用してVisual Studio2015で作成されます。

新しいプロジェクト-> Visual C#-> Windows->空白のアプリ(ユニバーサルWindows)

アプリUIの作成

UIはXAMLで実装されています

上記(または同様の)のレイアウトに従ってUIを作成します:

UIは非常に単純で、次のように作成されます。

  • TextBoxであるSendTextを除いて、すべてのテキスト要素はTextBlockです。
  • SendTextはCarriageReturnを受け入れます(つまり、Multilineです)
  • RecvdテキストでWrapTextが有効になっている(つまり、複数行)
  • UI要素は、水平方向に設定されたStackPanelを使用して行に編成されます
  • これらのStackPanelは、ListBoxとともに、垂直方向に設定されたStackPanelでスタックされます。

相対StackPanelsを使用してUIをレイアウトするか、グリッドの行と列などを使用することをお勧めします。

ConnectDevicesは、バインディングソースがPairedDevicesに設定されたリストボックスです(後で参照 )およびPairedDevicesのNameプロパティにバインドされたTextBlockで構成されるItemTemplate(後で参照 )。

          

アプリの構成

  • アプリはIOT-Core機能を使用しないため、拡張機能の参照は必要ありません。
  • アプリには、Package.appxmanifestに追加されたBluetoothとシリアルの特定の機能が必要です。
  • 残念ながら、ソリューションエクスプローラーでそのファイルをダブルクリックした場合に得られるUIはこれらの機能の追加をサポートしていないため、ソリューションエクスプローラーでファイルを右クリックして[プログラムから開く]を選択して手動で追加する必要があります。> XMLエディター。

機能セクション(下部)を次のように変更します:

           

internetClient機能はすでに存在します。このアプリには必要ないので、削除することをお勧めします。そのままにしておきます。

ペアリングされたデバイス情報

アプリの起動時に、ペアリングされたデバイスは次を使用して列挙されます:

DeviceInformationCollection DeviceInfoCollection

=await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));

このコレクションは、 ObservableCollection に変換されます。 リストボックスで使用できること:

_pairedDevices =new ObservableCollection ();

DeviceInfoCollection PairedDeviceInfo を作成することで繰り返されます 各アイテムのオブジェクトは、 _pairedDevices に追加されます。 コレクション。

PairedDeviceInfo プロパティを持つクラスです:

名前

Id

DeviceInfo

クラスには適切なコンストラクタがあります。

デバイス情報 Windows.Devices.Enumeration.DeviceInformation

ペアリングされたデバイスのリストボックスで、名前 フィールドが(バインドされて)表示されます。

デバイスを選択(ダブルクリック)すると、エンドポイントのDeviceInformationは実際には選択したメニュー項目の一部であるため、接続の確立に使用されます。

接続

DeviceInformationは、RFCOMMサービスを取得するために使用されます。次に、Endpoint HostName(実際にはBluetooth Macアドレス)とServiceName文字列を使用してStreamSocketとして接続が確立されます。

  _service =await RfcommDeviceService.FromIdAsync(DeviceInfo.Id); _ socket =new StreamSocket(); await _socket.ConnectAsync(_service.ConnectionHostName、_service.ConnectionServiceName);  

すべてが順調であれば、接続があります..ソケットは意味があります(nullではありません)。

もちろん、これはエラートラップされます(try-catch)

テキストの送信と受信は、ソケットのInputStreamプロパティとOutputStreamプロパティを利用します。

テキストを受信する

テキストの受信は、別のスレッドとして実行されるため、最初に開始する必要があります。非同期待機を実行してシリアル入力を取得し、入力を処理してから、別の非同期シリアル受信を実行します。すべてループで実行します。これは、キャンセルが生成されるまで継続的にループします。

  private async void Listen(){ReadCancellationTokenSource =new CancellationTokenSource(); if(_socket.InputStream!=null){dataReaderObject =new DataReader(_socket.InputStream); //シリアル入力を読み続けますwhile(true){await ReadAsync(ReadCancellationTokenSource.Token); }}} DataReader dataReaderObject; private CancellationTokenSource ReadCancellationTokenSource; private async Task ReadAsync(CancellationToken cancelToken){uint ReadBufferLength =1024; //タスクのキャンセルが要求された場合は、cancellationToken.ThrowIfCancellationRequested();に準拠します。 // 1つ以上のバイトが使用可能な場合に非同期読み取り操作を完了するようにInputStreamOptionsを設定しますdataReaderObject.InputStreamOptions =InputStreamOptions.Partial; //serialPort.InputStreamでデータを待機するタスクオブジェクトを作成しますloadAsyncTask =dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); //タスクを起動し、待機しますUInt32 bytesRead =await loadAsyncTask; if(bytesRead> 0){string recvdtxt =dataReaderObject.ReadString(bytesRead); }}  

テキストを送信

テキストの到着はアプリの観点からは非決定的であるため、受信したテキストは非同期で実行されますが、送信されたテキストはアプリのUIから処理されるため、基本的に同期されます(ただし、待機はUIを解放するために使用されます)。

  private async void Send(string msg){Task storeAsyncTask; DataWriter dataWriteObject =new DataWriter(_socket.OutputStream); dataWriteObject.WriteString(msg); //非同期タスクを起動して、書き込み操作を完了しますstoreAsyncTask =dataWriteObject.StoreAsync()。AsTask(); UInt32 bytesWritten =await storeAsyncTask;}  

ボタンの状態

コマンドボタンは、アプリの状態に応じて有効または無効になります。たとえば、[送信]ボタンと[受信開始]ボタンは、アプリが接続されていない場合は無効になりますが、アプリが接続されている場合は有効になります。

楽しみ! :)

コード

Github上のiotbluetoothserial
Codeplex(ミラー)でもhttps://iotgenbluetoothserialuwa.codeplex.com/https://github.com/djaus2/iotbluetoothserial

製造プロセス

  1. GoPiGo v2 with Windows IoT
  2. プッシュボタンを使用したPWMによる調光ライト
  3. アナログセンサーを備えた圧力気流測定装置
  4. MPU-6050を搭載したArduinoジャイロスコープゲーム
  5. ESP32を搭載したDiscordセキュリティカメラ
  6. LEDとピエゾスピーカーを備えたDHT11センサー
  7. Unopad-Abletonを搭載したArduinoMIDIコントローラー
  8. 3Dプリントされたケース付きの電池式テレビリモコン
  9. LEDを制御するBluetoothを搭載したArduino!
  10. Arduinoを搭載したシンプルな障害物センサー
  11. OKGoogleのBluetooth音声制御アプライアンス