HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2018/10/31

ラズパイでエアコン対応の赤外線学習リモコンを pigpioライブラリを使って作る方法、Goodbye LIRC ラズパイでエアコン対応の赤外線学習リモコンを pigpioライブラリを使って作る方法、Goodbye LIRC

(Raspbian Stretchでエアコン対応の赤外線リモコンを動かす、ややこしい LIRCを使わないで IR機器を制御)

Tags: [Raspberry Pi], [電子工作]





● Raspberry Pi 3 Model Bを遂に購入

 Raspberry Pi3 Model B RPI2 RPI3

 大人気の CPUボードの Raspberry Piに WiFiと Bluetoothが搭載されたモデルが新発売となりました。
 以前から Raspberry Pi 2を買おうかどうか迷っていましたが、Raspberry Pi 3 Model Bの発売を機に購入を決意してラズベリアンになる事にしました。

 ※ ラズパイの OS Raspbianはバージョンが上がる毎に過去の版と OSの内部の作りが変わり、過去に書かれた製作記事(例えば Raspbian Wheezyの時代の記事)がそのままではエラーが出たりして動かない事が有ります。
 ※ 当方のホームページのラズパイ記事は全て Raspberry Pi 3 Model Bと Raspbian Jessieの組み合わせで動作確認をしております。
(ただし、将来的に新しい Raspbian OSが出た場合に、当方の Raspbian Jessieを基にした内容がそのままでは動かない可能性が有ります。)
 ※ 2017/08/16から Raspbian OSは Raspbian Jessieから Raspbian Stretchに変わりました。
 ※ 2019/06/20から Raspbian OSは Raspbian Stretchから Raspbian Busterに変わりました。

Download Raspbian for Raspberry Pi

ちなみに、歴代のバージョンと名称は
Debianコードネーム年月備考(参考)Ubuntuでの該当名称
Debian 11Bullseye2021/08/14~2021/11からラズパイにリリースFocal Fossa 20.04 LTS ?
Debian 10Buster2019/06/20~2019/06からラズパイ4対応Bionic 18.04 LTS
Debian 9Stretch2017/08/16~2018/03からラズパイ3B+対応Xenial 16.04 LTS
Debian 8Jessie2015~2016/02からラズパイ3対応Trusty 14.04 LTS
Debian 7Wheezy2013~2016
Debian 6.0Squeeze2011~2014
Debian GNU/Linux 5.0Lenny2009~2012


● Raspberry Pi3で LIRCを使わないで赤外線リモコンを送受信したい!エアコンも!

 Raspberry Piで赤外線リモコンの信号を送信や受信をするには LIRC(Linux Infrared Remote Control)を使う方法が有名ですが、設定が大変で動作も不安定な気がします。
 (不安定な原因は使う側の私の知識の無さの問題も有ると思っていますが)

 また、LIRCの致命的な所はエアコン機器には対応していません。理由はエアコン機器の赤外線制御信号のビット列が長すぎて LIRCでは扱えないからです。
  LIRCは扱える赤外線信号のビット長が 64bitまでで、実際には 48bitしか送信できないっぽいです。なぜに未だに LIRCはビット列が長い信号フォーマットに対応しないのでしょうか?
LIRC - lirc max signal length

 LIRCは以前まとめ記事にしましたが、LIRCを動かせる様になるまでには苦労しました。

2017/09/04
Raspberry Pi Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法
Raspberry Pi Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法

  ラズパイ Stretchで赤外線リモコンの制御アプリ LIRC 0.9.4cの設定方法、Ir LED

2017/09/04
Raspberry Pi Raspbian Jessie 2017-07最終版で LIRCを使って学習リモコン、赤外線リモコンを送受信する方法
Raspberry Pi Raspbian Jessie 2017-07最終版で LIRCを使って学習リモコン、赤外線リモコンを送受信する方法

  ラズパイ3 Jessieで赤外線受信センサと IR LEDで赤外線リモコン信号を送受信して家電等の外部機器を制御する方法

 「LIRCはあきらめましょう!」で早々に捨てるのが正解だったかも?と、ここにきて「あきらめる」の真意がわかった気がしました。
