2014年3月17日月曜日

Raspberry Piの低消費電力化を目指した話

はじめに

これまで、


Android Bazaar and Conference 2013 AutumnMaker Faire Tokyo 2013などで展示してきました。

三輪ロボットにはnode.jsが動作するRaspberry Piが搭載されており、Firefox OS/enchantMOON/android/iOSなど、OSに依存しない操作がWeb技術により可能になっています。

Raspberry Piはモバイルバッテリーで稼働させているのですが、展示を行う上ではこのバッテリーの消費が早いのが問題でした。

Raspberry PiではLinuxのディストリビューションであるRaspbianが動作しており、シャットダウンと再起動にそれなりに時間がかかります。そのため、展示を見に来て下さっている方がたくさんいる状況でモバイルバッテリーの残量を示すLEDが赤くなると、どのタイミングでバッテリーを交換すべきか悩んでしまうわけです。

そこで、せめてモバイルバッテリー一つで展示1日(典型的には10:00~17:00)をもたせられないか、検討してみることにしました。

検討するのは

  • 電力消費の小さいWifiドングルを探す
  • Raspberry Pi上のレギュレータ(RG2)をDC-DCコンバータに変更する

の2点です。

電力消費の小さいWifiドングルを探す

最も電力を消費しそうなのはWifiドングルなので、消費電力の小さいものを探すのが効果がありそうに思いました。さらに、私がこれまで用いていたのはPCI GW-US54Miniというかなり古いものなので、これも電力消費が大きい原因の一つと思われました。

なお、この三輪ロボットは図の赤矢印で示すように、Raspberry Piと、テザリング機能をオンにしたXperia rayとの間でWifi通信を行っています(見ての通りとても近い)。


検討するWifiドングルは、NOOBS v1.3.4でインストールしたRaspbian (2014-01-07) のデフォルト状態で利用可能だった下記の4つです。
IO-DATAのものが2つありますが、これらにはハイパワータイプと超小型タイプという違いがあります。なお、下図で最も左にあるのが、これまで用いてきたPCI GW-US54Miniです。古いだけあって大きいですね。


計測は、Raspberry Piに安定化電源で5Vを供給し、その電流を読むことで行います。電流は、Raspberry Piを起動し、命令を受け付ける待機状態になった頃に読みます(実際の展示でも、待機している時間が長いと思われるため)。


なお、結果を示す前に注意ですが、以下のデータは、上の写真で示したように、非常に近い距離でWifi通信を行う際のものです。通信の距離が遠くなると電流は大きくなりますし、そうなった際に電流の大小関係は逆転する可能性があります。そのため、以下のデータは私のケースのみに当てはまる、あくまで目安と考えて下さい。

変更前
変更後
PCI GW-US54Mini 0.58A IO-DATA WN-G150U 0.45A
IO-DATA WN-G150UMK 0.39A
LOGITEC LAN-W150NU2AB 0.50A
BUFFALO WLI-UC-GNM2 0.50A

結果は上記のように、IO-DATA WN-G150UMKが最も電流の小さいWifiドングルでした。なお、実際には電流の揺らぎが大きいので、平均的な値を記しています。

どのWifiドングルもRalinkのチップを使っているようなので、あまり違いが出ないのではないかと予想していたのですが、IO-DATAの2つは電流が小さくなりました(上で記したように、あくまで私のケースでは、ですが)。

というわけで、以後、IO-DATA WN-G150UMKを用いることにします。

Raspberry Pi上のレギュレータ(RG2)をDC-DCコンバータに変更する

(注1)本項の内容は、Raspberry Piを破壊する可能性がある(文字通り壊さないと実現できないのですが…)ため、自己責任でお願いします。
(注2)本項の内容は、2014年7月に出たModel B+を用いることで同様の効果が得られるはずです。

実は上でのWifiドングルの交換でほとんど満足してしまっているのですが、後で思い返して気になるのも嫌なので、もう一つのレギュレータの交換についても試してみます。

今回検索して初めて知ったのですが、Raspberry Piを低消費電力化するには、RG2というレギュレータを交換する、というのが定番のようで、既にいくつかの報告があります。

用いたのは、取扱いが容易そうだった
です。

作業は
  1. 表面実装されたRG2を取り外す
  2. DC-DCコンバータを取り付ける
の順で進めます。

1.の作業は「Replacing the Raspberry Pi's Main Voltage Regulator」にて細かく解説されています。RG2のヒートシンクも兼ねているTABですが、ヒートシンクにはんだをモリモリと盛れば熱が効率的に伝わり簡単に取り外せます。

