raspberry pi zero wの省電力設定
諸般の事情で低電力でRP0を動作させるために色々やっているのだが、なかなかむずかしい。
とりあえず、無負荷時50mAまで下げることはできた。ただ、色々問題がある(後述)
DISCLAIMER
- これは手元の環境でためしただけで、万人の環境にマッチするかわからない。USBケーブルの品質などでも色々変わる。
- 計測しているチェッカーの精度が自分でも信用ならない、簡易なツールは校正できるものでもなし。
通常時
なにをもって通常とするかは色々あるが、XのはいっていないRaspbianのLITEで、Wifi(wlan0)をオフにすると大体無負荷85mAになる。
$ sudo ifconfig wlan0 down
Wifiがとにかく電気を食う。Wifiをupする瞬間が特にきびしくて、ほんの一瞬200〜300mAくらいになる。すると、もともとギリギリな乾電池のモバイルバッテリーでは電力不足でリブートがかかったりする。
なので、低電圧の調整をするなら、Wifiを切っておいて、シリアルでつないでためすことをおすすめする。
余談、USBワットチェッカーの憂鬱
というか、あまりに急激に電力を食うからかしらないが、安いケーブル+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
hdmi出力をオフにする
$ /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をつかって調整してみた。
あとはUSBの無効化とか、powertopでパラメータチューニングできる項目の洗い出しとか。powertopは無線LANのチューニング提案もしてくれたはず(システム依存) / “raspberry pi zero wの省電力設定…” https://t.co/VsJEoNlceG
— this is matsuu speaking (@matsuu) 2018年5月6日
インストールと起動
$ 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"
Raspberry pi zero wでウェブサイトのスクショを取るその2(phantomjs+selenium+python)
一つ前の記事で、firefoxめっちゃ重くて駄目だったのでphantomjsを使う場合の話。
ページの大きさにもよるけど、なつかしさあふれるphantomjsはさすがに速い。軽いページなら10秒以下でうごく。
このブログも(表示はモバイル用?になってしまうけど)頑張れば一応レンダリング完了できる。
phantomjsをいれる
$ apt install phantomjs
トラブルシュート
本来上でphantomjsがはいると思うんだけれど、うまくうごかなかった。
$ /usr/bin/phantomjs --version $ echo $? 1
バージョンがでてこないし、ステータスコードは0じゃないし、seleniumからも操作できないし※、なんかおかしいので以下から野良blobをDLしていれました。みなさんはちゃんとやろう。
$ wget https://github.com/aeberhardo/phantomjs-linux-armv6l/archive/master.zip $ unzip master.zip $ cd phantomjs-linux-armv6l-master/ $ tar xvjf phantomjs-1.9.0-linux-armv6l.tar.bz2 $ cd phantomjs-1.9.0-linux-armv6l/bin $ sudo cp phantomjs /usr/local/bin/phantomjs $ phantomjs --version 1.9.0 $ which phantomjs /usr/local/bin/phantomjs
※ selenium.common.exceptions.WebDriverException: Message: Service /usr/bin/phantomjs unexpectedly exited.
PythonにseleniumのLibをいれる
$ python -m pip install selenium
コードを書く
pjs_ss.py
#!python from selenium import webdriver driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs', service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any']) driver.get("http://www.yahoo.co.jp/") driver.save_screenshot("test.png") driver.quit() print("done")
※ めっちゃSSLエラー無視する指定してますが、皆さんはちゃんとしてください。
実行
$ python3.6 pjs_ss.py /usr/local/lib/python3.6/site-packages/selenium/webdriver/phantomjs/webdriver.py:49: UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless ' done $
test.pngが保存されていれば成功。
実行時にめっちゃWARNいわれますけど、そうはいうてもARMv6のRaspi zero向けにheadlessをサポートするバージョンのchromiumがないし(ビルドがどう考えても大変)、firefoxはめっちゃ遅かったんや…。
ただ、phantomjsはどうしてもWeb 1.0風のなつかしさあふれるページになりますね。(個人的にはこれで十分なのだが、UA設定したりすればもうちょっとマシになるのかね?)
まとめ
しょぼいサイトならphantomjsでなんとかなりそう、ただまあRaspberry pi zero w みたいな非力な環境でがんばるより、スクショを取れる公開Web APIを使ったほうが良い。
完全にラズパイ素人なので甘く見ていたのだけれど、ARMv6(Pi0とか)とARMv8(Pi 3Bとか)の溝はかなり深くて広い…、そしてARMv6はサポートしないよってかいてあるOSS多すぎウケるww。かといってPi 3B電気食い過ぎでしょ…。
こちらからは以上です。
余談
最近のchromium-browserのARMバイナリを配布しているところをみつけておとしてみたけど、Illegal instruction
で動かず。
Packages in “Chromium dev” : Chromium dev : “Chromium team” team
$ readelf -a /usr/lib/chromium-browser/chromium-browser > txt $ less txt 〜〜かなり後ろ〜〜 File Attributes Tag_CPU_name: "7-A" Tag_CPU_arch: v7
ウーン、v7以降ね…。
なおfirefox
File Attributes Tag_CPU_name: "6" Tag_CPU_arch: v6
勿論動いた。
まあ、chromiumをがんばってビルドする記事は結構みつかるんだけど、ARMとかいてあるけどそれv7の話だよね???というエントリしかみつからなかった。ARMv6でv59以降のchromiumをビルドするすべを募集中です…。
*1:phantomjs のバージョンの問題かもしれないとおもったけど、--versionうごかないのはさすがに??
Raspberry pi zero wでウェブサイトのスクショを取る(firefox+selenium+python)
現在GW真っ只中の深夜4時半ですが、管理しているサーバーの一つからアラートがとんできておこされたuzullaですこんばんわ。
再起動をかけてみたけどかえってこないので、サーバー業者に問い合わせをして今にいたります。ファイルシステムがぶっこわれている気がします、こまりますね。
さて本題
raspberry pi zero wで、あるウェブサイトのスクショ画像を作成したいのですが、どうやるべきか。
最近だとchrome にheadlessモードが追加されてそれをつかうのがベターだとおもうのですが、raspberry pi zero w にはまだv59は降ってこないので手でビルドする必要があります。しかし、ISSUEなどをみているかぎりビルドは超大変っぽいので手を出す気がおきません。
ということで、Firefox+selenium+Pythonでやってみます。
オチ
すっごい遅いから、やめた方が良い。
セットアップ
$ sudo apt install firefox-esr xvfb -y
# geckodriverを入手します。本家のリリースは以下なのですが、arm7です、raspi zeroはarm6である必要があります。 # https://github.com/mozilla/geckodriver/releases # かといって、rustでビルドするのはしんどい、ので、無保証のblobを今回つかってみました。 # 正直良い行動とはいえませんので、みなさんはビルドしましょう。 # https://github.com/d0ku/GeckoDriver_ARMv6/tree/0.18.0 $ wget https://github.com/d0ku/GeckoDriver_ARMv6/raw/0.18.0/geckodriver $ chmod +x geckodriver $ mv geckodriver /usr/local/bin
# いるのかわかりません $ xvfb-run firefox -CreateProfile default
# Pythonでやりたいので、ライブラリをいれます $ sudo python -m pip install selenium $ sudo python -m pip install pyvirtualdisplay
以下のようなコードを書き、実行します。
from selenium import webdriver from pyvirtualdisplay import Display display = Display(visible=0, size=(800, 600)) display.start() driver = webdriver.Firefox() driver.get('http://s.cfe.jp') driver.save_screenshot('screenshot.png') driver.quit()
大体1〜2分くらいかかってスクショができます。おつかれさまでした
なお、本ブログサイトは10分くらいねばった上で、メモリ不足でおちました。 マイコンから見れば無尽蔵の性能をもつraspberry pi zero w とはいえ、こういう処理荷が重かった模様。
トラブルシュート
geckodriver.log
をみましょう。
大抵は仮想ディスプレイ(xvfbとか)がうまくいってないんじゃないですかね。
firefoxが終了しない
ISSUEにもあるのですが、なにかしらダイアログをだして固まるようです。荒々しく皆殺しです。
$ killall geckodriver $ killall firefox-esr $ killall Xvfb
まとめ
上にもかきましたが、Web1.0的なしょぼいサイト以外ではなかなかきびしい。むりやりswap領域をふやしたり、Headless Firefoxを使い回せばいいのかもしれませんが、そうもいってられないこともある。
さて、皆様の楽しいGWを祈っております。