赤外線リモコン受信・送信~LIRCはあきらめましょう - Raspberry Pi 研究室

 スラムダンクの安西先生「あきらめたらそこで試合終了だよ」。でもね「人間、諦めが肝心」とも言いますよ。
 そもそも LIRCではエアコンの制御は無理です。

 今回はエアコンの制御を目標にしてラズパイの GPIO端子を直接いじくり倒して自前で赤外線信号の送受信を行ないたいと思います。
 当時は LIRCが有るから別に良いじゃんと思っていましたが、最近、心境の変化が有りました。

 利点としては、
 ・自前で制御するので満足感が得られる > 今回はサンプルプログラムを使いました
 ・標準ライブラリだけなのでセットアップが簡単
 ・LIRCの面倒なセットアップが不要
 ・赤外線信号のフォーマットに強くなれる
 ・LIRCが対応していないエアコン等の赤外線信号が長いものも自前制御なら頑張ればできるかも? > できました!


●エアコンの自動制御でしたい事

 標準のリモコンではタイマー設定で「運転開始」か「運転停止」のどちらか一方しかできません。
 自前でエアコンを制御できれば下記の様なシナリオの自動制御も可能です。

 夏場
 1) 就寝時刻から 2時間は運転したい(2時間後に「運転停止命令」を送信)
 2) 朝方の日の出の時間で運転したい(日の出の時刻で「運転開始命令」を送信)
 3) 出勤の手前で停止したい(出勤時間の 30分前に「運転停止命令」を送信)

 冬場
 1) 就寝時刻から 1時間は運転したい(1時間後に「運転停止命令」を送信)
 2) 朝方の寒い時刻から出勤の手前まで運転したい(早朝時刻で「運転開始命令」を送信)
 3) 出勤の手前で停止したい(出勤時間の 30分前に「運転停止命令」を送信)


●赤外線リモコンの信号フォーマット

Wikipedia - リモコン

 日本国内では大きく下記の 3タイプが有ります。
 ・NECフォーマット
 ・家製協フォーマット
 ・SONYフォーマット

 手持ちの中華製の HDMI切り換え器のリモコンは NECフォーマットでした。

 信号フォーマットの詳しい情報は下記の ChaN氏の解説記事にまとまっています。
赤外線リモコンの通信フォーマット

赤外線 LEDの波長 950nm
フォーマットタイプ周波数デューティー比単位時間(T)信号開始時のオン時間信号開始時のオフ時間信号長(フレーム長)'0'信号'1'信号
NECフォーマット38kHz1/3duty562us16T8T固定長フレーム(32bit)1:0=1T/1T1:0=1T:3T
家製協フォーマット(AEHA)38kHz1/3duty425us8T4T可変長フレーム (通常 48bit)1:0=1T:1T1:0=1T:3T
SONYフォーマット40kHz1/3duty600us4T1T7bit * n + 5/8/13bit1:0=1T:1T1:0=2T:1T
 ※ SONYフォーマット注釈:信号開始時のオフ時間を 1Tと解釈する方を採りました。(なので ChaN氏の解釈とは異なります。)

 38kHz = 1/38000 ≒ 0.0000263 = 26.3us ≒ 27us
 デューティー比 = 1/3 = オン=1:オフ=2 = オン 9us:オフ 18us

 また、エアコンに関しては下記の調査結果となりました。ダイキンだけ先頭に 6ビットの信号が付いた特殊となります。
メーカーフォーマット仕様フレーム数フレーム長(時間)irrp.pyでの送信
ダイキン家製協フォーマット
+先頭に 6bitの付加ヘッダの送信有り
2フレーム170ms+170ms不可 'chain is too long'
(分割して対応可能)
パナソニック家製協フォーマット2フレーム70ms+170ms
三菱家製協フォーマット2フレーム170ms+170ms
日立家製協フォーマット1フレーム340ms


● pigpio

 GPIOのライブラリとして Raspberry Piの Raspbian OSに標準搭載の pigpioを使用します。
 以前は Raspberry Pi用の GPIOのライブラリとしては WiringPiが有名でしたが、今後は pigpioがメインになっていくのではと思っています。

The pigpio library

