Windows PCにUSB接続した赤外線リモコン(ADVANCE)をラズパイから制御してみます。ADVANCEについて
ラズパイに接続した赤外線リモコンの場合はこちら
ADVANCEと専用学習リモコン基板ではデータのフォーマットが異なります。互換性を持たせることができるか、要調査
ラズパイ側でコマンドを作って送信、Windows側で赤外線リモコンを使ってもらいます。
音声認識でコマンドを作る場合JuliusとGoogle Assistantの連携
今回はコマンドを作成した後工程です。
ADVANCEをコントロールするアプリのソースコード(C#)が公開されています。
このページの「ライブラリ使用サンプル」からダウンロードできます。
これを改変して、ラズパイからの信号でいろいろやってもらいます。
C#アプリからラズパイと通信するサービスアプリを起動させ、このアプリ(インターフェース)とはリダイレクトによってコマンドを送ります(C#とPythonでsocket通信するより簡単)。
ラズパイ->インターフェース->家電制御、という流れです。
サービスアプリはC#アプリから別プロセスで起動し、標準入出力でコミュニケーションします。
C#のハンドリングはVisual Studio 2017 Communityが手軽(無料だし)。
サンプルからソースの余計(?)な部分を削ってこんなGUIにしてみました。
エアコン暖房とある部分はラズパイからのコマンドの種類で変えます。
標準入力の部分のみ抜粋
【C#側】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
using System.Diagnostics; using System.Threading; Process process_py = null; //開始 public void StartProcPyson(int numThreads) { if (process_py != null) return; Thread t = new Thread(new ParameterizedThreadStart(ProcPyson)); t.Start(numThreads); t.IsBackground = true; } public void ProcPyson(Object obj) { int numThreads = (int)obj; string cmdpara = @" " + numThreads;//必要なら設定 process_py = new Process(); process_py.StartInfo.FileName = @"gui_waiting.exe";//サービスアプリ起動 process_py.StartInfo.Arguments = cmdpara; process_py.StartInfo.CreateNoWindow = false; process_py.StartInfo.UseShellExecute = false; process_py.StartInfo.RedirectStandardInput = true; process_py.StartInfo.RedirectStandardOutput = true; process_py.StartInfo.RedirectStandardError = true; process_py.OutputDataReceived += Message_Receive; process_py.ErrorDataReceived += PrintErrorData; process_py.Start(); process_py.BeginOutputReadLine(); process_py.BeginErrorReadLine(); process_py.WaitForExit(); process_py = null; } //終了 public void StopProcPyson() { process_py.StandardInput.WriteLine(""); process_py.StandardInput.Close(); process_py.CloseMainWindow(); } // Pythonアプリからデータを受け取る void Message_Receive(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { string str = e.Data; //以下はBitTradeOneのサンプルアプリを参照して適当に改変 txtbx_byte_data.Text = str;//Pythonから送られたデータセット send_ex_byte();//赤外線発信処理、BitTradeOneのサンプルアプリで信号送出コード参照 } } void PrintErrorData(object sender, DataReceivedEventArgs e) { // Process p = (Process)sender; if (!string.IsNullOrEmpty(e.Data)) { Console.Error.WriteLine("[{0};stderr] {1}", p.ProcessName, e.Data); } } //アプリ終了時処理 private void Form1_FormClosing_1(object sender, FormClosingEventArgs e) { StopProcPyson(); MessageBox.Show("END", "Info", MessageBoxButtons.OK, MessageBoxIcon.Error); } |
【Python側】
pyinstallerで実行形式にしておきます(GUIでコードを送るサンプル)
XXXは赤外線コード
ラズパイからコマンドをおくる場合もここ参照
[gui_waiting.py]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/usr/bin/env python # -*- coding: utf8 -*- import sys import tkinter import threading root = tkinter.Tk() root.title(u"Software Title") root.geometry("400x300") def standard_out(event): #ADVANCEの赤外線コード data_txt = "<span style="color: #ff0000;">XXX</span>"; #flushしておきます print(data_txt,flush=True) #ボタン Button = tkinter.Button(text=u'ボタンです', width=50) Button.bind("<Button-1>",standard_out) #クリック(<Button-1>)すると,standard_out関数を呼び出すようにバインド Button.pack() |
サンプル
USB_IR_Advanceをダウンロード
● gui_waiting4.exe <- 本来はインターフェースの部分
● USB_IR_Advance.exe <- 制御用アプリ
● USB_IR_Library.dll <- Bit Trade Oneご提供のライブラリー
● 赤外線コードサンプル.txt <- 参考コード(我が家のシャープ製エアコンのコード、汎用性なし)
音声認識の部分の代わりに手動で制御してみます。
動作確認環境:Windows 10 (64bit)
ADVANCEをUSB接続しておきます。
赤外線コードの取得はここ参照
USB_IR_Advance.exe をダブルクリックで起動。同時にgui_waiting4.exeがサブプロセスで起動します。
赤外線コードを送信するのはこのウインドウです。
① 取得した赤外線コードをコピー・ペースト
② 適当に動作の名前を付けます
③ コードを送ります
ADVANCEに赤外線コードを送って、エアコンを制御
Windowsをホームサーバーにする
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(1)
WindowsでWebブラウジング
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(2)
Windowsに接続しているサーマルプリンターでメッセージを印刷(プリントサーバー)
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(3)
Windowsに保存した音源やビデオ再生、ストリーミング(メディアサーバー)
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(4)
Windowsに接続した学習リモコンで家電制御(リモコンサーバー)
それぞれのWindowsなどの端末にメッセージを同時配信
Leave a Reply