Raspberry Pi Pico Wを電池で動かすとどのくらい動くか試す

Pico Wの感想ツイートとかを眺めていたら、電池で動かしたらどのくらい持つのかという内容のツイートを見つけて、面白そうだったので試してみることにしました。

たしかに、PimoroniのPico関連製品は乾電池で動かすことを意識してバッテリーボックスセットが売られていたりします。Pico Wに合わせて発売されたPico W Aboardシリーズも単4電池x2のケース付きで販売されていますね。

実験内容

今回は、電池で駆動するPico W上にWebサーバーを立てて、RP2040のCPU温度と現在時刻をJSONで返すURLを作り、それを別の機材から毎秒GETでアクセスをして、アクセスができなくなるまでの時間を測りました。スクリプトは、前回のレポート記事で紹介したものからBME280を取り除いたようなイメージです。

Pico Wが起動したときの時刻が2021/01/01 00:00:00なので、GETできなくなった直前のJSONに含まれている時刻=電池で動かせた時間として見ることができそうです。

電池は、IKEAのニッケル水素充電池「LADDA」1.2V・2450mAhを2本使用しました。前回のレポートでは、ネットワーク通信時は5Vで0.06A==60mAくらいと計測できていたため、2.4Vでは60mA * 5V / 2.4V == 125mAとして、2450mAh/125mA==19.6時間くらい動くのではないかと思います(なんとなくあってますかね……?このあたりせっかくSNSで助言をいただいたものの、ニガテで理解できているかどうか自信がなく……)。

ネットワーク構成とPico Wの監視方法

今回もPico Wは電波暗箱に入れるため、毎秒GETする端末は暗箱の外に設置しますが、暗箱内で無線ブリッジ役をしているRaspberry Piから出る有線LANはUSBに変換されているため、暗箱外で別のRaspberry Piにつないで有線LANブリッジを組み、自宅ネットワークと接続できるようにしつつ、ここからPico Wに対して毎秒GETして、OLEDディスプレイモジュールでJSON内の時刻と温度を表示することとしました。

暗箱の外との通信はUSB(LAN)になる

OLEDディスプレイでは毎回JSONの内容を表示しますが、JSONが取得できなくなったら時刻の表示内容は更新せずに、結果記録用としてそのままにします。

暗箱内のUSB(LAN)と自宅のネットワークをブリッジする役とPico WにGETしてOLEDに結果を表示する役をこなす暗箱外のRaspberry Pi

実験開始

今回はスイッチ付き電池ボックスを使用しましたが、スイッチのレバーを倒すのは暗箱を閉じた状態ではできないので、仕方なく暗箱を開いた状態でレバーを倒して、すぐに箱を閉じることとしました(本当はリレーとかを使えばよかったのでしょうが、機材の都合でできませんでした……)。

あとは電池が切れるまで放置します。が、この時点では時間の予測ができていなかったので、夜に開始して、寝る前にも終わる気配がないことである程度察し、OLEDディスプレイを適当に隠して就寝しました。

寝たらわからないと思うけれど、寝付くまでは目立つので一応隠します

実験結果

翌日、出先からたまにcurlで確認をしていたら、夕方頃に応答がなくなっていました。帰宅してOLEDの表示を確認した結果、22時間43分40秒で更新が止まっていました。

更新されなくなった時刻を記録

予想よりも3時間ほど長い結果になりましたが、常に通信し続けるわけではなく、毎秒小さなJSONファイルをGETする程度だったため、実際にはアイドル時間もそれなりにあったと思われます。

感想

毎秒無線でアクセスされるような環境下でも、充電池2本でほぼ1日動くことがわかりました。

実際になにかしっかりと運用する時には、センサーやLEDやサーボモーターなどを付けたり、ディープスリープ・ウェイクアップを実装したり、無線アクセスも毎秒ではなく毎分だったりと、実装によって変動はするでしょうが、電池駆動でもわりとなにか遊べそうな感じがしますね。電池駆動の可能性を感じた実験でした。

追記: スクリプト

使用したスクリプトをこちらに置きました。

https://github.com/Akkiesoft/akkiesoft-pico/tree/main/MicroPython/rp2040-temp-webserver

無線LANが搭載された Raspberry Pi Pico W で遊ぶ

本日発表されたRaspberry Pi Pico W(以下、Pico W)は、これまでのRaspberry Pi Pico(以下、Pico)に無線LANが追加されたバージョンです。Raspberry Pi Zeroに無線LANが搭載された時と似た流れを感じますね。

Picoで遊んでいると、ネットワーク接続が欲しくなることがよくあったため、Pico Wはある意味で待望のリリースと言えそうです。

今回もサンプルをお預かりしましたので、さっそく遊んで、もとい、色々試していきます。

外観

外観をPicoと比べてみます。左がPico W、右がPicoです。

まずは表面。Picoと比べると、四角い銀色のパーツとアンテナが増えたのが分かりやすい変化です。アンテナの配置の都合で、DEBUGのスルーホールが移動してしまったため、これがあることを前提とした基板を作成している人は要注意かも知れません。

Picoで他に惜しいポイントだった、MicroUSBと、RESETボタンがない点は変わりませんでした。(※右のPicoにはPimoroni Captain Resettiが増設されています)

Raspberry Pi Pico W(左)とRaspberry Pi Pico(右)

