Arduino:家電製品のIR制御(デバイスのアプリケーション)

おめでとうございます! レビューによれば、 「Arduino:家電製品のIR制御」という記事で、 はデバイスの究極の目標とそれを実践する方法についてほとんど説明していないことに気付きました。

arduino-deviceの目的は、赤外線で制御される一連のデバイスを制御することです。 次の図は、このデバイスの使用方法の例を示しています。イーサネットシールドが登場するまで、サーバーへのUSB接続の例を説明します。

図面はデバイスの機能を具体的に説明するために作成されたものであるとすぐに言わなければなりません。コントロールはテレビのみであり、2番目の図のようにソースサーバーとしてPCを使用するため、自宅ではすべてがはるかに簡単です。



2つの部屋があり、それぞれにデバイスがあり、それぞれのブランドとモデルが一致し、部屋のテレビ、DVDプレーヤー、衛星放送受信機のコマンドセットが一致するとします。 これに基づいて、各デバイスでArduino出力を使用する必要があると結論付けることができます。



コメントの中で、 Alexeyslavは、ソフトウェア部分を単純化するという口実の下で、これらの目的のためにデマルチプレクサを使用することを提案しました。 私はデマルチプレクサに反対していません。3出力でIRRemoteをシャープにするのは好きではありません。ちなみに、私のモジュールでデマルチプレクサを使用することを禁止する人はいません。



私に関しては、複数のポートは必要ありません。図に注意してください。





下の図のように、グローバルキャッシュから使用した発光ダイオード、この場合のダイオード。



便利なことに、エミッターを赤外線レシーバーの領域の機器に直接接着することができ、それによって制御が安定し、制御したいデバイスのみが保証されます(送信されたコマンドに応答するデバイスが複数ある場合)。



サーバー側を書いたとき、私はだまされたくなかったので、このIndy idHTTPSeverおよびCPortコンポーネントが使用されていたため、Delphiに組み込みの「ポートモニター」(仮想Comポート経由でarduinoにデータを転送するため)を備えた小さくてダムのあるWebサーバーをドロップすることにしました。

サーバー側には、そのファイル(CSS、JS、グラフィックスなど)を含むindex.htmlページと、機器を管理するためのコードが保存されているcodes.txtファイルがあります。 コードは、HEXとGlobalCacheの2つの形式で保存できます。

HEX形式には、識別子0000でコマンドを開始するルールがあります。これは、コードの繰り返し数と送信する必要があるポートを操作する場所と見なします。

繰り返し回数は、16進数から10進数のSS + 1に変換された最初の2文字です。

すなわち、 00 = 0 + 1 = 1または0A = 10 + 1 = 11 ;

ポートアドレスは、arduinoポート番号が単に隠されている2番目の2文字です。

たとえば、 00 =デジタルポート0または0D =デジタルポート13

HEXコード内の残りのデータは変更する必要はありません。そのままにしておきます。

GlobalCache形式のコードの場合、これはもう少し複雑です。形式自体は次のようになります。

sendir,{moduleaddress}:{connectoraddress},{ID},{frequency},{count},{offset},{on1},{off1}...





どこで:



私は主にHEX形式を使用しますが、GbalalCache形式のコードはほぼ2倍短く、したがって解析よりも2倍速いことに注意する価値があります。

各コマンドは厳密に別の行に配置する必要があります。ファイルの行番号は特定のコードへのポインターとして使用されます。便宜上、コードは数字で始まります。 ファイル内の行は最初から番号が付けられ、このようにして行番号0が取得されます-これはボタンコード0です。



