(2015-12-4)別ページにネット経由で操作できる赤外線リモコンの作例を追加しました。
(2014-10-23)本ページのシステムをRaspberry Piでリニューアルしました。
携帯からインターネット経由で赤外線命令を発行して既設エアコンを操作(Raspberry Pi活用編)
(2013-7-21)本ページでは市販の学習リモコンを強引に外部から操作、このページでは有線リモコンを乗っ取って強引に外部から操作しているわけですが、新たにWake on LAN非対応のPCを強引にリモートから起動するという作例が加わりました。(2016-3-15)強引シリーズに新ネタが加わりました。自動化非対応の機器を高機能なUSB接続ステータスLEDリーダーを接続することで自動化する例です。
(2011-10-13)同等の市販品へのリンクを追加しました。
まず断っておきますが、本ページで紹介するシステムは、
画像をクリックすると大きな画像で表示されます。
このようにリモコンのONとOFFのボタンが別々となっている機器を前提としています。幸いなことに最近のエアコンの大半はこのような仕様になっているようです。電源のONとOFFがトグルボタンになっているエアコンの場合はこのページのようなフィードバック制御を独自に追加するか、HA端子を利用する必要があります。
私はこことかここでHA端子の利用について触れていますが、最近主流の(フィードバック制御の要らない)ONとOFFのボタンが別々になっているエアコンの場合には、HA端子を利用するよりも、本ページのように赤外線を介してリモート操作するシステムの方が適している(リーズナブルにシステム構築できる)と思います。
(2011-10-13追記)同等の市販品
リーズナブルな価格の市販品がありました。
Amazon.co.jp クールテクノロジーズ HMS-350Y/RM スマートゲートキット(赤外線リモコン)
目的をペットの遠隔みまもりに特化させてHMS-350Y/RMを販売しているサイト
全景
画像をクリックすると大きな画像で表示されます。
今回は一から製作したわけではなく、前のシステムを流用しました。
元々作っていたものを流用したものだし、前のシステムも今回のシステムも見栄えを気にしなくていい環境だったので、大袈裟な外見になっています。
全体のシステム構成もこちらとほぼ同じです。違いはこの写真やこの写真に写っているとおりです。
対象のエアコンと同じ部屋に追加設置するもの(赤外線命令発射装置)
画像をクリックすると大きな画像で表示されます。
中央にエアコンの赤外線命令を学習させた市販の学習リモコン ソニー・RM-VL501を殻割りして取り出した基板を取り付けてあり、赤外線は真上に発射されます。RM-VL501の基板にはワニ口クリップを取り付けるという原始的な方法をとっています。基板の反対側には絶縁のシートを挟んでいます。赤外線命令の発射の方法は、ある一定時間(現在は0.4秒間)リレーで短絡するという方法です。手でボタンを押す操作をエミュレートしているわけです。ちなみに0.4秒間というのは以前のシステムでの時間をそのままにしている為で、実際にはもっと短い時間でも大丈夫だと思います。0.4秒間というのは多少長すぎると思いますが、赤外線命令が2回発射されてしまうまでには至っていません。
RM-VL501には補助基板(左側を占める大きな基板)から出ている5Vをさらに降圧して作成した(ちょっと高すぎですが)3.3Vを供給しています。
PICNICのファームウェアは以前のままです。また補助基板のハードも変更なしです。変更したのは補助基板上のマイコン(PIC16F84A)のファームウェアとwebサーバーのラッパーcgiのソースです。以前のシステムでの状態はこちらを参照下さい。
赤外線命令の発行は市販の学習リモコンを利用
画像をクリックすると大きな画像で表示されます。
エアコン用の学習リモコンを作るのは面倒だと思ったので、赤外線命令を発行する機能については手持ちの市販品の学習リモコンを利用することにしました。7年前に購入して殆ど遊んでいたソニーのRM-VL501です。
この方法は見た目には洗練されていませんが、製作に関する敷居を下げるという意味ではとても良い方法だと思います。この方法を採ったからこそ皆さんにこのシステムを紹介しようという気持ちが起ころうというものです。
さてRM-VL501は既にディスコンです。同様にシステムを構築したいと思われる方は安くて機能を満たせる他の学習リモコンを見つけたいと思われることでしょう。しかし現在のエアコンの赤外線命令は非常に長いので、あまり安物の学習リモコンだと利用できないかもしれません。ちなみに市場最廉価クラスのRC23BKは利用できません。
もちろん純正リモコンを補修部品として追加購入して利用してもいいかと思います。純正リモコンの基板に導電性接着剤でリード線を取り付けるというのが市販のリモコンを利用する方法の中では最も信頼性を高められるやり方だと思います。逆に学習リモコンを利用した場合のメリットとしては、「ワニ口クリップで挟みやすい場所にあるボタン」を好きなように選べることだと思います。
(2011-10-13追記)
数社からエアコン用の汎用リモコンが販売されているようです。それらを用いた方がずっと安く済みます。
たとえば、
Amazon.co.jp オーム電機 OAR-10R エアコン汎用リモコン
ネットワーク接続機能にはPICNICを利用
前のシステムから殆どを受け継いでいるのでネットワーク接続機能には引き続きPICNIC Ver.2を利用しています。
PICNICの他にもネットワーク経由でCMOSレベルのポートのHigh, Lowを制御できる組み込みボードはいくつかありますから、それを利用してもいいと思います。その選択にはこちらを参考にして頂けると思います。
補助基板
補助基板(この写真の左側の多くを占める大きな基板)はこのシステム用の流用ですのでこちらの回路図を見て下さい。見ればわかると思いますが、今回のシステムでは使用していない部分も多いです。
回路図上のエアコンA用のリレーに「冷房」ボタンを挟んだ緑のワニ口クリップを、エアコンB用のリレーに「停止」ボタンを挟んだ白のワニ口クリップを接続しています。今回のシステムではフィードバック制御がありませんからフォトトランジスタTPS615を用いた部分は未使用です。
「PICNICを手元で操作できるスイッチ」は一応そのまま使っていますが、標準添付のリモコンがすぐ側にあるわけで、今回のシステムとしては別に必須ではないと思います。
本当はリレーを1個追加して「暖房」ボタンも設けたかったですが、面倒なのでやめました。冬も使うならワニ口クリップの位置を隣のボタン上に移動させて対応することになりそうです。既に隣のボタンは暖房の赤外線命令を学習済みです。
システムの作り方(設計方針)によってはこの補助基板はリレー作動回路だけのシンプルなものにすることが可能な筈です。こちらに説明を載せています。
携帯画面(PICNICのWeb画面をラップしたもの)
この画面のCGIサーバは現在、「DD-WRT+optware」で構築しています。以前はCFリードオンリー運用のx86 Linuxでした。(2013-3-19追記)
*使用していないポートを操作するボタンは消しています。必要が生じればまた戻すでしょう。
画像をクリックすると大きな画像で表示されます。
実際にはこのキャプチャー画像はLAN内のパソコンからアクセスした際のものです。携帯からアクセスした場合は1行目の文字とQRコードは表示しません。(参考:以前のシステムでの携帯画面)
「冷房」ボタンといっても、単に冷房をオンにするだけではありません。現在のエアコンの赤外線命令は同時に温度、風速、風向きの情報を含んでいます。つまり、学習リモコンに赤外線命令を学習させる際には温度、風速、風向きをきっちりと決定しておく必要があります。
補助基板のファームウェア
MPASM用
ダウンロード internet-ir-aircon.asm
このページのファームウェアの改造板です。元々が初めて私が作ったPICプログラムなので、使用している構文が少なくて逆に読みやすいかと思います。
このプログラムでやっていることは、入力ポートがLowからHigh、もしくはHighからLowに変化した際に一定時間(約0.4秒間)リレーを閉状態にすることだけです。下にも書いていますが、この程度の簡単な処理はPICNICのファームウェアに組み込んでしまって、補助基板側のマイコンを廃することも十分可能な筈です。
携帯画面(PICNICのラッパーcgi)のソース
ダウンロード stateful-to-stateless_onoff.cgi.zip
このページのcgiプログラムの改造板です。
ステートフルな(ON・OFFの区別がある)PICNICのインターフェースをステートレスに変換する機能を追加しています。
具体的な仕組みとしては、ユーザからは「どのポートを操作(更新)したいか」だけを受付け、更新する瞬間にPICNICから最新のステータスを自動的に取得し、瞬時にその反対のステート(HighもしくはLow)で更新をおこなう仕様となっています。
もちろんPICNICのファームウェアを変更し、PICNIC自体をステートレスに改造するやり方もあるのですが、今回は既にある補助基板をそのまま生かす形式を選択しました。
PICNIC以外にもネットワーク経由でステートフルにON・OFFする(High, Lowを切り替える)組み込み基板はいくつか(沢山)あります。その中には最初から完成品の形式で販売されていてカスタマイズが難しいものがあります。今回採った方法はそのような場合にも応用可能だと思います。
ちなみにPICNIC自体をステートレスに改造した場合はリレー動作用のパルスもPICNICで発生させることになります。そうすると、手元で操作するスイッチも要らないとすると補助基板にマイコンは必要なくなり、リレーを動作させる回路だけあればいいことになります。またこの改造をおこなうと同時にPICNIC内蔵のwebサーバの改造も必須となり、結果的にラッパーcgiサーバを省くことも十分可能となります。今回の私は元々あった補助基板と一体になった大きな操作盤をそのまま生かしましたが、一から構築する方はPICNIC自体の改造にチャレンジなさってもいいかと思います。新PICNICの方なら改造もし易いと思います。
設定室温に達すると冷房をつけた上で携帯電話にメールを送信するPerlスクリプト
ごく簡単なものですが十分役に立つものです。仕様はご自分の状況に合わせて適宜変更して頂きたいですが、たとえば室内犬が熱中症になるのを防ぐとか自宅サーバの故障を防ぐ用途なんかだと殆どそのまま使えるのではないかと思います。
このPerlスクリプトを動かすサーバはPICNICと同一ネットワーク上にある必要はありません。設定によってはインターネット越しも可能です。
- (最近は対応していないと使い物になりませんから、当然)SMTP認証に対応しています。
- PICNIC(もしくはそれに類するもの)にアクセス可能な常時稼動のサーバにcron登録しておくべきものです。
- 一般ユーザ権限でOKです。
- 当該のサーバに一般的なメール関係の環境構築の必要はありません。
- やるべきことは必要なPerlパッケージのインストールとcron登録だけです。
ダウンロード check_and_warning_sendmail.pl
#!/usr/bin/perl
# このスクリプトはEUC-JPで保存されている必要があります。
# Debian, Ubuntu系の場合の追加インストールが必要なパッケージ # libnet-smtpauth-perl libjcode-pm-perl libwww-perl
use Net::SMTP_auth; use Jcode; use Encode; use LWP::Simple;
$smtpserver = 'smtp.hoge.ne.jp:587'; # SMTP認証でアクセスするサーバ $smtpacount = 'fugafuga@hoge.ne.jp'; # SMTP認証用のアカウント $smtppasswd = 'SECRET'; # SMTP認証用のパスワード $myrealmailaddress = 'fugafuga@hoge.ne.jp'; # 自分の本当のメールアドレス $tomailaddress1 = 'foobar@docomo.ne.jp'; # 宛先アドレス $tomailaddress2 = 'foobar@hoge.ne.jp'; # 宛先アドレス $bccmailaddress = $smtpacount; $fromaddress = 'remotecontroleradmin@dummy.com'; # 宛先側で個別の受信設定をおこな # えば実在しないアドレスも可 $remoteaddress="192.168.1.9"; # PICNICのアドレス $limittemp = 34; # メールを送信し始める室温(摂氏)
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $nowdate = sprintf("%d年%d月%d日 %d時%d分%d秒", $year + 1900, $mon +1, $mday, $hour, $min, $sec);
$html = get ("http://$remoteaddress/");
if ( $html eq '' ) { &make_smtp_error_msg(); mailsend(); exit; }
# 室温 $html =~ />(\d+) Celsius</; $Celcius=$1;
$port='RB4'; # RB4(冷房ボタン用ポート)の現在値の反対 $opposite_level=&get_opposite_level($port);
if ( $Celcius >= $limittemp ) {
$html = get ("http://$remoteaddress/modify.cgi\?$port=$opposite_level");
if ( $html eq '' ) { &make_smtp_error_msg(); mailsend(); exit; }
$Subject="室温が$Celcius度です。冷房をつけました。"; $Body="$nowdate\n室温は現在$Celcius度です。\nたった今、冷房をつけました。"; mailsend(); }
sub mailsend { $smtp = Net::SMTP_auth->new("$smtpserver"); $smtp->auth('CRAM-MD5', "$smtpacount", "$smtppasswd");
$smtp->mail("$myrealmailaddress"); $smtp->to("$tomailaddress1","$tomailaddress2"); $smtp->bcc("$bccmailaddress");
&Jcode::convert($Subject, 'jis', 'euc'); &Jcode::convert($Body, 'jis', 'euc');
$smtp->data(); $smtp->datasend("From:$fromaddress\n"); $smtp->datasend("To:$tomailaddress1\n"); $smtp->datasend("To:$tomailaddress2\n"); $smtp->datasend("Subject:".encode('MIME-Header-ISO_2022_JP', $Subject)."\n"); $smtp->datasend($Body); $smtp->dataend(); $smtp->quit;
return; }
sub get_opposite_level { $word = @_[0]; $htmlw = $html; $htmlw =~ /$word([^ ]+) ([^ ]+) ([^ ]+).*</; $ret = $3; $ret =~ s/High/L/; $ret =~ s/Low/H/; return $ret; }
sub make_smtp_error_msg { $Subject="コントローラにアクセスできません。"; $Body="$nowdate\nコントローラにアクセスできません。\n電源等を確認して下さい。"; }