Raspberry Piで学習リモコン作ろうとしたんですが
結論から言うと、うまくいってません。
結構いいとこまで行ってるんですけどねぇ。
ここ3か月ほどトライしては断念を繰り返している事案。とりあえず、比較的うまくいってる部分のみ載せておきます。
参考にしたのは以下のサイト。
(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経由で手動にてエアコンのオンオフもできるようにしちゃおうか・・・と思ってたんですけど、最初の段階でつまづいてしまいましたねぇ。
まだあきらめきれないので、もうちょっと頑張ってみようかと。うまくいったら、その時はまた公開いたします。
« キングファイル風クッション”寝具(シング)ファイル”が当たる!キャンペーン実施中 | トップページ | 月額298円で200kbps無制限の「神プラン」 »
「Raspberry Pi・Arduino・電子工作」カテゴリの記事
- 名古屋 大須へ行ってきました(2024.04.28)
- Raspberry Pi 5用電源購入(2024.04.19)
- Interface 2024年5月号はRaspberry Pi 5特集(2024.03.26)
- Raspberry Pi 5とPCがつながらなかった理由は「プライバシーセパレーター機能」のせいでした(2024.03.12)
- Raspberry Pi 5に日本語LLM(ELYZA-Japanese-Llama-2-7b-fast-Instruct)を入れてみた(2024.03.10)
コメント
« キングファイル風クッション”寝具(シング)ファイル”が当たる!キャンペーン実施中 | トップページ | 月額298円で200kbps無制限の「神プラン」 »
参考サイトの2つ目にはトランジスタを
使ってますから、増幅した方が良いですね。
多分、トランジスタの知識が無いのでしょうから
少しラズパイを置いといて、電子工作のサイトを
みると目からウロコな発見もあるかもです。
あとは、その安いLEDの出力が低いとか。
参考サイトの1つ目のものは詳細はわかりませんが
出力がソコソコあるのかもと思いました。
投稿: mokekyo | 2016年5月16日 (月) 16時00分
リモコン送信時にcool_on.txt、cool_off.txtの中身が消えるのは、
SendInfraredData.c内でファイルを開くとき、書き込み専用になっているからだと思います。
if((fp = fopen(fileName, "w")) == NULL){
の部分を
if((fp = fopen(fileName, "r")) == NULL){
に変えれば読み込み専用になるので、cool_on.txt、cool_off.txtの中身が消されることは無くなると思います。
投稿: sige | 2016年5月17日 (火) 06時10分
こんにちは、sigeさん。
なるほど、そんなところに消えるわけがあったんですね。ありがとうございます。コードを直してみます。ちゃんと解読しないといけませんね。
投稿: arkouji | 2016年5月17日 (火) 21時15分
初めまして。自分もエアコン制御をraspberrypiで作ろうとしているものです。
もう解決しているかもしれませんが、コメントさせていただきます。
信号が届かない理由として信号強度が足りていないのが一番なので、トランジスタを使うのがいいと思います。
自分も電子回路知識皆無ですが現在送信できるようになってます。
ご要望あれば現在の回路状況を写メして送りますよ(回路図書けないので・・・)
あと、どっかで書いてあったんですが、どうもraspberrypiのpinの出力はかなり弱いらしく、1メートルでも遠いくらいです。
10センチ以内とかじゃないと反応しないかと・・・
あと、赤外線LEDに被せる拡散させるカバーというのもあり、これをつけると角度の幅が広がりますので、ぜひ試してみてください。
ちなみに、自分は送受信環境をすべてIRでやってるんですがこういうやり方もあるんですね。
参考になります!
投稿: ミケ猫 | 2017年1月 4日 (水) 18時13分
こんにちは、ミケ猫さん。
解決には至らないものの、この3ヶ月後にトラ技のApple Piを入手、これについてるリモコン機能のおかげで一応Raspberry Piでリモコン送信機能を実装済みです。
やはりトランジスタ、いるんですよね…ちゃんと電子回路の勉強しないといけませんね。こういう時に弱いです。お心遣いありがとうございます。
投稿: arkouji | 2017年1月 4日 (水) 19時02分