WiringPi
 WiringPiは古くから Raspbian OSに標準搭載されています。

 下記の配線仕様で動かしました。
 ・GPIO 26に赤外線受光モジュールを接続
  ※ Pifi Digi TI PCM5122 DACオーディオ基板と同じ
 ・GPIO 17に Tr経由で赤外線 LEDを接続(正論理)
  ※ GPIO 18だと Raspberry Piのハードウェア PWMを使用できるのでそっちの方が良かったかも?

 赤外線信号をキャプチャする。
 キャプチャ情報は ir.vcdファイルに保存される。
 GPIO 26の時は 0x1<<26で 0x04000000となります。
 例: GPIO 17の時は 0x1<<17で 0x0200となります。
# start the pigpio daemon
sudo pigpiod

# capture GPIO 26 signal input
pigs no
pig2vcd  </dev/pigpio0 >ir.vcd &
pigs nb 0 0x04000000 # set bits for gpio 26
(適当にリモコンを操作する)
pigs nc 0
 ※ 赤外線受光モジュールは 38kHzの信号を処理してくれるので GPIOで信号を取得する時は '0'/'1'だけを意識すれば大丈夫です。
 ※ 赤外線受光モジュールは 38kHzの信号中は '1'を出力してくれます。

 キャプチャ情報の ir.vcdファイルは GTKWaveアプリで閲覧できます。vcdファイルの中身はテキストファイルとなっていて目視でも確認できます。
 GTKWaveアプリでキャプチャした波形を確認できる。
GTKWave

 .vcdファイルを開いて SSTで「top」を選択して、wireで「wire 26」をダブルクリックで選択します。
・赤外線リモコンの波形 - GTKWave .vcd file Viewer
赤外線リモコンの波形 - GTKWave .vcd file Viewer



● pigpioで直接 GPIOを制御する方法
# start the pigpio daemon
sudo pigpiod

# GPIO INPUT
pigs m 26 r
pigs r 26

# GPIO OUTPUT
pigs m 17 w
pigs w 17 1
pigs w 17 0

● Raspberry Piで赤外線リモコンの実験で動かない時の確認ポイント

2018/11/01
赤外線 LEDの点灯を目視確認する方法、Raspberry Piで赤外線リモコンアプリの実験で動かない時に
赤外線 LEDの点灯を目視確認する方法、Raspberry Piで赤外線リモコンアプリの実験で動かない時に

  赤外線リモコンの実験で動かない時の確認ポイント、赤外線 LEDの点灯を目視確認する方法

● Raspberry Pi用 Pifi Digi TI PCM5122 DACオーディオ基板

2018/04/01
Raspberry Pi専用 TI PCM5122 DACオーディオ基板でハイレゾ音源 PiFi DAC+ V2.0基板
Raspberry Pi専用 TI PCM5122 DACオーディオ基板でハイレゾ音源 PiFi DAC+ V2.0基板

  ラズパイに TI PCM5122 I2S DACモジュール基板を接続して 384kHz 32bitでハイレゾ音源を楽しむ


● pigpio IR Receiver
IR Receiver - IR Remote Example

● pigpio C code Examples
IR Receiver 2015-02-25 Function to hash a code from an IR receiver (reading an IR remote control).

● pigpio C++ code Examples
Examples of C++ pigpio programs.
IR Receiver 2015-02-22 Class to hash a code from an IR receiver (reading an IR remote control).

● pigpio Python code Examples
pigpio Python code Examples
IR Receiver 2014-06-12 Class to hash a code from an IR receiver (reading an IR remote control).
http://abyz.me.uk/rpi/pigpio/code/ir_hasher_py.zip

IR Record and Playback 2015-12-21 This script may be used to record and play back arbitrary IR codes.
http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip


 irrp.pyを動かす。

 GPIO 26 = 赤外線受信機
 GPIO 17 = 赤外線送信機 赤外線 LED(正論理)
# start the pigpio daemon
sudo pigpiod

# 学習(赤外線受信)
./irrp.py -r -g26 -fir-tv pow

# 赤外線送信
./irrp.py -p -g17 -fir-tv pow

