前提・実現したいこと
USB赤外線リモコンアドバンスとライブラリを用いて、特定の赤外線コードを受信したことをトリガーにして、任意のプログラムを実行させたいと考えています。
USB赤外線リモコンアドバンスの赤外線受光部と、発信機(リモコン)が至近距離であれば、受信コードは常に同一の値となりますが、距離を離すと不定となってしまいます。
赤外線の点滅間隔によって1,0が決まるため、距離が離れることによって誤差が生じているものと考えています。
そのため、「特定の赤外線コードを受信したこと」を判定することが困難な状況に陥っています。
よって、誤差を吸収して常に一定のデータとして判定するための知恵を頂きたいです。
期待する受信コード
以下のようなソニーフォーマットのコードを取得できる想定です。各セルは2byte単位で記載しています。
なお、発信機からはボタンを押している間繰り返しコードが送られてきます。
試しに作成中のソースコード
以下のソースコードでは、受光部と発振機間の距離が3mほどの場合、各ビットがおよそ50%の確率で誤ってしまいます。
c#
1/// <summary> 2/// 受信データをソニーフォーマットに整形し、データ部の各ビットをblIRData[]に格納する 3/// </summary> 4/// <param name="byRxCodes">ライブラリ関数 readUSBIRData() で取得した赤外線コード</param> 5private void SetSonyFormat(byte[] byRxCodes) 6{ 7 const byte T = 24; 8 const byte START = 4 * T; 9 const byte DATA1 = 2 * T; 10 const byte DATA0 = T; 11 const byte OFFCODE = T; 12 const byte MARGIN = 5; 13 14 uint uiOnCode = 0; 15 uint uiOffCode = 0; 16 17 bool[] blIRData = new bool[19]; 18 uint uiIRDataCnt = 0; 19 bool blDataFlg = false; 20 bool blOffFlg = false; 21 22 for (uint uiCodeCnt = 0; uiCodeCnt < byRxCodes.Length; uiCodeCnt++) 23 { 24 if (blOffFlg) 25 { 26 // HighByteとLowByteを演算して2byteに 27 uiOffCode = Byte2Uint(byRxCodes, uiCodeCnt); 28 blOffFlg = false; 29 } 30 else 31 { 32 uiOnCode = Byte2Uint(byRxCodes, uiCodeCnt); 33 blOffFlg = true; 34 continue; 35 } 36 37 if (blDataFlg == false) 38 { 39 if ((START + OFFCODE - MARGIN) < (uiOnCode + uiOffCode) && (uiOnCode + uiOffCode) < (START + OFFCODE + MARGIN)) blDataFlg = true; 40 continue; 41 } 42 43 if ((DATA0 + OFFCODE + MARGIN) > uiOnCode + uiOffCode) 44 { 45 blIRData[uiIRDataCnt] = false; 46 } 47 else if ((DATA1 + OFFCODE) < uiOnCode + uiOffCode) 48 { 49 blIRData[uiIRDataCnt] = true; 50 } 51 uiIRDataCnt++; 52 if (uiIRDataCnt >= blIRData.Length) 53 { 54 Console.WriteLine(String.Join(", ", blIRData)); 55 blDataFlg = false; 56 uiIRDataCnt = 0; 57 } 58 } 59}
呼び出し元は以下のようにしています。
これにより、2secごとにUSB赤外線リモコンアドバンスへ保存されたデータを取り出しています。
c#
1public async void ReadIR() 2{ 3 byte[] byRxCodes; 4 uint uiBitLen = 0; 5 while (MainWindow.blRecFlg == false) 6 { 7 byRxCodes = new byte[8192]; 8 USBIR.recUSBIRData_Start(Handle, IRFREQ); 9 await Task.Delay(2000); 10 USBIR.recUSBIRData_Stop(Handle); 11 USBIR.readUSBIRData(Handle, ref byRxCodes, (uint)byRxCodes.Length, ref uiBitLen); 12 13 SetSonyFormat(byRxCodes); 14 } 15} 16
実際に受信されているデータも記載したほうが良いです。
LED電球や蛍光灯により干渉を受ける場合がありますが照明を消した状態でも受信状態は変わりませんか?

回答2件
あなたの回答
tips
プレビュー