つづいて裏面。Picoよりも各種認証や権利関係のロゴと文字でいっぱいになりました。EUを離脱したイギリスの適合性評価マークであるUKCAロゴが加わった点は、イギリスの製品らしい新たな特徴です。基板の余白が少ないため、今後日本で技適が取得されても、基板への直接の印字は難しそうです(他の国などもそうですが……)。

基板裏面(並びは表面と同じ)

MicroPythonファームウェアの用意と書き込み

今回はかんたんな例として、HTTPサーバーを動かして、BME280のセンサーデータJSONで提供するAPIと、それを毎秒取得してデータを表示するようなHTMLを提供する、MicroPython向けのスクリプトを作成しました。スクリプトはGitHubに配置しました。

今回はPimoroniのBME280ライブラリを使用するために、ライブラリを組み込んだPico W向けMicroPythonファームウェアを自前でビルドして使用しました。ビルドの詳細は割愛しますが、MicroPythonのビルドは初めてで、少し苦労しました……。Pico Wリリース前だったため自前ビルドをしましたが、リリース後はきっとPimoroniからPico W向けのファームウェアが提供されると思われるので、今後はそちらを使えば良いでしょう。

さて、Pico Wのテストには、スイッチサイエンスさんからお借りしているいつもの電波暗箱を使用しました。ファームウェアを書き込むには、BOOTSELボタンを押しながら通電する必要があるため、洗濯バサミでボタンを挟んだ状態で暗箱に設置して、電波暗箱の外から書き込みを実行しました。書き込み後はケーブルを抜いてから電波暗箱を開き、洗濯ばさみを外しました。これで準備は完了です。

ファームウェアの書き込み

電波暗箱の無線LAN環境の構築

電波暗箱の中では当然ながら外の電波は遮断されて、部屋の無線LANが使用できません。そこで、Raspberry Piとhostapdを使用した無線LANのブリッジを作成して、それを電波暗箱の中に入れて、Pico WはRaspberry Piの無線LANブリッジに接続するようにします。

電波暗箱内でのテスト環境のようす

Thonnyからスクリプトを実行して、起動後にPico WのIPアドレスにアクセスします。すると、HTMLファイルが読み込まれて、毎秒センサーのデータが更新されました。

電波暗箱内のRaspberry Pi Pico Wをテストするようす

なお、電力チェッカーを使用して消費電力を確認したところ、無線LANに接続したあと何もしていない状態では0.02A、データを転送している最中では0.08A前後となりました。

転送速度の調査

Pico Wの転送速度を調べるために、/longにアクセスされたら500KBくらいの文字列を送るようにスクリプトを少し改造しました。これを無線LANブリッジのRaspberry Piからcurlでダウンロードして、平均ダウンロード速度を確認しました。

akkie@raspberrypi:~ $ curl http://192.168.2.21/long -o /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  500k    0  500k    0     0  43708      0 --:--:--  0:00:11 --:--:-- 44116

結果は約42.7KB/秒となりました。軽量なHTMLやJSONデータを読み込むには問題ない速度で、実用的そうです。

vs Pimoroni Pico Wireless Pack

Pimoroni Pico Wireless Packは、Pico向けの無線LAN機能拡張ボードで、ESP32を使用して無線LAN接続を使用するため実現します。Pico Wが出る以前のPicoではこのような拡張ボードが必要でした。

まず物理的な比較をすると、Picoのピンがボードで覆われるため、他のボードと同時に使うにはPimoroni Pico Omnibusのような拡張ボードが別途必要になり、作品も大きくなってしまいます。Pico Wであれば、無線のためにピンを使うことはなくなるため、見た目をスッキリさせられます。

Pico Wと、PicoとPico Wireless Packの組み合わせを並べたようす

続けて転送速度です。Pimoroniのサンプルスクリプトをベースに、先ほどと同じく文字列をたくさん転送するスクリプトを作成して、curlでダウンロードして調べます。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10240  100 10239    0     0   1424      0  0:00:07  0:00:07 --:--:--  1467

結果は1.4KB/sで、Pico Wの1/40になってしまいました……。実際に別の用途で使用したときもHTMLの転送にとても時間がかかっていたため、改めて数字にしてみるとなかなか遅いです。

最消費電力です。BME280のセンサーを読み出してネットワーク通信するようなスクリプトを動かして調べたところ、何もしていない状態では0.06A、通信時は0.12A程度となりました。Pico Wと比較するといずれも消費電力は大きめですね。

Raspberry Pi Pico + Pico Wireless Pack + BME280の消費電力を計測したようす

まとめ

Raspberry Pi Pico Wの登場によって、拡張ボードがなくてもネットワークが扱えるようになり、IoT用途として非常に使い勝手の良いボードに進化しました。

もし、通常のRaspberry Piでセンサーを読み出してネットワークで転送するような作品を動かしているなら、Pico Wに移植することで消費電力を大きく減らせそうです。ラジコンカーやロボットなどもPico Wを使って作れそうですね。

一方で、従来のPicoもネットワークを必要としない作品では引き続き需要があると考えられるので、用途に応じて無線あり・なしどちらかのPicoを使い分けると良いでしょう。

そして、毎度残念ながら、Pico Wがいつごろ日本で使用できるようになるのかは不明ですが、日本で発売されるのが待ち遠しいアイテムがまた増えました。

(2023/3/27追記)日本での販売が開始しました。