●デューティー比が 50%なので 33%に変更する。

 50%のままでもテレビは動いた。

 2.0で割り算しているのでデューティー比が 50%となっています。
 3.0で割ればデューティー比が 33.3%になります。

 デューティー比 = 1/3 = オン=1:オフ=2 = オン 9us:オフ 18us(約 38kHz)

irrp.py
def carrier(gpio, frequency, micros):
   """
   Generate carrier square wave.
   """
   wf = []
   cycle = 1000.0 / frequency
   cycles = int(round(micros/cycle))
#   on = int(round(cycle / 2.0))
   on = int(round(cycle / 3.0))

$ python
import time
import pigpio

usleep = lambda x: time.sleep(x/1000000.0)

#==== sudo pigpiod
pi = pigpio.pi()

ir_send_gpio = 17

#==== GPIO PWM
ir_on_dutycycle = 255 * 1/3
ir_off_dutycycle = 255 * 0/3

# 38kHz
frequency = 38000
pi.set_PWM_frequency(ir_send_gpio, frequency)

# ON
pi.set_PWM_dutycycle(ir_send_gpio, ir_on_dutycycle)
usleep(1000000)

# OFF
pi.set_PWM_dutycycle(ir_send_gpio, ir_off_dutycycle)
usleep(1000000)

#==== GPIO NORMAL
pi.set_mode(ir_send_gpio, pigpio.OUTPUT)

pi.write(ir_send_gpio, 1)
pi.write(ir_send_gpio, 0)

pi.wave_clear()

wave_gen = []
# 2000000us = 2sec
wave_gen.append(pigpio.pulse(1<<ir_send_gpio, 0, 2000000))
wave_gen.append(pigpio.pulse(0, 1<<ir_send_gpio, 2000000))
wave_gen.append(pigpio.pulse(1<<ir_send_gpio, 0, 2000000))
wave_gen.append(pigpio.pulse(0, 1<<ir_send_gpio, 2000000))
pi.wave_add_generic(wave_gen)
pi.wave_chain([pi.wave_create()])

while pi.wave_tx_busy():
  time.sleep(0.002)

pi.wave_delete(wave)


●肝心のエアコンは制御できたの?

 結論:pigpioの Python codeサンプル IR Record and Playback(2015-12-21)を使い、長ビット長の赤外線命令のエアコンを制御できました。

# エアコンの「暖房」ボタンの内容を学習して ir-airconファイルに出力する
# GPIO 26に赤外線受光モジュールを接続している
# --post 600 --short 100を指定して長い赤外線命令もキャプチャできる様にする
$ ./irrp.py -r -g26 --post 600 --short 100 -fir-aircon danbou

# danbou命令をそのまま送信すると 'chain is too long'エラーになる
$ ./irrp.py -p -g17 -fir-air --gap 1 danbou
pigpio.error: 'chain is too long'

# ir-airconのテキストファイルを編集して danbou命令を 3個に分割して danbou1、danbou2、danbou3としました。(下記参照)

# エアコンの「暖房」ボタンの内容を送信する
# GPIO 17にトランジスタ駆動の正論理の Ir-LEDを接続している
# --gap 1を指定して各命令の送信間隔を 1msにしている(本来はひとカタマリなので)
$ ./irrp.py -p -g17 -fir-air --gap 1 danbou1 danbou2 danbou3

# エアコンを制御できました!!

# デューティー比は 1/2、1/3のどちらでも制御できた。
# on = int(round(cycle / 2.0))
# on = int(round(cycle / 3.0))

●エアコンの「暖房」ボタンの内容を学習して ir-airconファイルに出力する

 ダイキン エアコンの赤外線リモコンの信号波形。
・赤外線リモコンの波形 - ダイキン エアコン
赤外線リモコンの波形 - ダイキン エアコン
 赤外線信号の全長は 394.1ms程度。
 矢印の所で信号を分割した。
 "danbou"命令を "danbou1", "danbou2", "danbou3"の 3個の命令に分割する。
 (1) "danbou1" - 最初の 6bitの付加ヘッダ
 (2) "danbou2" - 第一フレーム
 (3) "danbou3" - 第二フレーム

