obnizのフォーラムは新しいシステムに移行しております。

新しいフォーラムはこちらになります

IRModule の start と send



  • @kido

    kido 様
    前スレ誤って消してしまいました。すみません。

    アドバイスありがとうございます。
    原因がわかりました。
    使用している IRmodule の構造とロジック・アナライザの仕様から、
    起こるべくして起こる現象でした^^;
    アドバイスいただくまで、自分の信号を受信しているとは思ってもみなかったです。

    使用している IRmodule は
    https://obniz.com/ja/sdk/parts/IRModule/README.md
    の写真にあるのものです。
    この構造だと自分が発した赤外線を自分も受ける形になります。
    IRmodule のライブラリは受信データの処理にロジック・アナライザを使っているみたいで、ロジック・アナライザはトリガーを検出してデータ収録が終わっても、すぐに次のトリガーを待つようですので、自分が発光していると同時に受信もしています。
    ちょうど、シリアル通信の半二重と同じです。
    ですので、簡単な解決策としては、自分の信号を一度捨て読みをしてやれば良いと言うことがわかりました。もっと良い方法はいくつか思いつきますが、とりあえずこの方法で正常に動作してくれました。
    コードは下記です。

    <script>
            $("#bploading").text("RUNNING...");
            (async function(){
              var obniz, irmodule, ir_rcv_col;
        
              obniz = new Obniz('xxxx-xxxx');
              await obniz.connectWait();
              irmodule = obniz.wired("IRModule",{"vcc":0, "send":1, "recv":2, "gnd":3});
              irmodule.duration = 800;
              irmodule.start();
    
             while(1){ 
                ir_rcv_col = (await new Promise(resolve=>{ irmodule.ondetect = resolve; })); 
                console.log('rcvd');
                console.log(ir_rcv_col);
                await obniz.wait(4000);  
                ir_send = ir_rcv_col;
                if ( ir_rcv_col.length != 0 ){
                  console.log('send');
                  console.log( ir_send );
                  irmodule.send( ir_send );
                }
    
                // 自分が送信しているときに受信したデータを捨て読みする
                ir_rcv_col = (await new Promise(resolve=>{ irmodule.ondetect = resolve; }));
                
              }
    
            })();
        
        </script>
    


SUGGESTED TOPICS