Raspberry Pi Pico実機レポート!

あっきぃです。本日リリースされたRaspberry Pi Picoのサンプルを太田さんからお借りしているので、レポートしていきます。

外観

外観の紹介。サンプルのため、製品版とは一部異なる場合があります。また、製品はピンヘッダーが未実装の状態で販売されます。

表面
裏面

Raspberry Pi PicoにMicroPythonを入れて使う

Raspberry Pi Pico上でMicroPythonを使うことができます。何かを簡単に動かしてみるならこれが一番手軽でしょう。

セットアップの方法はRaspberry Pi Picoのサイトで解説されているため、そちらを参照してください。

https://pico.raspberrypi.org/getting-started

また、プログラミングにはRaspberry Pi OSにバンドルされているThonnyを使うことができます。こちらも上記サイトのMicroPython documentation(PDF)の4章で説明されているので、これを参照してセットアップすると良いでしょう。MicroPythonの場合ファイルの送受信にはampyなどを利用しますが、Thonnyでもファイル保存ダイアログを通じてファイルの送り込みや取得ができるようになるため、用意しておくと便利です。

……本当はドキュメント見ろではなくてステップごとの解説ができると良いのですが、今回はひとまず簡易レポートということで端折らせてください……!

PCD8544 LCDを動かしてみる

手持ちのそれっぽいデバイスでMicroPythonで動かせそうなものを漁ってみたところ、大昔に買ったNokia 5110ことPCD8544 LCDが出てきたので、これを動かしてみることにしました。

まずは配線。Raspberry Pi PicoのSPI0ポートを使用しつつ、これ以外は適当なGPIOピンに差し込みました。

[pcd8544:pico(physical pin)]
Gnd: Pico GND (38)
BL : Pico GP28(34)
Vcc: Pico 3V3 (36)
Clk: Pico GP6 ( 9)
Din: Pico GP7 (10)
DC : Pico GP4 ( 6)
CE : Pico GP5 ( 7)
RST: Pico GP8 (11)

PCD8544用のMicroPython向けライブラリはGithubにあり、そのまま使う事ができました。

https://github.com/mcauser/micropython-pcd8544

pcd8544とpcd8544_fbの2つライブラリがあり、後者のほうが文字を書いたり図を描いたりしやすいので、これをインストールしますが、ThonnyのManage Packagesではインストールできません。pcd8544_fb.pyをRaspberry Pi上に用意して一旦Thonnyで開き、Raspberry Pico上に/lib/pcd8544_fb.pyとして保存することでファイルを転送して、インストールします。

テストプログラムは、リポジトリのexample/framebuf.pyを元にピン番号を書き換えるだけで動きます。ピン番号の書き換えは以下の通り。SPI0番を使うのでSPI(0)で初期化します。Pinの番号はGPの方の数字を指定します。

spi = SPI(0)
spi.init(baudrate=2000000, polarity=0, phase=0)
print(spi)
cs = Pin(5)
dc = Pin(4)
rst = Pin(8)

# if your pcd8544 has BL pin, uncomment this line.
bl = Pin(28, Pin.OUT, value=1)

lcd = pcd8544_fb.PCD8544_FB(spi, cs, dc, rst)

その後の描画テストは、処理の度にframebuf.fill(0)が挟まれており、ほとんどのテストが見えずに終わってしまうため、framebuf.fill(0)を削りつつ、順に描画している様子がわかるようにちょっと書き換えたものを用意しました。

実行結果はこの通りです。

動画で!

ソースコードは以下のURLで公開しています。

https://gist.github.com/Akkiesoft/c72034f89b9aa6a3bedd4994bd51676a

まとめ

新しいRaspberry Pi Picoをさわってみる記事でした。

4ドル(日本では500円前後になるようです。スイッチサイエンスさんでは550円とのアナウンスがありました)と安価なので、気軽に買って遊んでよし、積みボードにしても罪悪感薄しな感じで良いですね(こら)。

また、MicroPythonの豊富なライブラリが利用できるのはわりと強いのかなと思いました。ESPと比べると無線周りがない点が弱みのような気もしますが、無線はいらない場合も多々なので、これはこれでありなのではないかと思います。

HQ Cameraで遊ぶ

あっきぃです。

おおたさんからHQ Cameraのサンプルを預かったので、少し見たり触ったりするレポート記事です。なお、実際の製品とは若干異なる場合があります。予めご了承ください。

Raspberry Pi High Quality Camera リリース

購入するには

はじめに、現時点で一番わかりやすい購入先としてPimoroniのリンクを貼っておきます。

カメラモジュール本体と16mmレンズの組み合わせでは送料を含めて92.5ポンド、約1.3万円になるようです(購入しました)。

本体とレンズの様子

新しいカメラモジュールはレンズ別売りです。Cマウントレンズは別途認定リセラーから数種類販売されているので、どれか一つは必ず買う必要があります。

ちなみに、他のマウントからCマウントに変換できるアダプターが焦点工房というお店で販売されているそうなので、何かしらのレンズを持っている人は変換アダプターを用意すると可能性が広がるようです。EFレンズアダプターをAmazon経由で購入してみました。

http://www.stkb.jp/shopbrand/ct363/

カメラモジュールの裏面とレンズ。サンプルとして提供されているレンズは、Pimoroniの製品ページとは見た目がことなるものの10M Pixel 16mmという性能は同じレンズと、Pimoroniの製品ページと同じ6mmの2種類でした。