ir-aircon
{"danbou": [442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 25178, 3487, 1723, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 34730, 3487, 1723, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442]
}
 この内容を下記の様に書き換えて "danbou"命令を "danbou1", "danbou2", "danbou3"の 3個の命令に分割する。
 (1) "danbou1" - 最初の 6bitの付加ヘッダ
 (2) "danbou2" - 第一フレーム
 (3) "danbou3" - 第二フレーム

ir-aircon
{"danbou1": [442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 25178],
 "danbou2": [3487, 1723, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 34730],
 "danbou3": [3487, 1723, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 1286, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 428, 442, 1286, 442, 428, 442, 1286, 442, 1286, 442, 1286, 442, 1286, 442, 428, 442, 1286, 442]}

●以下は、エアコンのリモコン信号の送受信の試行錯誤のメモ

 エアコンのリモコン信号の最初の部分(ヘッダ部分)のみしか学習しないのでできませんでした。
 irrp.pyの Recordの学習時の区切り検出の時間を長くして、全体をキャプチャする様に調整すれば信号の全部を取り込んでできるかも?

 irrp.pyの Recordの学習時の信号検出の時間の部分がわかりました。
 postamble msでデフォルトで 15msとなっていました。
 エアコンの信号を観察したら信号の全体の長さで 400ms程度有りました、余裕を見て 500msを設定すれば良いと思います。

 エアコン信号のキャプチャ(学習)はできましたが、-pで送信を行なうと pigpio.error: 'chain is too long'エラーが出てしまいました。エアコンの信号が長すぎて pi.wave_chain(wave)命令で処理する wave配列が大きすぎるのが原因です。

 なので、キャプチャした信号の学習ファイル(テキスト形式)を編集して、エアコンの命令を分割します。そして送信時に分割した定義を指定します。各命令の送信間隔である gapパラメータは 1msとしました。

p.add_argument("--post", help="postamble ms", type=int, default=15)
POST_MS    = args.post
    pi.set_watchdog(GPIO, POST_MS) # Start watchdog.
----
p.add_argument("--short", help="short code length", type=int, default=10)
SHORT      = args.short
   if len(code) > SHORT:
      normalise(code)
      fetching_code = False

$ ./irrp.py -r -g26 --post 500 --short 100 -fir-aircon danbou
Recording
Press key for 'danbou'
Short code, probably a repeat, try again
Okay
Press key for 'danbou' to confirm
Okay

$ ./irrp.py -p -g17 -fir-aircon danbou
Traceback (most recent call last):
  File "./irrp.py", line 487, in <module>
    pi.wave_chain(wave)
  File "/usr/lib/python2.7/dist-packages/pigpio.py", line 2475, in wave_chain
    self.sl, _PI_CMD_WVCHA, 0, 0, len(data), [data]))
  File "/usr/lib/python2.7/dist-packages/pigpio.py", line 970, in _u2i
    raise error(error_text(v))
pigpio.error: 'chain is too long'


● C言語での wiringPi、pigpiod (daemon)、pigpioの基本的な使い方、命令対応表

wiringPipigpiod (daemon)pigpio
■ コンパイル方法、実行方法
gcc -o prog prog.c -lwiringPigcc -pthread -o prog prog.c -lpigpiod_if2 -lrtgcc -Wall -pthread -o prog prog.c -lpigpio -lrt
sudo ./prog
(sudo is not required)
./progsudo ./prog
■ #include文
#include <wiringPi.h>#include <pigpiod_if2.h>#include <pigpio.h>
■ 初期化/終了処理
(wiringPiSetup() == -1)(int pi = pigpio_start() < 0)(gpioInitialise() < 0)
(無し)pigpio_stop(pi);gpioTerminate();
■ GPIO出力
pinMode(output_pin、 OUTPUT);set_mode(pi、 output_gpio、 PI_OUTPUT);gpioSetMode(output_gpio, PI_OUTPUT);
digitalWrite(output_pin, 0);gpio_write(pi, output_gpio, 0);gpioWrite(output_gpio, 0);
digitalWrite(output_pin, 1);gpio_write(pi, output_gpio, 1);gpioWrite(output_gpio, 1);
■ GPIO入力
pinMode(input_pin, INPUT);set_mode(pi, input_gpio, PI_INPUT);gpioSetMode(input_gpio, PI_INPUT);
pullUpDnControl(input_pin, pud);
int pud = PUD_OFF/ PUD_DOWN/ PUD_UP
set_pull_up_down(pi, input_gpio, pud);
unsigned pud = PI_PUD_UP/ PI_PUD_DOWN/ PI_PUD_OFF
gpioSetPullUpDown(input_gpio, pud);
unsigned pud = PI_PUD_UP/ PI_PUD_DOWN/ PI_PUD_OFF
int digitalRead(input_pin);int gpio_read(pi, input_gpio);int gpioRead(input_gpio);
■ 時間待ち命令 delay/sleep
delayMicroseconds(unsigned int howLong);double seconds = microsec / 10000000.0;
time_sleep(double seconds);
gpioDelay(uint32_t micros);
gpioSleep(unsigned timetype, int seconds, int micros);


