Raspberry piで機器制御のプログラムを行っていたが、たまに処理速度が低下してしまうことがあり 気になっていた(常時画面表示する機能があるのだがその表示の更新スピードがたまに遅くなるの だが、ランダムに発生していたためなかなか原因特定に至らなかった)。
まぁ、気になりながらたまに観察していると速度が落ちた時にraspberry piの電源LED が消灯
していたのだ。
ウェブで同じような状況を探していると 電圧低下時に電源LEDの消灯が現象として発生するといった記事があり*1、
ついに原因見つけた!って感じ。
電圧低下時には、raspberry pi内部のフラグで管理されていて以下のコマンドで発生したことがわかるという。
vcgencmd get_throttled
この値が0であればスロットリング(速度低下)は発生していないのだが、0x50000
だと電圧低下によるスロットリングが
発生したことを示している。ちなみに、同コマンドでは他にも熱によるスロットリングも検証できる。
実際実行すると throttled=0x50000
とビンゴで電圧低下によるスロットリング発生している事実を確認できた。
syslogでも同様に状況証拠が確認できた(ログから実際に6秒程度電圧降下が検出されている)
kernel: [ 6588.129451] Under-voltage detected! (0x00050005) kernel: [ 6594.177352] Voltage normalised (0x00000000)
なんでかと考えてみるとRaspberry piの電源をUSB-C(rapsberry pi4なので)から取らず、GPIO側の電源PINからとって いたため、GPIO側の機器の電力消費が大きい場合にアオリを食ってraspberry piの電圧効果につながっていたもの と思われる。
GPIO側の電源で動作していてほぼ問題なく、また電源コードが1つ少なくなるのでラッキーと思ってUSB-Cを繋がなかった のが面倒なバグを生んでいたようだ。
実際、その後Raspberry piにUSB-Cで直接電源を供給すると、速度低下も観測されることもなくなり、電圧降下もなくなった。
電源大事。
勉強になりました。