今回は10M Pixel 16mmのレンズで撮影します。レンズを取り付けるとこのような感じになります。

カメラマウント用のネジ穴がついているので、一般的な三脚への固定が簡単です。今までのカメラモジュールは固定に難儀していたことを考えると、ネジ穴付きは結構ありがたいですね。

簡単な撮影テスト。

ひとまずは部屋の中でPimoroniのMicroDot pHatとRaspberry Pi Zeroを写してみました(画像をクリックするとオリジナルのサイズで表示されます。)ピントが固定だった以前のカメラモジュールと違って、写したいものにピント調節や絞り調節ができるので、なかなか良い感じです。

以下の写真ではピントを手前の小物にずらしてみました。

家の中では撮れるものがなかなかなく、こんな例でアレなのですが、外で花とかを撮影してみるのも良いかもしれませんね(昨今の情勢を考えると外出はもう少し控えたほうが良さそうではありますが……)。

まとめ

Raspberry Piにもレンズ沼が到来?なのかどうかはわかりませんが、レンズを交換してたのしめる新たなおもちゃという感じがしました。一式&変換アダプターをポチってしまったので、届いたらまた遊んでブログに書いていこうと思います。

Raspberry Pi 4 Model Bを見る!

Raspberry Pi 4 Model Bのサンプルを見たり、ベンチマークした結果を紹介していきます。なお、日本での認証(技適)が未取得であるため、以前Raspberry Pi 3 Model B+をベンチマークする際にも利用させていただいた、スイッチサイエンス様のシールドボックスをお借りしました。

Raspberry Pi 3 B+をシールドボックスでベンチマーク

おことわり: サンプルボードの検証結果は製品版と一部結果が異なる場合があります。

■外観のチェック

表面。

SoC型番はBCM2711となっています。Raspberry Pi 3B+と同じく表面は金属となりました。

電源ポートとmicroHDMIポート。

USB/LANポート。LANポートの位置が右に移動している点が今までのRaspberry Piとの違いです。真ん中はUSB3.0ポートです。

裏面

USBポートはVIA VL805チップから提供されます。また、GbEポート用のBCM54213PEチップが搭載されています。

■スペックの確認

CPUの情報

pi@four:~ $ cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 3 (v7l)
BogoMIPS : 108.00
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xd08
CPU revision : 3

(processor1〜3略)

Hardware : BCM2835
Revision : c03111
Serial : (略)

メモリーの情報。サンプルは4GB RAMモデルのため、MemTotalの数値もそのとおりになっています。

pi@four:~ $ cat /proc/meminfo
MemTotal: 4003816 kB
MemFree: 3566036 kB
MemAvailable: 3714744 kB

USBポートはPCI Express接続のVIA VL805 USB3.0コントローラーによる提供のため、lspciコマンドで確認できます。

pi@four:~ $ lspci
00:00.0 PCI bridge: Broadcom Limited Device 2711 (rev 10)
01:00.0 USB controller: VIA Technologies, Inc. VL805 USB 3.0 Host Controller (rev 01)

■ギガビットは本当?iperfでテスト

Raspberry Pi 4 Model BとNanoPi Neo 2を使用してiPerf3を実行しました。NanoPi Neo 2はギガビットの速度が出る別のシングルボードコンピュータです。

それぞれのボードとギガビットイーサネットのハブをシールドボックスに入れて、同じくハブに接続したUSB Ethernetアダプターでボックスの外の端末からアクセスして計測します。

Nano Pi Neo 2をiperf3サーバーとして実行した様子です。940Mbpsの速度が出ていることがわかりました。

pi@four:~ $ iperf3 -c 192.168.2.4
Connecting to host 192.168.2.4, port 5201
[ 5] local 192.168.2.5 port 54272 connected to 192.168.2.4 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 112 MBytes 940 Mbits/sec 0 317 KBytes
[ 5] 1.00-2.00 sec 112 MBytes 943 Mbits/sec 0 376 KBytes
[ 5] 2.00-3.00 sec 112 MBytes 938 Mbits/sec 0 376 KBytes
[ 5] 3.00-4.00 sec 112 MBytes 940 Mbits/sec 0 434 KBytes
[ 5] 4.00-5.00 sec 112 MBytes 942 Mbits/sec 0 434 KBytes
[ 5] 5.00-6.00 sec 112 MBytes 938 Mbits/sec 0 434 KBytes
[ 5] 6.00-7.00 sec 112 MBytes 939 Mbits/sec 0 434 KBytes
[ 5] 7.00-8.00 sec 112 MBytes 944 Mbits/sec 0 452 KBytes
[ 5] 8.00-9.00 sec 112 MBytes 940 Mbits/sec 0 452 KBytes
[ 5] 9.00-10.00 sec 112 MBytes 941 Mbits/sec 0 598 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.10 GBytes 941 Mbits/sec 0 sender
[ 5] 0.00-10.00 sec 1.09 GBytes 940 Mbits/sec receiver

iperf Done.

Raspberry Pi 4をiperf3サーバーとして実行した様子です。やや速度が遅くなりますが837Mbpsという高速な結果になりました。

