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

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

ただいまの
回答率

89.12%

赤外線コードの判定手法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 697

matusmon

score 12

前提・実現したいこと

USB赤外線リモコンアドバンスライブラリを用いて、特定の赤外線コードを受信したことをトリガーにして、任意のプログラムを実行させたいと考えています。
USB赤外線リモコンアドバンスの赤外線受光部と、発信機(リモコン)が至近距離であれば、受信コードは常に同一の値となりますが、距離を離すと不定となってしまいます。
赤外線の点滅間隔によって1,0が決まるため、距離が離れることによって誤差が生じているものと考えています。
そのため、「特定の赤外線コードを受信したこと」を判定することが困難な状況に陥っています。
よって、誤差を吸収して常に一定のデータとして判定するための知恵を頂きたいです。

期待する受信コード

以下のようなソニーフォーマットのコードを取得できる想定です。各セルは2byte単位で記載しています。
なお、発信機からはボタンを押している間繰り返しコードが送られてきます。
イメージ説明

試しに作成中のソースコード

以下のソースコードでは、受光部と発振機間の距離が3mほどの場合、各ビットがおよそ50%の確率で誤ってしまいます。

/// <summary>
/// 受信データをソニーフォーマットに整形し、データ部の各ビットをblIRData[]に格納する
/// </summary>
/// <param name="byRxCodes">ライブラリ関数 readUSBIRData() で取得した赤外線コード</param>
private void SetSonyFormat(byte[] byRxCodes)
{
    const byte T = 24;
    const byte START = 4 * T;
    const byte DATA1 = 2 * T;
    const byte DATA0 = T;
    const byte OFFCODE = T;
    const byte MARGIN = 5;

    uint uiOnCode = 0;
    uint uiOffCode = 0;

    bool[] blIRData = new bool[19];
    uint uiIRDataCnt = 0;
    bool blDataFlg = false;
    bool blOffFlg = false;

    for (uint uiCodeCnt = 0; uiCodeCnt < byRxCodes.Length; uiCodeCnt++)
    {
        if (blOffFlg)
        {
            // HighByteとLowByteを演算して2byteに
            uiOffCode = Byte2Uint(byRxCodes, uiCodeCnt);
            blOffFlg = false;
        }
        else
        {
            uiOnCode = Byte2Uint(byRxCodes, uiCodeCnt);
            blOffFlg = true;
            continue;
        }

        if (blDataFlg == false)
        {
            if ((START + OFFCODE - MARGIN) < (uiOnCode + uiOffCode) && (uiOnCode + uiOffCode) < (START + OFFCODE + MARGIN)) blDataFlg = true;
            continue;
        }

        if ((DATA0 + OFFCODE + MARGIN) > uiOnCode + uiOffCode)
        {
            blIRData[uiIRDataCnt] = false;
        }
        else if ((DATA1 + OFFCODE) < uiOnCode + uiOffCode)
        {
            blIRData[uiIRDataCnt] = true;
        }
        uiIRDataCnt++;
        if (uiIRDataCnt >= blIRData.Length)
        {
            Console.WriteLine(String.Join(", ", blIRData));
            blDataFlg = false;
            uiIRDataCnt = 0;
        }
    }
}

呼び出し元は以下のようにしています。
これにより、2secごとにUSB赤外線リモコンアドバンスへ保存されたデータを取り出しています。

public async void ReadIR()
{
    byte[] byRxCodes;
    uint uiBitLen = 0;
    while (MainWindow.blRecFlg == false)
    {
        byRxCodes = new byte[8192];
        USBIR.recUSBIRData_Start(Handle, IRFREQ);
        await Task.Delay(2000);
        USBIR.recUSBIRData_Stop(Handle);
        USBIR.readUSBIRData(Handle, ref byRxCodes, (uint)byRxCodes.Length, ref uiBitLen);

        SetSonyFormat(byRxCodes);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SHOMI

    2019/07/21 14:19

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

    キャンセル

回答 2

checkベストアンサー

+2

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/21 13:34

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

    キャンセル

  • 2019/07/21 13:58

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

    キャンセル

  • 2019/07/21 14:05

    Arduinoに赤外線センサつないで、リモコン受信させるってのでもそこまで精度悪くなかったと思いますが、(数メートルは受信できていた)

    そいつ単体で動作するようなサンプルコードみたいなのはついてませんか?
    それで動作するけど、というはなしならば、まだどうにかできる余地はあるとおもいますが

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/22 19:55

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

    キャンセル

  • 2019/07/22 20:07

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

    キャンセル

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる