諸般の事情で低電力でRP0を動作させるために色々やっているのだが、なかなかむずかしい。
とりあえず、無負荷時50mAまで下げることはできた。ただ、色々問題がある(後述)
DISCLAIMER
- これは手元の環境でためしただけで、万人の環境にマッチするかわからない。USBケーブルの品質などでも色々変わる。
- 計測しているチェッカーの精度が自分でも信用ならない、簡易なツールは校正できるものでもなし。
通常時
なにをもって通常とするかは色々あるが、XのはいっていないRaspbianのLITEで、Wifi(wlan0)をオフにすると大体無負荷85mAになる。
$ sudo ifconfig wlan0 down
Wifiがとにかく電気を食う。Wifiをupする瞬間が特にきびしくて、ほんの一瞬200〜300mAくらいになる。すると、もともとギリギリな乾電池のモバイルバッテリーでは電力不足でリブートがかかったりする。
なので、低電圧の調整をするなら、Wifiを切っておいて、シリアルでつないでためすことをおすすめする。
というか、あまりに急激に電力を食うからかしらないが、安いケーブル+USBワットチェッカーを間にいれているとwlanがupできないことがある。
写真の「高機能な」ワットチェッカーも、Ankerとかの「良い」ケーブルでないとwlan0をあげると落ちることがある。
もっと安い白いやつ(写真参照)でも勿論駄目。
(安いやつは見ての通り測定下限を割って?しまっていて、右上が0.00Aとなっている…。)
もうちょっとマシなやつ?だと、測定精度にものすごく不安があるが(ここでは0.2とでているが、0.3や0.6を絶対にみない。高いやつを信用するわけではないが、50mAくらい低くでている気がする)、一応ちゃんとしたモバイルバッテリーならwlanはupする。
こういうことをやっていると、もっともっと品質の良いUSBワットチェッカーがほしいのだが、高くて国内メーカーのラベルがはってあってもどうせ中身は中国製だから…。
(それとも、USBワットチェッカーの先に、安定化でコンデンサでもいれるべきだろうか?)
起動時にwifiをonにしないために
現時点最新版のstretchについていえば、dhcpcdと同時にwlan0はupされてくるので、それをdisableにすれば次のbootからwlan0が有効化されない
$ sudo systemctl disable dhcpcd
当然ながら、dhcpcdを起動すると、Wifiがつながるようになる。
$ sudo systemctl start dhcpcd
あるいは、テンポラリなら以下でも
# Wifiをオフに
$ sudo ifconfig wlan0 down
# オンに
$ sudo ifconfig wlan0 up
$ /opt/vc/bin/tvservice --off
これで大体10〜20mAくらい下がって70mAになる。
ブート時に有効にするにはconfig.txtのhdmi_blanking
あたりをいじればよい気がする…のだがいまいちよくわからん。
https://github.com/raspberrypi/firmware/issues/352
(試すのも面倒になりつつある)
これは安全に変更できるので、よい。
config.txtで色々いじる、特に電圧
arm_freq=500
arm_freq_min=250
over_voltage=-5
over_voltage_min=-5
arm_freq
まわりをいじるととても動作が緩慢になる、クロック抑制がきいている。
これでもちょっとだけさがるのだが、ちゃんとさげるには電圧もさげなければならない。
over_voltage
は(多分)0が基準で、マイナスで基準よりも下げていくもの。-6にしたら起動しなかった。
なお、config.txtはSDカードでマウントできる領域に見えているので、駄目だったら他のPCにmicroSDをつないでトライアンドエラーする。
ここまで設定すると、49mAまで下げることができた。70mAとの差は20mAで、かなりの差である
参考資料はこのあたり
https://www.raspberrypi.org/documentation/configuration/config-txt/overclocking.md
wlan0がみえなくなった
これくらい電圧を下げると(あるいはクロックをさげると)wlan0がみえなくなった。
まあ、wlan0をonにした瞬間にここまでの努力は誤差みたいになるのだが。
まとめ
単三電池二本でいい感じにうごかすために色々調整してみた。目標は単三電池2本でwlanが有効にできることである。
しかし、うまくwlanはあげられなかった、だとするとあんまり(ほそぼそとケズっても、個人的には)意味がないので負けである。
なお、実はjessie(ちょっと前のバージョンのRaspbian)では普通に乾電池二本でwlanが有効化できた。stretchベースのRaspbianにしたらなんかしらんけどだめになってしまったのだ。
なので、色々やればいけるかなーとおもったけれど、結果wlan0がみえなくなったりして散々である。
何が原因で最近のバージョンでは駄目になったのかがいまいち特定できていないのだが、もし情報がございましたらば是非お教えください。
(たとえばwlan0を起動する際に、tx-powerの上限を指定できないかなとおもっているが、countryをいじる以外ではまだみつかっていない)
なお、手元のテストではRP0はニッケル水素単三電池二本とダイソーのUSBバッテリーで数時間はもつようでした、つかいようはある。(電圧はガックガクしてて、いかにも基板の健康にはわるそうだったが)
つづく。
追記 Powertop
matsuuさんのコメントを見て、Powertopをつかって調整してみた。
インストールと起動
$ sudo apt install powertop
$ sudo powertop
# あるいは、auto-tune オプションで一括適用
$ sudo powertop --auto-tune
※ SSHでなくシリアル接続でpowertopをひらいたら、手元ではTunableタブで操作が不可能になったので注意。
触ってみた
Tabでメニュー切り替えできる
CPUクロックの状態とか割合見れるの便利かもしれない。
電力を消費しているデバイス一覧もみれる…みたいだけど、この単位のわかりづらさよ。
この「Tunables」メニューは上下で選択して、EnterでTune(調整)をしてくれる。(もう一度Enterすると、戻る)
ラズパイだと設定項目が少ないがこのスクショでは全部Goodにした結果。
ただ、基本的には負荷が上がった時に効果があるものだと思うので、ワットチェッカーで目視できる変化はなし。
追記 USBのパワーオフ(?)
RP0だとHubは内蔵されていない(ほかのラズパイなら、内蔵HUBのパワーをオフにできる)ので、ポートを落とすというのはない模様。
なんとなく以下のことを指摘されたかと思ったが、こちらは何も繋いでいなければ効果は無い模様。
echo "0" > "/sys/bus/usb/devices/usb1/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usb1/power/control"