例として、Philips 47PLF4007のコマンドを含むcodes.txtファイルの一部を示します。
 000D 0073 002A 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0021//digit 0 000D 0073 002A 000D 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0BED 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0021//digit 1 000D 0073 0028 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0010 0021//digit 2 ... 000D 0073 0024 000D 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0020 001F 0020 001F 0010 0010 0010 0BDE 0061 0021 0010 0020 0010 0010 0010 0010 0030 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 001F 0020 001F 0020 0020 0010 0010 0010 0021//home sendir,5:2,1,36000,1,1,97,31,16,30,16,16,16,16,16,30,32,14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,32,14,16,30,16,16,32,14,16,30,16,16,16,720//list 000D 0073 002A 0000 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 000F 0010 0010 0010 0010 0010 0BEE 0061 0021 0010 0020 0010 0010 0010 0010 0010 0020 0020 000F 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0020 0010 0010 0010 0010 0010 0010 0021//info ...
      
      







サーバー(またはそのようなもの。下図を参照)は完全にGETリクエストに基づいて構築されており、HTMLページを開発する際にはこれを考慮する必要があります。 一番下の行はこれです。名前がアンダースコアで始まり、コマンドが置かれているcodes.txtファイルの行番号をサーバーに要求します。



サーバーは、要求されたファイルが「_」で始まることを確認し、名前の最初の文字を削除し、残りの番号を読み取り、この番号の番号の行にコードをデバイスに送信します。

 procedure TForm1.srvCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var S,codeStr:String; i:Cardinal; begin S:=ARequestInfo.Document; Delete(S,1,1); if S='' then S:=ExtractFilePath(ParamStr(0))+'webdata\index.html' else begin if (S[1]='_') then begin Delete(S,1,1); codeStr:=SL.Strings[StrToInt(S)]; Delete(codeStr,pos('/',codeStr),255); if ComPort1.Connected then ComPort1.WriteStr(codeStr+#13); S:='ok.js'; end; S:=StringReplace(S,'/','\',[rfReplaceAll]); S:=ExtractFilePath(ParamStr(0))+'webdata\'+S; end; try AResponseInfo.ContentType:=ARequestInfo.ContentType; AResponseInfo.ContentStream:=TFileStream.Create(S,0); except end; end;
      
      





クライアントについては、サーバーとのデータ交換を担当するいくつかの関数を作成しました。 サーバーにコマンドの実行を要求するには、scr属性を持つ新しいタグをページに追加するだけです。

 var boolSendRepeat = false; function addScript(src){ var element = document.createElement('script'); element.type = 'text/javascript'; element.src = src; element.className = 'bufferresponsescript'; document.getElementsByTagName('head')[0].appendChild(element); } function delScripts(){ var z = document.getElementsByClassName('bufferresponsescript'); for(var i=z.length;i>0;i--){ z[i-1].parentNode.removeChild(z[i-1]); } } function sendCommand(cmdNumber){ addScript('_'+cmdNumber); } function sendMacro(arrCmdNumber,arrDelays){ var s=''; for(var i=0;i<arrCmdNumber.length;i++){ s = 'sendCommand('+arrCmdNumber[i]+')'; setTimeout(s,arrDelays[i]); } } function repeatFunc(cmdNumber,repeatTime){ var s = 'repeatFunc('+cmdNumber+','+repeatTime+')'; if(boolSendRepeat==true){ sendCommand(cmdNumber); setTimeout(s,repeatTime); } } function repeatStop(){ boolSendRepeat=false; } function sendRepeat(cmdNumber,repeatTime){ boolSendRepeat=true; repeatFunc(cmdNumber,repeatTime); }
      
      





次のようにインターフェースで適用できます:

  <td onclick="sendCommand(32)">List</td><!-- ,  32     codes.txt--> <td onclick="sendMacro([46,43],[10,550])"></td><!--    46,   550    43--> <td onmousedown="sendRepeat(12,800)" onmouseup="repeatStop()">Vol+</td><!--    12,  800    -->
      
      





上記のすべての結果を次の画像に示します。



ちょうど昨日、クライアントインターフェースでオンエアテレビのチャンネルに直接切り替えを追加しました。





この投稿で、発生した質問に答え、前回の記事で舞台裏に残っていたものを明らかにしたいと思います。



参照:

CPortコンポーネント

プロジェクトファイル

グローバルキャッシュデバイスAPI PDF



All Articles