uzullaがブログ

uzullaがブログです。

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をつかって調整してみた。

インストールと起動

$ sudo apt install powertop
$ sudo powertop

# あるいは、auto-tune オプションで一括適用
$ sudo powertop --auto-tune

SSHでなくシリアル接続でpowertopをひらいたら、手元ではTunableタブで操作が不可能になったので注意。

触ってみた

f:id:uzulla:20180507230843p:plain

Tabでメニュー切り替えできる

f:id:uzulla:20180507230911p:plain

CPUクロックの状態とか割合見れるの便利かもしれない。

f:id:uzulla:20180507230953p:plain

電力を消費しているデバイス一覧もみれる…みたいだけど、この単位のわかりづらさよ。

f:id:uzulla:20180507231053p:plain

この「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していれました。みなさんはちゃんとやろう。

*1

GitHub - aeberhardo/phantomjs-linux-armv6l: PhantomJS compiled on a Raspberry PI (Raspbian "wheezy").

$ 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.

Pythonseleniumの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+seleniumPythonでやってみます。

オチ

すっごい遅いから、やめた方が良い。

セットアップ

$ 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を使い回せばいいのかもしれませんが、そうもいってられないこともある。

外部のスクリーンショット生成APIを使う方が良いですね。

さて、皆様の楽しいGWを祈っております。