● wiringPi、pigpiod (daemon)、pigpioの検証結果

 受信(信号キャプチャ)、送信プログラムは C言語で作成。
 ・wiringPi - エアコンも制御できた。(38kHz生成は GPIOを HLHLを頑張る)
 ・pigpiod - 何も制御できない。(38kHz生成は GPIOを HLHLを頑張る)
 ・pigpio - エアコンも制御できた。(38kHz生成は GPIOを HLHLを頑張る)
 ・pigpio - テレビは制御できた。(38kHz生成は SoftPWMでデュティー比 1/2)

 受信(信号キャプチャ)、送信プログラムは Python言語で作成。
 ・pigpioの Python codeサンプル IR Record and Playback - 工夫してエアコンも制御できた。(38kHz生成は GPIOを HLHLを頑張る)
 ・pigpioの Python codeサンプル IR Record and Playback - 何も制御できない。(38kHz生成は SoftPWMでデュティー比 1/2に書き換えた)


●赤外線リモコン関係の注意点

 使用する赤外線 LEDの品種(ピーク波長や照射角度、半減角等)や駆動電流等で制御対象の機器との信号到達距離、赤外線 LEDと機器の受光部分とのズレの許容度が変わります。
 「制御できない!」と悩んでいたら実は赤外線 LEDの照射が悪かったと言う事も有るので注意。


●各メーカーの赤外線リモコンの波形一覧

 .vcdファイルを開いて SSTで「top」を選択して、wireで「wire 26」をダブルクリックで選択します。

●赤外線リモコンの波形 - SONY テレビ
・赤外線リモコンの波形 - SONY テレビ
赤外線リモコンの波形 - SONY テレビ


・赤外線リモコンの波形 - SONY テレビ
赤外線リモコンの波形 - SONY テレビ



●赤外線リモコンの波形 - NEC テレビ
・赤外線リモコンの波形 - NEC テレビ
赤外線リモコンの波形 - NEC テレビ


・赤外線リモコンの波形 - NEC テレビ
赤外線リモコンの波形 - NEC テレビ



●赤外線リモコンの波形 - NoBrand テレビ
・赤外線リモコンの波形 - NoBrand テレビ
赤外線リモコンの波形 - NoBrand テレビ


・赤外線リモコンの波形 - NoBrand テレビ
赤外線リモコンの波形 - NoBrand テレビ



●赤外線リモコンの波形 - ダイキン エアコン
・赤外線リモコンの波形 - ダイキン エアコン
赤外線リモコンの波形 - ダイキン エアコン
 赤外線信号の全長は 394.1ms程度。

 矢印の所で信号を分割した。
 "danbou"命令を "danbou1", "danbou2", "danbou3"の 3個の命令に分割する。

・赤外線リモコンの波形 - ダイキン エアコン
赤外線リモコンの波形 - ダイキン エアコン


 ダイキンのエアコンの赤外線信号には先頭に 6ビットの信号が付いている。

・赤外線リモコンの波形 - ダイキン エアコン
赤外線リモコンの波形 - ダイキン エアコン
 先頭 6ビットから次のフレームの開始までは 25.27ms。

・赤外線リモコンの波形 - ダイキン エアコン
赤外線リモコンの波形 - ダイキン エアコン
 第一フレームの終わりから第二フレームの開始までの間は 34.4ms。

