今回からしばらく、PHPについて投稿するつもりです。普通の機能については山のようにWebで見つかりますので、あまり見かけない機能?について調べてみました。
実は、SHARP の テレビ AQUOS を使っているのですが、何気なく取扱説明書を読んでみると、
「PC(パソコン)で本機を制御する」
という機能があることに気がつきました。RS-232Cコネクタ(AQUOSの記述そのまま)がついていて、シリアルラインでPCと接続できるようです。要するにリモコン機能ですね。
テレビの近くにPCがあるので、リモコンが手元見当たらない時に、PCからチャネルとか変えられると便利そうです。
早速作ってみようと思いましたが、PCにRS-232Cコネクタがありません。USBの変換ケーブルを買おうかどうか迷っていました。使えなかった場合、このケーブルの使い道がなさそうなので悩んでいました。
ところが、以前もらった古いモデムに、なんと ELECOM の UC-SGT という、USB-シリアル変換ケーブルが付いていたのです。また、RS-232Cのクロスケーブルもあったので、ハード的には準備 OK になりました。このケーブルは、シリアルポートの番号(最初は、COM17 になっていました。)が、使われていなければ自由に変えられます。
早速、試してみようと思いました。
まず、何でプログラムするかです。ケーブルが短くて、coLinux のマシンまでは届かず、Windows XP しかありません。そこで、前回 Windows にインストールした PHP にすることにしました。
ところで、PHP でシリアルポートの使い方はどうするのでしょうか。
標準には無いようなので、
PHPでシリアル通信 http://d.hatena.ne.jp/akiraneko/20080813/1218607042で紹介されている、
PHP serial extension http://thebyteworks.com/phpserial/index.htmlを、Windows 版専用ということで選びました。
ダウンロードした、php_ser_5.2.0.zip の中身は、
php_ser.dll
php_ser_reference.html
php_ser_test.php
sms_list.php
です。php_ser.dll を、PHP のフォルダ C:\Program Files\PHP\ext に、コピーすれば準備完了です。
更に C:\Program Files\PHP\php.ini に、
extension=php_ser.dll
を指定すればよいです。指定しない場合は、
dl('php_ser');
などでモジュールをロードすることになります。
用意された関数で今回は、php_ser_reference.html から、
を使うことにします。関数の順番もこのままで良さそうです。
さて、AQUOSのRS-232Cコネクタの通信仕様は、
ボーレート;9600bps データ長:8ビット パリティ:なし
ストップビット:1ビット、フロー制御:なし
これに対する、ser_open関数は、シリアルポート名を COM2 にあらかじめ指定しておいた場合、
ser_open("COM2", 9600, 8, "None", 1, "None");
となります。早速試したところ、
ser_version関数で得られる文字列が、'20061018.1 trial version'、
ser_isopen関数で得られる文字列が、'COM2 9600 8 None 1 None'
でした。
通信手順は、9バイト(最後がリターンコード 0x0D)の制御コマンドをAQUOSに送ると、OK(3バイトで最後がリターンコード)のレスポンスを受け取れます。異常があった時のレスポンスは ERR(4バイトで最後がリターンコード)です。
制御コマンドの構造ですが、前4バイトが「コマンド種類」で、後ろ4バイトが「パラメータ」で、最後1バイトがリターンコードです。
パラメータには、左詰めで数値が入ります。4桁に足りない場合は後ろに空白文字が付きます。これは、
$param = sprintf("% -4d\r",$data);
などで作ればよいです。よく使うコマンドは、
です。チャンネル指定のコマンドはアナログからデジタルへの変換もできます。例えば、消音のコマンドは、
のようにすればテレビに送れます。うまくいけば、$str に "OK\r" という文字列が得られます。コマンドの中にはパラメタを "????" にすると今の値が帰ってくるものもあります。例えば、"VOLM????\r" などです。
この続きは、次回にします。
実は、SHARP の テレビ AQUOS を使っているのですが、何気なく取扱説明書を読んでみると、
「PC(パソコン)で本機を制御する」
という機能があることに気がつきました。RS-232Cコネクタ(AQUOSの記述そのまま)がついていて、シリアルラインでPCと接続できるようです。要するにリモコン機能ですね。
テレビの近くにPCがあるので、リモコンが手元見当たらない時に、PCからチャネルとか変えられると便利そうです。
早速作ってみようと思いましたが、PCにRS-232Cコネクタがありません。USBの変換ケーブルを買おうかどうか迷っていました。使えなかった場合、このケーブルの使い道がなさそうなので悩んでいました。
ところが、以前もらった古いモデムに、なんと ELECOM の UC-SGT という、USB-シリアル変換ケーブルが付いていたのです。また、RS-232Cのクロスケーブルもあったので、ハード的には準備 OK になりました。このケーブルは、シリアルポートの番号(最初は、COM17 になっていました。)が、使われていなければ自由に変えられます。
早速、試してみようと思いました。
まず、何でプログラムするかです。ケーブルが短くて、coLinux のマシンまでは届かず、Windows XP しかありません。そこで、前回 Windows にインストールした PHP にすることにしました。
ところで、PHP でシリアルポートの使い方はどうするのでしょうか。
標準には無いようなので、
PHPでシリアル通信 http://d.hatena.ne.jp/akiraneko/20080813/1218607042で紹介されている、
PHP serial extension http://thebyteworks.com/phpserial/index.htmlを、Windows 版専用ということで選びました。
ダウンロードした、php_ser_5.2.0.zip の中身は、
php_ser.dll
php_ser_reference.html
php_ser_test.php
sms_list.php
です。php_ser.dll を、PHP のフォルダ C:\Program Files\PHP\ext に、コピーすれば準備完了です。
更に C:\Program Files\PHP\php.ini に、
extension=php_ser.dll
を指定すればよいです。指定しない場合は、
dl('php_ser');
などでモジュールをロードすることになります。
用意された関数で今回は、php_ser_reference.html から、
string ser_version( void ) void ser_open( string port, int baudrate, int databits, string parity, float stopbits, string flowcontrol ) string ser_isopen( void ) void ser_write( string data ) string ser_read( int chars_no ) void ser_close( void )
を使うことにします。関数の順番もこのままで良さそうです。
さて、AQUOSのRS-232Cコネクタの通信仕様は、
ボーレート;9600bps データ長:8ビット パリティ:なし
ストップビット:1ビット、フロー制御:なし
これに対する、ser_open関数は、シリアルポート名を COM2 にあらかじめ指定しておいた場合、
ser_open("COM2", 9600, 8, "None", 1, "None");
となります。早速試したところ、
ser_version関数で得られる文字列が、'20061018.1 trial version'、
ser_isopen関数で得られる文字列が、'COM2 9600 8 None 1 None'
でした。
通信手順は、9バイト(最後がリターンコード 0x0D)の制御コマンドをAQUOSに送ると、OK(3バイトで最後がリターンコード)のレスポンスを受け取れます。異常があった時のレスポンスは ERR(4バイトで最後がリターンコード)です。
制御コマンドの構造ですが、前4バイトが「コマンド種類」で、後ろ4バイトが「パラメータ」で、最後1バイトがリターンコードです。
パラメータには、左詰めで数値が入ります。4桁に足りない場合は後ろに空白文字が付きます。これは、
$param = sprintf("% -4d\r",$data);
などで作ればよいです。よく使うコマンドは、
POWR 0 (テレビを消す。スタンバイへ移行。パラメタが 1 で復帰。) VOLM 0~50 (音量。パラメタは音量値。) ITVD 0 (入力切り替えでテレビにする。) IAVD 1~6 (入力1から6の指定されたものに切り替える。) CAIR 1~20 (地上波アナログのチャンネル指定。) CTBD 0~999 (地上波デジタルのチャンネル指定。) MUTE 0 (消音オン、オフのトグル。)
です。チャンネル指定のコマンドはアナログからデジタルへの変換もできます。例えば、消音のコマンドは、
$command = "MUTE0 \r"; ser_write($command); sleep(1); echo "Answer\n"; $str = ser_read(128); echo "$str";
のようにすればテレビに送れます。うまくいけば、$str に "OK\r" という文字列が得られます。コマンドの中にはパラメタを "????" にすると今の値が帰ってくるものもあります。例えば、"VOLM????\r" などです。
この続きは、次回にします。
※コメント投稿者のブログIDはブログ作成者のみに通知されます