2.のDC-DCコンバータ取り付けですが、下図のように3点(PSピンをGNDに接続するので正確には4点)を接続しました。DC-DCコンバータはユニバーサル基板の裏に隠れています。


接続がちょっと安直すぎるかなと思いましたが、SDカードへのOSのインストール、Xを起動してのクライアントとしての利用、など一通りの機能は問題なく動作しました。

三輪ロボットでの電流を調べた見たところ、下記のようになりました。

変更前
変更後
純正Raspberry Pi +
IO-DATA WN-G150UMK
0.39A 改造Raspberry Pi +
IO-DATA WN-G150UMK
0.34A

およそ50mAだけ電流が減っていることがわかります。他のWifiドングルでも試してみましたが同様の結果が得られました。

Replacing the Raspberry Pi's Main Voltage Regulator」でもやはり50mA程度の減少が報告されていますので、こんなものでしょう。

効果は?

既に示したように、Wifiドングルの変更とDC-DCコンバータの利用により、待機状態の電流は0.58A→0.34Aと大幅に減少しました。それに伴って待機時のモバイルバッテリーの持ちが良くなっていることは確認済です。

ただし、実際の展示では

  • 三輪ロボットの操作時(=通信時)に電力消費が増える
  • 展示会場ではWifiの干渉によりさらに電力消費が増えると考えられる

などの理由により、「モバイルバッテリーで展示1日もたせる」という当初の目的が満たされているかはわかりません。

この点についてはAndroid Bazaar and Conference 2014 Springの展示にて検証してみたいと思います。

(追記 2014.3.22)
展示にて検証したところ、10:00~17:00まで、一つのモバイルバッテリー(5400mAhのQE-QL201)で動作可能でした。ちょうど展示終了の17:00間際にLEDがオレンジ→赤と変わったので、あと1、2時間はいけたのではないかと思います。

低消費電力化した効果があって良かったです。

Raspberry Pi Type Aに変更してさらなる低消費電力化

(2014.6.16追記)

上記の試みはRaspberry PiのType B (Model B)を用いたものなのですが、
Type A (Model A)を用いると
  • Ethernetインターフェイスが省略されている
  • USBが1ポートのみ
により、さらなる低消費電力化が見込めます。

ただし、私の場合USBポートとして
の2つのデバイスを用いているので、そのままではType Aへ変更できません。

そこで、シリアル通信をUSB-シリアルコンバータからGPIOのUARTピンに変更し、
USBポートを1ポートで済むようにしてみました。
下記のサイトを参考にしました。
また、条件をそろえるためにこのType AもDC-DCコンバータを用いて改造しています。
(注)なお、この「改造」は、2014年11月に出たModel A+を用いることで同様の効果が得られるはずです。

結果は下記の通りです。

変更前
変更後
改造Raspberry Pi Type B +
IO-DATA WN-G150UMK
0.34A 改造Raspberry Pi Type A +
IO-DATA WN-G150UMK
0.20A

劇的に電流が減ったので驚きです。

ここまで消費電力が下がると、現在はXperia rayで行っている映像配信を
Raspberry Pi+カメラモジュールで行っても良いかな?という気がしてきます。

ただし、今まではコマンドのみの受信だったものに、映像の送信を加えると
通信量が増えて新たなトラブルが起こるかも知れない、とは思います。

おまけ

この三輪ロボットはシールド交換の要領でBluetooth + androidによる操作も可能になっています(動画はこちら)。下図のようにPIC24FJ64GB002+Bluetoothドングル(これもちょっと古いBuffalo BSHSBD02BK)で実現していますが、こちらの電流もせっかくなので調べてみたところ、

  • 0.04A

でした。ちょうど一桁違う感じですね。





「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。

スタービルドストライクガンダムっぽいドロイド君を作った話

はじめに

ガンダムビルドファイターズの後半の主人公機、スタービルドストライクガンダムをベースにしたドロイド君をつくったのでそのまとめ。

個別写真


スタービルドストライクドロイド君

背負い物:HG BUILD CUSTOM 1/144 ユニバースブースター プラフスキーパワーゲート
青い羽根:HGBF 1/144 スタービルドストライクガンダム プラフスキーウイング
腕:BB戦士 ビルドストライクガンダム フルパッケージ

その他写真


背負い物が重いのでスタンド必須
SEEDポーズ
鎧武ドロイド、バロンドロイドと一緒に
本家のスタービルドストライクガンダムと一緒に