●赤外線リモコンの波形 - 日立 エアコン
・赤外線リモコンの波形 - 日立 エアコン
赤外線リモコンの波形 - 日立 エアコン


・赤外線リモコンの波形 - 日立 エアコン
赤外線リモコンの波形 - 日立 エアコン


・赤外線リモコンの波形 - 日立 エアコン
赤外線リモコンの波形 - 日立 エアコン



●赤外線リモコンの波形 - 三菱 エアコン
・赤外線リモコンの波形 - 三菱 エアコン
赤外線リモコンの波形 - 三菱 エアコン


・赤外線リモコンの波形 - 三菱 エアコン
赤外線リモコンの波形 - 三菱 エアコン


・赤外線リモコンの波形 - 三菱 エアコン
赤外線リモコンの波形 - 三菱 エアコン


・赤外線リモコンの波形 - 三菱 エアコン
赤外線リモコンの波形 - 三菱 エアコン



●赤外線リモコンの波形 - パナソニック エアコン
・赤外線リモコンの波形 - パナソニック エアコン
赤外線リモコンの波形 - パナソニック エアコン


・赤外線リモコンの波形 - パナソニック エアコン
赤外線リモコンの波形 - パナソニック エアコン


・赤外線リモコンの波形 - パナソニック エアコン
赤外線リモコンの波形 - パナソニック エアコン



●赤外線リモコンの波形 - 中華製 HDMIマトリックス切り替え器

2018/01/09
マトリックス切り替えと PIP機能付きの 4K対応の 6入力 2出力の HDMIセレクター、液晶画面 2台と使用で最強
マトリックス切り替えと PIP機能付きの 4K対応の 6入力 2出力の HDMIセレクター、液晶画面 2台と使用で最強

  マトリックス切り替えで液晶画面 2台に接続できて更にピクチャ イン ピクチャ機能付き HDMI切り換え機
・赤外線リモコンの波形 - 中華製 HDMIマトリックス切り替え器
赤外線リモコンの波形 - 中華製 HDMIマトリックス切り替え器


・赤外線リモコンの波形 - 中華製 HDMIマトリックス切り替え器
赤外線リモコンの波形 - 中華製 HDMIマトリックス切り替え器





Tags: [Raspberry Pi], [電子工作]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

Raspberry Pi Raspbian Jessie 2017-07最終版で LIRCを使って学習リモコン、赤外線リモコンを送受信する方法
Raspberry Pi Raspbian Jessie 2017-07最終版で LIRCを使って学習リモコン、赤外線リモコンを送受信する方法

  ラズパイ3 Jessieで赤外線受信センサと IR LEDで赤外線リモコン信号を送受信して家電等の外部機器を制御する方法

Raspberry Pi Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法
Raspberry Pi Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法

  ラズパイ Stretchで赤外線リモコンの制御アプリ LIRC 0.9.4cの設定方法、Ir LED

【旧版】Raspberry Pi 3 Jessieで LIRC機能を使って学習リモコン、赤外線リモコンを送受信する方法
【旧版】Raspberry Pi 3 Jessieで LIRC機能を使って学習リモコン、赤外線リモコンを送受信する方法

  ラズパイ3で赤外線受信センサと Ir LEDで赤外線リモコン信号を送受信して家電等の外部機器を制御する方法

赤外線 LEDの点灯を目視確認する方法、Raspberry Piで赤外線リモコンアプリの実験で動かない時に
赤外線 LEDの点灯を目視確認する方法、Raspberry Piで赤外線リモコンアプリの実験で動かない時に

  赤外線リモコンの実験で動かない時の確認ポイント、赤外線 LEDの点灯を目視確認する方法

Raspberry Pi専用 TI PCM5122 DACオーディオ基板でハイレゾ音源 PiFi DAC+ V2.0基板
Raspberry Pi専用 TI PCM5122 DACオーディオ基板でハイレゾ音源 PiFi DAC+ V2.0基板

  ラズパイに TI PCM5122 I2S DACモジュール基板を接続して 384kHz 32bitでハイレゾ音源を楽しむ




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2018 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_gpio_pigpio_ir_remote_control/