pi@four:~ $ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.2.4, port 42350
[ 5] local 192.168.2.5 port 5201 connected to 192.168.2.4 port 42352
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 96.0 MBytes 805 Mbits/sec
[ 5] 1.00-2.00 sec 100 MBytes 841 Mbits/sec
[ 5] 2.00-3.00 sec 100 MBytes 842 Mbits/sec
[ 5] 3.00-4.00 sec 100 MBytes 841 Mbits/sec
[ 5] 4.00-5.00 sec 100 MBytes 841 Mbits/sec
[ 5] 5.00-6.00 sec 100 MBytes 842 Mbits/sec
[ 5] 6.00-7.00 sec 100 MBytes 842 Mbits/sec
[ 5] 7.00-8.00 sec 100 MBytes 841 Mbits/sec
[ 5] 8.00-9.00 sec 100 MBytes 841 Mbits/sec
[ 5] 9.00-10.00 sec 99.1 MBytes 832 Mbits/sec
[ 5] 10.00-10.03 sec 3.00 MBytes 843 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate
[ 5] 0.00-10.03 sec 1001 MBytes 837 Mbits/sec receiver

■USB3.0のベンチマーク

USB3.0のベンチマークを、高速なUSB3.0メモリを使ってhdparmコマンドで取得しました。
取得時に電力が不足したためか、エラー出力が見られましたが、結果は87MB/sと高速な値を見ることができました。

pi@four:~ $ sudo hdparm -t /dev/sda

/dev/sda:
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Timing buffered disk reads: 262 MB in 3.01 seconds = 87.12 MB/sec

■Unixbench

最後に恒例のUnixbenchです。


========================================================================
BYTE UNIX Benchmarks (Version 5.1.3)

System: raspberrypi: GNU/Linux
OS: GNU/Linux -- 4.19.50-v7l+ -- #895 SMP Thu Jun 20 16:03:42 BST 2019
Machine: armv7l (unknown)
Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
CPU 0: ARMv7 Processor rev 3 (v7l) (0.0 bogomips)

CPU 1: ARMv7 Processor rev 3 (v7l) (0.0 bogomips)

CPU 2: ARMv7 Processor rev 3 (v7l) (0.0 bogomips)

CPU 3: ARMv7 Processor rev 3 (v7l) (0.0 bogomips)

23:47:23 up 4:57, 2 users, load average: 0.00, 0.66, 2.72; runlevel Jun

