質問: 状況 -- RaspberryPi 3B+を赤外線リモコンとして,照明の操作などに使用していました. あるとき,更新に失敗して3B+が起動しなくなってしまったため,OSを入れ直しました. すると,それまで正常に操作できていた赤外線による操作ができなくなってしまいました. 信号が正常に送信できないようですが,どのような原因が考えられるでしょうか? 設定 -- Raspberry Pi 3B+ debian_version: 10.10 python: 3.7.3 pigpio: 1.78 送信部: 赤外線LEDをトランジスタで制御,電源には乾電池を使用(3V) 受信部: 赤外線受信モジュールOSRB38C9AAを使用 プログラム: irrp.pyを改変せずに使用 リモコン: Panasonic HK9478 ``` $ vcgencmd measure_temp temp=54.8'C $ vcgencmd get_config arm_freq arm_freq=1400 $ vcgencmd measure_volts volt=1.3688V // 連続で入力すると1.2688V/1.3688Vがころころ変わる,1.2Vより高い $ vcgencmd get_config over_voltage over_voltage=0 // 電圧の設定なし ``` キーボード,マウスなどは取り外し,wifiからssh接続しました. SDカードではなくusbで接続したSSDにOSを搭載しています. 生じている問題 ------- 赤外線で信号を送信すると,on/offそれぞれの時間が2倍に伸びてしまう. 具体的な状況 ------ 手元にRaspberry Pi zeroもあったので,送信={リモコン,3B+,zero},受信={3B+,zero}の組み合わせを試すことにしました. すると3B+で信号を送信した場合,信号が倍に伸びてしまっていました. なお,zeroで照明を操作することはできましたが,用途の都合上3B+で扱いたいです. --- ``` // リモコンで信号を送信 (リモコンのボタンを押す) ``` ``` // リモコンで送信した信号を3B+で受信 $ python irrp.py -g 5 -f org_3b light:off -r $ cat org_3b {"light:off": [3466, 1732, 440, 433, 440, 433, 440, 1298, 440, 1298, 440, 433, 440, 1298, 440, 433, 440, 433, 440, 433, 440, 1298, 440, 433, 440, 433, 440, 1298, 440, 433, 440, 1298, 440, 433, 440, 1298, 440, 433, 440, 433, 440, 1298, 440, 433, 440, 433, 440, 433, 440, 433, 440, 1298, 440, 1298, 440, 1298, 440, 1298, 440, 433, 440, 1298, 440, 433, 440, 433, 440, 433, 440, 1298, 440, 1298, 440, 433, 440, 433, 440, 1298, 440, 433, 440, 433, 440]} ``` ``` // リモコンで送信した信号をzeroで受信 $ python irrp.py -g 17 -f org_0 light:off -r $ cat org_0 {"light:off": [3482, 1718, 441, 441, 441, 441, 441, 1286, 441, 1286, 441, 441, 441, 1286, 441, 441, 441, 441, 441, 441, 441, 1286, 441, 441, 441, 441, 441, 1286, 441, 441, 441, 1286, 441, 441, 441, 1286, 441, 441, 441, 441, 441, 1286, 441, 441, 441, 441, 441, 441, 441, 441, 441, 1286, 441, 1286, 441, 1286, 441, 1286, 441, 441, 441, 1286, 441, 441, 441, 441, 441, 441, 441, 1286, 441, 1286, 441, 441, 441, 441, 441, 1286, 441, 441, 441, 441, 441]} ``` --- ``` // 3B+で信号を送信 $ python irrp.py -g 17 -f org_3b light:off -p ``` ``` // 3B+で送信した信号を3B+で受信 // --no-confirmなしでは一致せず,--postなしでは途中で打ち切られる $ python irrp.py -g 5 -f 3b_3b light:off -r --post 100 --no-confirm $ cat 3b_3b {"light:off": [6685, 3816, 560, 1229, 560, 1229, 560, 2872, 560, 2872, 730, 1229, 560, 2872, 560, 1229, 560, 1053, 730, 1053, 730, 2872, 730, 1229, 560, 1229, 481, 2872, 560, 1229, 560, 2872, 560, 1229, 560, 2872, 730, 1229, 560, 1229, 560, 2872, 560, 1229, 560, 1229, 560, 1229, 560, 1053, 730, 2872, 560, 2872, 730, 2872, 560, 2872, 730, 1053, 730, 2872, 730, 1229, 560, 1229, 560, 1229, 560, 2872, 730, 2872, 560, 1053, 730, 1229, 560, 2872, 560, 1053, 730, 1229, 560]} ``` ``` // 3B+で送信した信号をzeroで受信 $ python irrp.py -g 17 -f 3b_0 light:off -r $ cat 3b_0 {"light:off": [7012, 3490, 901, 873, 901, 873, 901, 2618, 901, 2618, 901, 873, 901, 2618, 901, 873, 901, 873, 901, 873, 901, 2618, 901, 873, 901, 873, 901, 2618, 901, 873, 901, 2618, 901, 873, 901, 2618, 901, 873, 901, 873, 901, 2618, 901, 873, 901, 873, 901, 873, 901, 873, 901, 2618, 901, 2618, 901, 2618, 901, 2618, 901, 873, 901, 2618, 901, 873, 901, 873, 901, 873, 901, 2618, 901, 2618, 901, 873, 901, 873, 901, 2618, 901, 873, 901, 873, 901]} ``` --- ``` // zeroで信号を送信 $ python irrp.py -g 26 -f org_0 light:off -p ``` ``` // zeroで送信した信号を3B+で受信 $ python irrp.py -g 5 -f 0_3b light:off -r $ cat 0_3b {"light:off": [3478, 1713, 433, 465, 433, 465, 433, 1286, 433, 1286, 433, 465, 433, 1286, 433, 465, 433, 465, 433, 465, 433, 1286, 433, 465, 433, 465, 433, 1286, 433, 465, 433, 1286, 433, 465, 433, 1286, 433, 465, 433, 465, 433, 1286, 433, 465, 433, 465, 433, 465, 433, 465, 433, 1286, 433, 1286, 433, 1286, 433, 1286, 433, 465, 433, 1286, 433, 465, 433, 465, 433, 465, 433, 1286, 433, 1286, 433, 465, 433, 465, 433, 1286, 433, 465, 433, 465, 433]} ``` ``` // zeroで送信した信号をzeroで受信 $ python irrp.py -g 17 -f 0_0 light:off -r $ cat 0_0 {"light:off": [3420, 1770, 393, 495, 393, 495, 393, 1340, 393, 1340, 393, 495, 393, 1340, 393, 495, 393, 495, 393, 495, 393, 1340, 393, 495, 393, 495, 393, 1340, 393, 495, 393, 1340, 393, 495, 393, 1340, 393, 495, 393, 495, 393, 1340, 393, 495, 393, 495, 393, 495, 393, 495, 393, 1340, 393, 1340, 393, 1340, 393, 1340, 393, 495, 393, 1340, 393, 495, 393, 495, 393, 495, 393, 1340, 393, 1340, 393, 495, 393, 495, 393, 1340, 393, 495, 393, 495, 393]} ``` --- また,3B+が送信して倍になった信号を更に3B+で送信した結果が次の通りです. 受信した結果はさらに倍となっていました. ``` // 3B+で「3B+が送信して3B+が受信した信号」を送信 $ python irrp.py -g 17 -f 3b_3b light:off -p ``` ``` // 3B+で送信した「3B+が送信して3B+が受信した信号」を3B+で受信 $ python irrp.py -g 5 -f 3b3b_3b light:off -r --post 100 --no-confirm $ cat 3b3b_3b {"light:off": [13605, 6952, 1381, 2668, 860, 2668, 1099, 12715, 1381, 2182, 1381, 5780, 1381, 2182, 1381, 2668, 1099, 3283, 387, 5780, 1381, 2668, 1099, 2182, 1381, 5780, 1099, 9550, 1099, 9550, 1381, 2668, 1099, 2182, 1381, 5780, 1381, 2668, 860, 2182, 1381, 2668, 1381, 9550, 1099, 5780, 1381, 5780, 1099, 6952, 387, 9550, 1381, 2668, 160, 2668, 1381, 3283, 279, 6952, 210, 6952, 387, 2668, 387, 9550, 387, 5780, 1381]} // len: 69 ``` ``` // 3B+で送信した「3B+が送信して3B+が受信した信号」をzeroで受信 $ python irrp.py -g 17 -f 3b3b_0 light:off -r --no-confirm --post 1000 $ cat 3b3b_0 {"light:off": [13465, 7135, 1250, 2598, 888, 2598, 1250, 12880, 1250, 2112, 1480, 5958, 1250, 2598, 1060, 2598, 888, 9669, 1250, 2598, 888, 2598, 1250, 5958, 888, 9669, 1250, 9669, 1250, 2598, 1250, 2112, 888, 420, 140, 5958, 1250, 2598, 888, 2112, 1250, 2598, 1250, 9669, 888, 5958, 1250, 5958, 888, 7135, 265, 9669, 1250, 2598, 645, 2598, 1250, 16905, 265, 2598, 395, 16905, 1060]} // len: 63 ``` --- 他に試していたこと --------- 1. GPIOは正常か? * 赤外線LEDの代わりに赤色LEDを使用する * 赤色LEDは点灯した 2. 赤外線LEDは正常か? * カメラで確認 * 赤外線LEDは点灯していた 3. 他のGPIOはどうか * 送信のピンを他のピンに変える * 改善せず
回答: 要約:理由は分からないが直った > > 他の任意のプログラムも動作速度 1/2 になっていますか? なっていればクロック初期化のところで誤って動作周波数が 1/2 になっているものと推定されます。 > > > 使用感に変化は感じておらず,他のプログラムが遅くなったような気はしません. 体感だけでは何とも言えないので,現在のクロック周波数を調べるためにcpufrequtilsを入れてみました. まず,クロック周波数を測ってみると900MHzで,遅めの値が出ました. これが原因だったのかと(機能しないこと前提に)irrp.pyを操作したところ,正常に消灯され,驚きました. この直後に測ったクロック周波数は1.4GHzでした. このことから,クロック周波数が原因だと考えました. しかし,その後も何回か追加で操作してみると,クロック周波数が700MHzを指しているときでも正常に消灯しました. ただ,cpufreq-infoを連続で使用すると`800M→1.4G→700M→1.4G→700M→1.4G→700M→1000M`と,ころころと値が変わっていたため.この結果が正確なのか疑問に思っています. (クロック周波数は基本一定で,温度やCPU使用率によって段階的に切り替えられるといったイメージを持っていました) ``` $ sudo apt-get install cpufrequtils $ cpufreq-info | grep "current CPU frequency" current CPU frequency is 900 MHz. current CPU frequency is 900 MHz. current CPU frequency is 900 MHz. current CPU frequency is 900 MHz. ```