作り方

ほとんどプラモのパーツをくっつけているだけなので、作るのは割と簡単です。今回は腕だけでなく、背負い物のために背中にもポリキャップを仕込んでいます。あと、スタンドを利用するために底に3mm径の穴を開けました。


FXバーストドロイド君もそうですが、クリアパーツをいっぱいつけるとカッコいいですね(小並感

ではでは。

こちらもどうぞ






2014年3月7日金曜日

仮面ライダー鎧武っぽいドロイド君を作った話

はじめに

これまでガンダムAGE1タイタス風に改造したドロイド君をSNSのアイコンにして来ましたが、テレビ放映も終わってしばらくたつし、そろそろ変更したいと考えていました。

見た目のインパクトから、今回の素材は仮面ライダー鎧武をチョイスしてみました。

個別写真


ドロイド鎧武

武装:AC01 仮面ライダー鎧武 オレンジアームズ
肩パーツ:BB戦士ガンダムAGE2
腕パーツ:BB戦士ガンダムAGE3

腕がちょっと手抜きですが…
ドロイド鎧武、変身途中

後述するように、もともとのオレンジアームズをいったんばらしているので、この程度までしか変形できません。
ドロイドバロン

武装:AC02 仮面ライダーバロン バナナアームズ
肩パーツ:BB戦士ガンダムAGE2
腕パーツ:BB戦士ガンダムAGE1

こいつをSNSのアイコンにしたくて作り始めました。

ドロイドバロン、変身途中。


本家と一緒に


AC04 パインアームズを装着した鎧武と。
AC06 マンゴーアームズを装着したバロンと。



作り方

アームズチェンジシリーズのアームズをニッパーで一旦バラバラにした後、下図のように真鍮線で結合します。


ドロイド君本体の方にこの真鍮線がはまる溝をつくってはめ込みます。

腕はガンダムAGE風ドロイド君と同じく本体にポリキャップを仕込んで取り付けます。


上記のような作り方をしているので、アームズチェンジできます。

これが…


こうじゃ。カッコイイ。


おわりに

新しいSNSのアイコンを作りたいという目的は達せられたので満足です。

ただ、わりとお高いアームズチェンジシリーズをニッパーでバラバラにしなければならないので、作る際ちょっと心理的に抵抗がありました。本当は斬月も欲しいのだけど次は作らないかも。

あと、この2体は2014年3月21日に秋葉原で行われるAndroid Bazaar and Conference 2014 Springで展示する際のブースのマスコットとして登場予定です。

ではでは。

こちらもどうぞ

PandaBoard ESにUbuntu12.04 Serverを載せてmjpg-streamerを動かした話

はじめに

Raspberry Pi用赤外線カメラPi NoIRの映像をandroidで表示してみた」で、
Raspberry Piの赤外線カメラの映像をandroidにストリーミングしてみましたが、
Raspberru Piの性能では解像度320x240、フレームレート10fps程度が安定に動作する限界でした。
USBカメラを用いてもこれは大差ないと思います。

2014/3/21(金)に秋葉原で開催されるAndroid Bazaar and Conference 2014 Spring (ABC2014S)
でもこのような動画のストリーミングを用いた展示を行おうと考えているのですが、
320x240の10fpsでは動画のクオリティとしては少し物足りないです。

そのため、Raspberry Piよりも高性能なボードが必要になります。
気になるのはBeagleBoneBlackだったのですが、ABC2014Sではコンセントが使えるので、
より高性能なボードを使って確実な動作を目指すことにしました。
そこで用いたのが、職場で余っていたPandaBoard ESです。

以下、PandaBoard ESにUbuntuを導入し、mjpg-streamerを動かすまでの解説です。



OSのインストール

Omap4用のUbuntu 12.04 Serverをこちらの解説に従いインストールします。
SDカードへの書き込みは私の場合PC上のUbuntuで下記のように行いました。
/dev/sdeの部分は環境に応じて書き換えます。
$ sudo dd bs=4M if=ubuntu-12.04-preinstalled-server-armhf+omap4.img of=/dev/sde

書き込んだSDカードをPandaBoard ESに差します。
さらに、シリアルケーブルでPCとPandaBoard ESを接続し、
115200bpsでPCからPandaBoardにシリアル接続しておきます。

以上の準備の元、電源を投入すると、インストールが始まります。

デフォルトのネットワークインターフェイスはここでは有線のeth0を選択しましたが、
後でWifiドングルの設定を行うので、ここではネットワークの設定をスキップしました。

途中、インストールするパッケージを聞かれますので
  • Basic Ubuntu server 
  • OpenSSH server
を選択しました。

Wifiの設定

まず、ネットワークの接続にWifiを用いたかったのでその設定をします。
Ubuntuをインストールするとボード上のWifiデバイスがwlan0として使えるのですが、
技適の問題があることと、パフォーマンスがあまり良くないらしい(ただし試してない)ことの
2点より、市販のWifiドングルを用いることにしました。

用いたのはIO-DATAのWN-G150Uです。

まず、ボード上のWifiデバイスを無効にするために、 /etc/modprobe.d/blacklist.conf の末尾に
下記の内容を追記します。

blacklist wl12xx_sdio

記述したら再起動し、Wifiドングルをさします。

$ ifconfig -a

を実行し、wlan0が存在することを確認します。
wlan1となっていたら、 /etc/udev/rules.d/70-persistent-net.rules を編集して
wlan0として認識されるようにします。

次に、 /etc/network/interfaces の末尾にに下記の内容を追記します。
これは192.168.1.9という固定IPアドレスとするための設定なので、
環境に応じて書き換えます。

auto wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet static
address 192.168.1.9
netmask 255.255.255.0
gateway 192.168.1.1

次に、/etc/wpa_supplicant/wpa_supplicant.confを作成し例えば下記のように記述します。
接続先のSSID、暗号化プロトコル、パスフレーズなどは環境に応じて変更します。

network={
        ssid="YOUR SSID"
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        group=CCMP
        psk="YOUR_PASSPHRASE"
}


最後に、/etc/resolv.confを作成してDNSサーバーを記述します。例えば下記の通り。
本当はresolvconfに自動生成させるらしいのですが
Server版のためかうまくいかなかったので手作業で記述しました。

nameserver 192.168.1.1

以上の設定がうまくいくと、再起動によりWifiでネットワークに接続されているはずです。

mjpg-streamerのインストール

まず、OSを最新にします。

$ sudo apt-get update
$ sudo apt-get upgrade

そして、mjpg-streamerのビルドに必要な下記をインストールします。

$ sudo apt-get install build-essential libjpeg8-dev libv4l-dev imagemagick subversion

それが済んだら、下記のようにmjpg-streamerのダウンロードからビルドまで行います。

$ cd ~/
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ make

mjpg-streamerの起動

起動の前に、/etc/modprobe.d/blacklist.conf の末尾に

blacklist snd_usb_audio

を記述して再起動しておきます。一部のUSBカメラとUSBオーディオのドライバとの相性が悪いためです。
このあたりに書いてあります。

起動は下記のような流れで行います。解像度640x480のフレームレート15fpsとしています。
30fpsでもPandaBoard側は問題なく動作しますが、受信側にそこまでの性能はないと考え
控えめに15fpsとしました。

$ cd ~/mjpg-streamer
$ export LD_LIBRARY_PATH="$(pwd)"
$ sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -w ./www"

動作確認

PCのブラウザで、PandaBoardが動いているIPアドレスの8080ポートを見ると(http://xx.xx.xx.xx:8080/)、
映像が配信されていることがわかります。

この映像をandroidで受け取るには、いつも通り簡単MJPEGビューアを使います。
このアプリのソースはこちらにあります。

アプリを起動したら、メニューから「設定」を選択し、解像度を640x480に、ポート番号を8080に設定します。

ABC2014Sでは望遠カメラをストリーミングし、観光地にある望遠鏡のように
上下左右に動かすデモを行う予定です。
Wifiを使うので、うまくいくかは当日にならないとわからないのがつらいところ。

mjpg-streamerの自動起動

mjpg-streamerを自動で起動するためには、例えば下記のようにします。

mjpg-streamerをビルドしたディレクトリが/home/username/mjpg-streamer
であると仮定します。このディレクトリにstart-mjpg-streamer.shというファイルを作成し、
下記の内容を記述します。

#!/bin/sh

cd /home/username/mjpg-streamer
export LD_LIBRARY_PATH="$(pwd)"
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -w ./www"


次に、このスクリプトを/etc/rc.localに記述することで、自動起動します。

(中略)

sudo sh /home/username/mjpg-streamer/start-mjpg-streamer.sh &

exit 0 ←この行はもともとある行

おしまい。

んー、やっぱり後でBeagleBoneBlackでも試そう。