質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2433閲覧

赤外線コードの判定手法

matusmon

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/07/21 03:32

編集2019/07/21 04:15

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2019/07/21 05:19

実際に受信されているデータも記載したほうが良いです。 LED電球や蛍光灯により干渉を受ける場合がありますが照明を消した状態でも受信状態は変わりませんか?
guest

回答2

0

ベストアンサー

実際に赤外線の受信を行っているのは、「USB赤外線リモコンアドバンス」なるものなので、PC側でいくらコードを組んでも精度は上がりません。
アドバンス側のコードで赤外線コード受信を行い、PCではその結果を取得するだけにすればどうですか

投稿2019/07/21 04:04

編集2019/07/21 04:05
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matusmon

2019/07/21 04:21

「USB赤外線リモコンアドバンス」から取得した赤外線コードは、はON/OFFの切り替わりの時間がbyte型配列で返ってくるだけなので、結局はその時点で誤差が生じた値を取得することになります。 それをどのようにして1,0のデータとしてデコードし、例えばエアコンなどの家電製品のように「リモコンのこのボタンが押された」と判断できているのか、疑問に思っているところです。
y_waiwai

2019/07/21 04:27

その出てきた時間データをいくらいじったところで無駄です 「アドバンス」側でどうにかしないとどーにもなりません 家電製品にはリモコン解読用のPCなんか内蔵されてませんぜ
y_waiwai

2019/07/21 04:34

はやいはなしが、その「アドバンス」の受信能力が低いのをどうにかしないとダメです それが回路的な問題なのか、解読用のコードの問題なのかはわかりませんが。
matusmon

2019/07/21 04:58

家電製品におけるリモコン解読用の処理は、マイコンによって行われており、 それに相当する処理を「USB赤外線リモコンアドバンス」で行われていると理解しています。 ファームウェアや回路図が公開されていないため、解決は難しいですね。
y_waiwai

2019/07/21 05:05

Arduinoに赤外線センサつないで、リモコン受信させるってのでもそこまで精度悪くなかったと思いますが、(数メートルは受信できていた) そいつ単体で動作するようなサンプルコードみたいなのはついてませんか? それで動作するけど、というはなしならば、まだどうにかできる余地はあるとおもいますが
guest

0

プライベート?お仕事?
お仕事なら

法人需要にも柔軟に対応
カスタマイズ含め、大量導入などお客様のシステムを含めての受託開発にも対応可能です。
各種機能カスタマイズも承ります。詳しくは [こちら]よりお問い合わせ下さい。

と書いてあるのでカスタマイズを依頼するのが良いと思うけど、プライベートなら複数つぶす覚悟で受光部分を改造するしかないんじゃないかな?
多分光量不足が原因だと思うけど、
ノイズに負けているのであれば他の影響を少なくなるようにするしかないし、
ノイズに負けるのではなくて受光部からの電圧の変化が小さくてHi/Lowの閾値をまたぐのにもたついているのであれば閾値を下げるかアンプをかまして電圧変化を大きくするか

とりあえずはメーカーのお問い合わせから相談するのが確実かと思いますけど

投稿2019/07/22 04:37

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matusmon

2019/07/22 10:55

完全に趣味です。 とりあえず、ライブラリを介したプログラムからどうにかできることではなさそうだ、ということが分かりましたので、本件はクローズしたいと思います。 時間があるときに、改造にチャレンジしてみたいと思います。 ありがとうございました。
YAmaGNZ

2019/07/22 11:07

アドバンスじゃないほうのキットならファームもソース公開されてるみたいですから、いじってみるにはいいんじゃないですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問