結論から言うと、うまくいってません。
結構いいとこまで行ってるんですけどねぇ。
ここ3か月ほどトライしては断念を繰り返している事案。とりあえず、比較的うまくいってる部分のみ載せておきます。
参考にしたのは以下のサイト。
(1) ラズパイでエアコンを操作 | うしこlog
(2) 赤外線リモコン受信・送信~LIRCはあきらめましょう | Raspberry Pi 研究室 | Feijoa.jp
(1)のサイトだけでも行けるはずですが、ちょっと不具合あって送信側プログラムは(2)を参考にしました。
なお、Raspberry Piで学習リモコンといえば”Lirc”というのを使うのが一般的ですが、我が家のRaspberry Pi B+、3ではなぜかうまく動かず(リモコン受信の段階で失敗します)。
てことで、(1)、(2)にあるような「WiringPi」を使ったプログラムでやることにしました。
まず、以下のような回路を組みます。
「赤外線受光部」と「赤外線LED」はそれぞれ端子の向きに注意してください。
赤外線受光部はArduino UNO R3互換ボードキットについてきたやつを流用、赤外線LEDを購入しました。
注文した物は10個入りで200円ほど・・・だったんですが、どう見ても10個以上入ってました。
例によって中国発送で、到着まで2週間以上かかりました。おまけで増やしてくれたんですかね?
どのみち使うのは1個なんですが。
200Ωの抵抗もArduinoキットに入ってたのを使ったんですが・・・抵抗の帯が見たことない組み合わせでして。
普通4本だと思うんですが、5本あります(上の回路図を参照)。
調べたら、そういう規格もあるんですね。知りませんでした。
カラー抵抗早見表!
これの下の方に5本帯の説明がありました。
さて、ここでリモコン受信、および送信それぞれのプログラムを上の(1)、(2)のリンクのを使って作ります。
◆ 準備
まず”wiringPi”をインストールしておきます。
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
このWiringPiは送受信ともに使うため、必ず先にインストールしておきます。
◆ リモコン受信(リモコンパターン学習)
まず(1)のリンク先にある”ReadInfraredData.c”をダウンロードします。
これをRaspberry Piに送って、次のようにコンパイルします。
sudo gcc ReadInfraredData.c -o ReadInfraredData -lwiringPi
”ReadInfraredData”という実行ファイルができます。
コンパイルが終わったら、学習させたいリモコンを用意し、以下のようにこの実行ファイルを実行します。
sudo ReadInfraredData ir_data.txt
この状態で、リモコン受光部に向かってボタンを押します。
信号を送ったら、Ctrl+Cで停止。
これで”ir_data.txt”という名前のファイルができてるはずです。
中身はこんな感じ。
光る時間、空白時間の順に数値が並んでいるようです。
私はエアコンのリモコンに使いたかったので、エアコンの信号を送信。
300行くらいのとんでもなく長い信号になってましたね。エアコンのリモコンって家電の中で最も複雑だと聞いてましたが、結構な量のようです。
冷房のオン、オフの2種類を作って、それぞれ”cool_on.txt”、”cool_off.txt”という名前で保存。
◆ リモコン送信
今度は送信です。
(1)の”SendInfraredData.c”を使えばいいところなんでしょうが、私が使った限りではなぜか上の”cool_on.txt”、”cool_off.txt”の中身を消されてしまうため、(2)リンクの中ほどにある”赤外線送信プログラム”を使いました。
上のコードをコピペして”SendInfraredData.c”という名前で保存。以下のようにコンパイル。
sudo gcc SendInfraredData.c -o SendInfraredData -lwiringPi
”SendInfraredData”という実行ファイルができます。
先の学習パターンを使って送信するには
sudo SendInfraredData cool_on.txt
とやれば送信
・・・されるはずなんですが、これがうまくいきません。
ちょっと調べたんですけど、この赤外線LEDって真上方向に±15°の範囲しか照射できないらしいです。この範囲内にエアコンの受光部が入るように向けないとだめだそうで。
また出力が小さすぎるようなので、1mくらいまで近づいてやってみたんですが。
向きや距離にかかわらず、反応してくれません。
デジカメを介してこの赤外線LEDを見てみると、確かに紫色に光って入るんですけどね。
赤外線LEDを通常のLEDに変えてみると、ちゃんと光ってくれてます。
LEDがダメなのかと思ってLEDを変えてみたんですけど、やっぱりだめ。
結局、送信でつまづいて断念してます。
もしかして、増幅しないとだめなんでしょうか?
LEDの信号強さなどはさっぱりわからないため、この先どうすればいいのかがわかりません。困ったものですねぇ。
ところで、Raspberry Piで学習リモコンなんか作って何をしようとしたのかといえば、実は”自動エアコンタイマー”を作ろうかと思ってまして。
真冬の朝だと寒くてたまらないので、できれば朝になったら勝手にエアコンがついててくれるようにできないかなぁと思ったわけでして。
まあそれくらいならエアコンについてるタイマーでも可能。
ところが、春先にかけて気温が上がってくると、エアコンをつけなくてもOKなんですが。
今年は突然寒くなったりそうでもなかったりと、寒暖差が大きいときがありました。
こんなとき、設定した気温より低いときだけエアコンをオンしてくれるとありがたいなぁなんて考えたわけで。
そこでRaspberry Piを学習リモコンにして、温度センサーを組み合わせて時刻・設定温度で自動的にエアコンを入れる入れないを判断してくれる仕組みを作ろうとした次第です。
そのための温度センサーも購入済み。
地震計の時に使った”LM75B”ではなく、DHT11というセンサーを用意してました。
このDHT11、温度だけではなく湿度も測定可能。
以下のリンクを参考に、これを使えるようにしました。
温湿度センサDHT11をRaspberryPiに接続しグラフ表示
センサーの3本のピンのうち、”+”と書かれた端子を1番ピン(3.3V)に、”-”の端子を6番ピン(GND)に挿し、真ん中のピンを7番ピンに挿しておきます。
まずドライバをインストール。
sudo git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install
以下のコードを”dht11.py”として保存。
import sys
import time
import Adafruit_DHT
# Parse command line parameters.
sensor = 11
pin = 4
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
print 'Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature, humidity)
time.sleep(1)
これを実行すると、温度と湿度が返されてきます。
安いながら(500円程度)もなかなか正確なセンサーで、4度ずれちゃうLM75Bよりは使いやすいセンサー。
ただ地震計で使わなかったのは、ちょっと処理が重すぎなため。Raspberry Pi B+だと30秒くらいかかることもあります。温度と湿度を両方読んでるからでしょうかね?
冷房、暖房のオンオフ用のリモコンパターンを学習させて、Web上で設定(冷房・暖房オンの気温、時刻)できるようにし、できればWeb経由で手動にてエアコンのオンオフもできるようにしちゃおうか・・・と思ってたんですけど、最初の段階でつまづいてしまいましたねぇ。
まだあきらめきれないので、もうちょっと頑張ってみようかと。うまくいったら、その時はまた公開いたします。
最近のコメント