------------------------------------------------------------------------
Benchmark Run: Sun Jun 23 2019 23:47:23 - 00:15:36
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 10010557.0 lps (10.0 s, 7 samples)
Double-Precision Whetstone 2381.7 MWIPS (9.6 s, 7 samples)
Execl Throughput 911.8 lps (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 111140.1 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 30981.9 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 301680.2 KBps (30.0 s, 2 samples)
Pipe Throughput 160911.4 lps (10.0 s, 7 samples)
Pipe-based Context Switching 48233.4 lps (10.0 s, 7 samples)
Process Creation 1856.0 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 2466.3 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 736.8 lpm (60.1 s, 2 samples)
System Call Overhead 493135.1 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 10010557.0 857.8
Double-Precision Whetstone 55.0 2381.7 433.0
Execl Throughput 43.0 911.8 212.1
File Copy 1024 bufsize 2000 maxblocks 3960.0 111140.1 280.7
File Copy 256 bufsize 500 maxblocks 1655.0 30981.9 187.2
File Copy 4096 bufsize 8000 maxblocks 5800.0 301680.2 520.1
Pipe Throughput 12440.0 160911.4 129.3
Pipe-based Context Switching 4000.0 48233.4 120.6
Process Creation 126.0 1856.0 147.3
Shell Scripts (1 concurrent) 42.4 2466.3 581.7
Shell Scripts (8 concurrent) 6.0 736.8 1227.9
System Call Overhead 15000.0 493135.1 328.8
========
System Benchmarks Index Score 320.2

------------------------------------------------------------------------
Benchmark Run: Mon Jun 24 2019 00:15:36 - 00:43:47
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables 40088657.2 lps (10.0 s, 7 samples)
Double-Precision Whetstone 9528.0 MWIPS (9.6 s, 7 samples)
Execl Throughput 2702.4 lps (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 213778.4 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 59398.3 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 569815.6 KBps (30.0 s, 2 samples)
Pipe Throughput 607729.5 lps (10.0 s, 7 samples)
Pipe-based Context Switching 193837.7 lps (10.0 s, 7 samples)
Process Creation 4612.8 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 5911.6 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 804.6 lpm (60.2 s, 2 samples)
System Call Overhead 1875987.0 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 40088657.2 3435.2
Double-Precision Whetstone 55.0 9528.0 1732.4
Execl Throughput 43.0 2702.4 628.5
File Copy 1024 bufsize 2000 maxblocks 3960.0 213778.4 539.8
File Copy 256 bufsize 500 maxblocks 1655.0 59398.3 358.9
File Copy 4096 bufsize 8000 maxblocks 5800.0 569815.6 982.4
Pipe Throughput 12440.0 607729.5 488.5
Pipe-based Context Switching 4000.0 193837.7 484.6
Process Creation 126.0 4612.8 366.1
Shell Scripts (1 concurrent) 42.4 5911.6 1394.2
Shell Scripts (8 concurrent) 6.0 804.6 1340.9
System Call Overhead 15000.0 1875987.0 1250.7
========
System Benchmarks Index Score 851.0

以下は同じバージョンのRaspbianを使用してRaspberry Pi 3B+上で実行した結果です。


------------------------------------------------------------------------
Benchmark Run: Mon Jun 24 2019 05:08:05 - 05:36:16
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 5296678.9 lps (10.0 s, 7 samples)
Double-Precision Whetstone 1431.2 MWIPS (9.8 s, 7 samples)
Execl Throughput 960.5 lps (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 138696.1 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 42914.1 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 357533.0 KBps (30.0 s, 2 samples)
Pipe Throughput 298836.5 lps (10.0 s, 7 samples)
Pipe-based Context Switching 53689.7 lps (10.0 s, 7 samples)
Process Creation 2345.4 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 1913.1 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 584.4 lpm (60.1 s, 2 samples)
System Call Overhead 687496.7 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 5296678.9 453.9
Double-Precision Whetstone 55.0 1431.2 260.2
Execl Throughput 43.0 960.5 223.4
File Copy 1024 bufsize 2000 maxblocks 3960.0 138696.1 350.2
File Copy 256 bufsize 500 maxblocks 1655.0 42914.1 259.3
File Copy 4096 bufsize 8000 maxblocks 5800.0 357533.0 616.4
Pipe Throughput 12440.0 298836.5 240.2
Pipe-based Context Switching 4000.0 53689.7 134.2
Process Creation 126.0 2345.4 186.1
Shell Scripts (1 concurrent) 42.4 1913.1 451.2
Shell Scripts (8 concurrent) 6.0 584.4 974.0
System Call Overhead 15000.0 687496.7 458.3
========
System Benchmarks Index Score 331.9

------------------------------------------------------------------------
Benchmark Run: Mon Jun 24 2019 05:36:16 - 06:04:42
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables 18740948.4 lps (10.0 s, 7 samples)
Double-Precision Whetstone 5363.6 MWIPS (10.6 s, 7 samples)
Execl Throughput 2069.3 lps (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 220388.7 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 62487.0 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 589552.1 KBps (30.0 s, 2 samples)
Pipe Throughput 1075015.8 lps (10.0 s, 7 samples)
Pipe-based Context Switching 189588.0 lps (10.0 s, 7 samples)
Process Creation 4393.8 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 4339.6 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 590.4 lpm (60.3 s, 2 samples)
System Call Overhead 2489812.0 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 18740948.4 1605.9
Double-Precision Whetstone 55.0 5363.6 975.2
Execl Throughput 43.0 2069.3 481.2
File Copy 1024 bufsize 2000 maxblocks 3960.0 220388.7 556.5
File Copy 256 bufsize 500 maxblocks 1655.0 62487.0 377.6
File Copy 4096 bufsize 8000 maxblocks 5800.0 589552.1 1016.5
Pipe Throughput 12440.0 1075015.8 864.2
Pipe-based Context Switching 4000.0 189588.0 474.0
Process Creation 126.0 4393.8 348.7
Shell Scripts (1 concurrent) 42.4 4339.6 1023.5
Shell Scripts (8 concurrent) 6.0 590.4 983.9
System Call Overhead 15000.0 2489812.0 1659.9
========
System Benchmarks Index Score 762.2

1 parallel copy of testsでは若干Raspberry Pi 4Bが低い値となりましたが、4 parallel copy of testsの結果はRaspberry Pi 4BがRaspberry Pi 3B+よりも約100ほどスコアが高くなっていました。

Raspberry Pi 3 B+をシールドボックスでベンチマーク

3.14159265..なπの日の夜、スイッチサイエンスさんにいきなり電話をしまして、電波法に抵触しない適法上でのテストを行うためにシールドボックスをお借りしてベンチマークを実施しました。外に対してはUSBのポートがでていて、このポートと内部にあるUSBがブリッジのような形になっており、このUSBからRaspberry Pi 3B+と接続ができるようになっております。

で実際のテストはといえば中に閉じ込めて行わねばいけなくて、外部のインターネットと直接接続できる何かがでているわけでもないため、テストはおなじみのUnixbenchぐらいがやっとなのが事実です。なので、いつもながらおなじみで申し訳ないのですが、Unixbenchをとってみました。



   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com

------------------------------------------------------------------------------
   Use directories for:
      * File I/O tests (named fs***) = /home/pi/byte-unixbench/UnixBench/tmp
      * Results                      = /home/pi/byte-unixbench/UnixBench/results
------------------------------------------------------------------------------


1 x Dhrystone 2 using register variables  1

1 x Double-Precision Whetstone  1

1 x Execl Throughput  1

1 x File Copy 1024 bufsize 2000 maxblocks  1

1 x File Copy 256 bufsize 500 maxblocks  1

1 x File Copy 4096 bufsize 8000 maxblocks  1

1 x Pipe Throughput  1

1 x Pipe-based Context Switching  1

1 x Process Creation  1

1 x System Call Overhead  1

1 x Shell Scripts (1 concurrent)  1

1 x Shell Scripts (8 concurrent)  1

4 x Dhrystone 2 using register variables  1

4 x Double-Precision Whetstone  1

4 x Execl Throughput  1

4 x File Copy 1024 bufsize 2000 maxblocks  1

4 x File Copy 256 bufsize 500 maxblocks  1

4 x File Copy 4096 bufsize 8000 maxblocks  1

4 x Pipe Throughput  1

4 x Pipe-based Context Switching  1

4 x Process Creation  1

4 x System Call Overhead  1

4 x Shell Scripts (1 concurrent)  1

4 x Shell Scripts (8 concurrent)  1

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: raspberrypi: GNU/Linux
   OS: GNU/Linux -- 4.9.80-v7+ -- #1098 SMP Fri Mar 9 19:11:42 GMT 2018
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   CPU 1: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   CPU 2: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   CPU 3: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)
          
   12:20:45 up 2 min,  3 users,  load average: 0.09, 0.08, 0.03; runlevel 2018-03-14

------------------------------------------------------------------------
Benchmark Run: Wed Mar 14 2018 12:20:45 - 12:27:30
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        5064713.2 lps   (10.0 s, 1 samples)
Double-Precision Whetstone                     1224.3 MWIPS (9.9 s, 1 samples)
Execl Throughput                                507.1 lps   (29.9 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks        159405.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks           47023.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks        403956.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                              353550.8 lps   (10.0 s, 1 samples)
Pipe-based Context Switching                  63697.5 lps   (10.0 s, 1 samples)
Process Creation                               2420.9 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                   2202.1 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                    668.7 lpm   (60.0 s, 1 samples)
System Call Overhead                         687831.7 lps   (10.0 s, 1 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    5064713.2    434.0
Double-Precision Whetstone                       55.0       1224.3    222.6
Execl Throughput                                 43.0        507.1    117.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     159405.0    402.5
File Copy 256 bufsize 500 maxblocks            1655.0      47023.0    284.1
File Copy 4096 bufsize 8000 maxblocks          5800.0     403956.0    696.5
Pipe Throughput                               12440.0     353550.8    284.2
Pipe-based Context Switching                   4000.0      63697.5    159.2
Process Creation                                126.0       2420.9    192.1
Shell Scripts (1 concurrent)                     42.4       2202.1    519.4
Shell Scripts (8 concurrent)                      6.0        668.7   1114.5
System Call Overhead                          15000.0     687831.7    458.6
                                                                   ========
System Benchmarks Index Score                                         336.3

------------------------------------------------------------------------
Benchmark Run: Wed Mar 14 2018 12:27:30 - 12:34:21
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       20174506.0 lps   (10.0 s, 1 samples)
Double-Precision Whetstone                     4936.7 MWIPS (9.9 s, 1 samples)
Execl Throughput                               2474.9 lps   (29.9 s, 1 samples)
File Copy 1024 bufsize 2000 maxblocks        263690.0 KBps  (30.0 s, 1 samples)
File Copy 256 bufsize 500 maxblocks           70797.0 KBps  (30.0 s, 1 samples)
File Copy 4096 bufsize 8000 maxblocks        647637.0 KBps  (30.0 s, 1 samples)
Pipe Throughput                             1431414.8 lps   (10.0 s, 1 samples)
Pipe-based Context Switching                 221854.5 lps   (10.0 s, 1 samples)
Process Creation                               5696.9 lps   (30.0 s, 1 samples)
Shell Scripts (1 concurrent)                   4949.5 lpm   (60.0 s, 1 samples)
Shell Scripts (8 concurrent)                    644.5 lpm   (60.2 s, 1 samples)
System Call Overhead                        2640381.9 lps   (10.0 s, 1 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   20174506.0   1728.7
Double-Precision Whetstone                       55.0       4936.7    897.6
Execl Throughput                                 43.0       2474.9    575.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     263690.0    665.9
File Copy 256 bufsize 500 maxblocks            1655.0      70797.0    427.8
File Copy 4096 bufsize 8000 maxblocks          5800.0     647637.0   1116.6
Pipe Throughput                               12440.0    1431414.8   1150.7
Pipe-based Context Switching                   4000.0     221854.5    554.6
Process Creation                                126.0       5696.9    452.1
Shell Scripts (1 concurrent)                     42.4       4949.5   1167.3
Shell Scripts (8 concurrent)                      6.0        644.5   1074.2
System Call Overhead                          15000.0    2640381.9   1760.3
                                                                   ========
System Benchmarks Index Score                                         867.2

ほんと、技適の問題でおおっぴらに電源をいれられないのは口惜しい限りですが、ご参考ください。また深夜だというのに押しかけでシールドボックスをお貸しいただきましたスイッチサイエンス様に御礼申し上げます。

Raspberry Pi 3とPi DriveでUSB HDDブートをしてみよう

Raspberry Pi 3向けに、SDカード以外のブート方法を提供するための機能が追加されています。現在はベータ版の扱いなので、不具合があるかもしれませんが、試す手順なども掲載されています。

現在はUSBブート、PXEブートの2種類が紹介されています。

https://www.raspberrypi.org/blog/pi-3-booting-part-i-usb-mass-storage-boot/

https://www.raspberrypi.org/blog/pi-3-booting-part-ii-ethernet-all-the-awesome/

PXEブートに関しては私の個人ブログでも紹介していますので、興味がありましたらこちらも見てみてください。

さて、本記事ではPi Driveを使用してUSBブートをしてみたいと思います。

Pi Drive

Pi Driveとは?

Pi Driveは、Western DigialがRaspberry Pi向けにリリースした2.5インチハードディスクです。容量はPi==πにかけて314GBになっています(フォーマットすると……314GBではなくなります)。特徴的なのはインターフェイスで、SATAではなくUSBポートが搭載されています。なので、USBケーブル1本でRaspberry Piと接続できるわけです。

http://store.wdc.com/promo/97047600

正規の購入経路としてはWestern Digitalの通販サイトがあるものの、日本への輸入には対応していないようです。しかし、おおたさんがなぜか入手されたのをお借りしたので、ぺろぺろなめまわしています(なめまわしていません)。

その他謎の入手経路としては、dx.com(中国のガジェット系通販サイト)がありました。ぶっちゃけ容量単価的にはおいしくないですけども。

http://www.dx.com/p/2-5-314gb-usb-hard-drive-for-raspberry-pi-3b-2b-b-silver-black-437594

パッケージはこのような感じです。

IMG_4921

側面には円周率も……!

IMG_4922

Pi Driveはberrybootを使用したHDDブートモードが用意されています。ただ、berrybootがMicroSDカードから起動するようなので完全にSDカードレスにできるわけではないようです。また、Raspberry Pi3リリース前にリリースされたパッケージでしたので、そもそもRaspberry Pi 3には対応していないようでした。

IMG_4923

USBブートをしてみよう

USBブートをするためには以下の手順が必要になります。

Raspberry Pi側の準備

  • MicroSDカードでブートする
  • rpi-updateで最新のファームウェアにアップデート
  • USBブートを有効にする設定を記述して再起動
  • USBブートが有効になったことを確認してシャットダウン

HDDの用意

  • パーティションを切る
  • 切ったパーティションをそれぞれフォーマット
  • Raspberry PiのOSイメージからファイルコピー
  • SDカードからbootcode.binとstart.elfをコピー

作業は以下のページを参考に進めました。

https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md

Raspberry Pi側の準備

USBブートを有効にするには、最新のファームウェアにアップデートした環境で特定のオプションを有効にした状態でブートする必要があります。この作業は1度実行すれば、以降は不要のようです。

MicroSDカードに最新のRaspbianを用意して起動した後、以下のコマンドを実行します。

sudo BRANCH=next rpi-update

/boot/config.txtをエディターで開き、以下の一文を追記します。

program_usb_boot_mode=1

Raspbianを再起動したら以下のコマンドを実行して、出力が「17:3020000a」であることを確認します。

$ vcgencmd otp_dump | grep 17:
17:3020000a

HDDの用意

Raspberry PiにPi Driveを接続します。まずはpartedコマンドでパーティションを作成します。

$ sudo parted /dev/sda

(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) mkpart primary fat32 0% 100M
(parted) mkpart primary ext4 100M 100%
(parted) print
Model: WD My Passport 07BA (scsi)
Disk /dev/sda: 314GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
1 1049kB 99.6MB 98.6MB primary fat32 lba
2 99.6MB 314GB 314GB primary ext4 lba
(parted) quit

パーティションをそれぞれmkfsコマンドでフォーマットします。

sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
sudo mkfs.ext4 /dev/sda2

フォーマットしたパーティションをそれぞれ以下のようにマウントします。

sudo mount /dev/sda2 /mnt
sudo mkdir /mnt/boot
sudo mount /dev/sda1 /mnt/boot/

SDカードの中のRaspbianを、rsyncコマンドでHDDにコピーします。rsyncコマンドは別途インストールする必要があります。

sudo apt-get install rsync
sudo rsync -ax / /boot /mnt

コピーしたあとは、HDD内のいくつかのファイルでブート用のパラメータをHDD用に書き換えます。SDカードのデバイス名はmmcblk0ですが、HDDの場合はデバイス名がsdaになるためです。参考ページのようにコマンドで実行すると、一括で置き換えてくれます。

$ sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/boot/cmdline.txt
$ sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/etc/fstab

最後にSSHホスト鍵を再生成します。こちらも基本的には参考ページの通り実行します。

cd /mnt
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bind /proc proc
sudo chroot /mnt
rm /etc/ssh/ssh_host*
dpkg-reconfigure openssh-server
exit
sudo umount dev
sudo umount sys
sudo umount proc

最後にRaspberry Piをシャットダウンします。

$ sudo poweroff

HDDブート!

Raspberry Piの電源ケーブルを抜いたら、MicroSDカードを抜き取り、HDDは接続したまま電源を再投入します。少しするとHDDがスピンアップして、(一度スピンダウンしながら)Raspberry Piが起動します。

HDDから起動していることを確認するには以下のようなコマンドを実行してみると良いでしょう。


pi@raspberrypi:~ $ cat /proc/partitions
major minor #blocks name

(中略)
8 0 306677760 sda
8 1 96256 sda1
8 2 306580480 sda2
pi@raspberrypi:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 288G 1.2G 272G 1% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 6.2M 457M 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
/dev/sda1 93M 20M 73M 22% /boot
pi@raspberrypi:~ $ mount | grep sda
/dev/sda2 on / type ext4 (rw,noatime,data=ordered)
/dev/sda1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

まとめ

Pi Driveを使用して、Raspberry Pi 3でUSB-HDDブートする方法を紹介しました。MicroSDカードが不要になるので、書き換え寿命を気にする必要がなくなるのは便利かもしれません。

あと、Pi Driveについて、一つ気なるところをあげるとすると、アクセスランプの白色LEDがまぶしすぎる点でしょうか……。目に跡が残るくらい明るいんですよね……w