2014年2月1日土曜日

BrickPi を入手しました。

 KickStarter 等で(自分の中で)少し話題になっていた BrickPi を入手できたので、試してみました。今回は、 ROBO PRODUCT さん から入手しました。 ROBO PRODUCT さんは、LEGOのマニアックなセンサーとかその筋の人にはたまらないものを扱っている販売店さんです。自分も以前に、NXShield-Mx とか、 PFMate とか Motor Multiplexer とか、日本では入手しにくい感のあるマインドセンサー社とかデクスタインダストリー社の製品をお世話してもらっています。

 まずは BrickPi のサイトにある Getting Started に従って、組み立てと設定です。

 今回は、 ROBO PRODUCT さん から BrickPi Starter Bundle というBrickPiを始めるのに便利な一式セットがあったのを入手しました。無線LANドングル等は自分の使いたい別のものがあったりするので、無駄になるパーツもあるのですが、何より「BrickPiの環境を構築済みのwheezy raspbianイメージ入りSDカード」がついてくるので、セットアップの手間が省けるだろうということで・・・。
 この部分が楽しいんだ!(まあ、自分もわりとそうなんですが、今回は、手抜きしました)という人は自分で構築するほうがいいかもしれません。

 まずは、届いたダンボールを開梱。




 この時点でちょっと残念だったのが、バッテリーボックスが単三×8本をセットして006Pで使うようなスナップ電極が付いている秋月とかでも売っているような普通のものだったこと。バッテリボックスもMindstorms のペグ用の穴が開いていてビームに固定できるようになっていると思ったんですが、そうはなっていませんでした。せっかく、本体(BrickPiのアクリルケース)はペグ用の穴が切ってあってビーム等とジョイントできるようになっているのに、電池ボックスの固定方法が提供されないのは片手落ちで残念なところ。ROBO PRODUCTさんで扱っているマインドセンサー社の電池ボックスはペグ穴の開いた羽根がついていて、そういったものを期待していたんですが・・・。

 では、組み立てを行います。


 ベースとなる上下のアクリル板は表裏に保護シート(紙)が貼ってあるので、剥がします。



 下側のアクリル板(ロゴの入っていない方)にRaspberry Piを固定するための短い支柱を2本固定します。



 この時点で、ネジを完全に閉め込んで支柱を固定してしまうよりは、少し、ゆるめておいて、Raspberry Pi を載せた後、順次、締めあげて、固定したほうがいいでしょう。


 次にRaspberry Piを2本のシャフトに合わせて固定します。(写真がぶれてしまいました・・・スミマセン)。先ほど、少しゆるめておいた裏側のネジとRaspberry Pi側のネジの両方4本ともを忘れずに締め上げます。


 Raspberry Pi を固定したら、次は長い支柱4本を下側プレートの四隅にネジ止めします。ここも完全に締め込まずに、あとで、全体を交互に締めていくようにしました。



 次にBrickPiの本体というかシールドというかをRaspberry Piに挿します。コネクタの位置の関係で向きを間違えて挿すということも無いかと思います。ピンがずれないように確認して、コネクタを奥まで差し込みます。ただ、コネクタをおくまでさしても、このシールドがけっこうグラグラします。シールドの裏側のRaspberry PiのEthernetコネクタにあたる辺りにゴム足か何かを貼り付けておいたほうがいいかもしれません。


 最後に天板(ロゴの入ったアクリル板)を取り付けます。上の写真はまだ、それぞれのネジを締めていないので形が歪んでいますが、ネジを締めればカッチリ固定されます。





 ひと通りネジを締めて、外観が組みあがりました。次に、起動と各種設定に進みますが、自分は元のSDカードはバックアップ用に保存することにして、元のSDカードから win32diskimager を使って別のmicroSDカードにイメージを複製、スイッチサイエンスさんで買ったRaspberry Pi 用のmicroSDカードアダプタで設定しました。




 組み立てが終わったので、起動して、ソフトウェアの設定、開発環境・アプリのインストール等を行っていきます。通常、Raspberry Pi をインストールした直後は SSHが無効になっていて、 VNCもインストールされていないので、HDMIモニタとUSBキーボド・マウスと有線LANを接続して、起動して設定する必要があります。今回もそのようにして起動したのですが、どうやら、このBrickPiとして提供されるSDカードイメージはSSHの許可設定もVNCのインストール(とサービスの自動起動も)既に行っておいてくれている状態です。ですので、ルータ側などでDHCPで取得したアドレスがわかれば、いきなりネットワーク経由での接続が可能です。ちなみに SSH での接続の ユーザ名/パスワードは Raspbian のデフォルト同様 pi / raspberry です。VNCのポートは 5901 、接続パスワードは raspberr (yは付かない)です。VNCで接続した時の壁紙がこんな感じでカッコいいです。


 ここからは、SSHとVNC接続でのリモートでのセットアップ作業です。

 とりあえず、アップデート。

   sudo apt-get update
   sudo apt-get upgrade

 次に無線LANを設定しました。今回は BrickPi Starter Bundle  に入っている無線LANドングルは使わず、自分がいつもRaspberry Piで常用している Planex の BT-micro3H2X を使いました。USBに挿すだけで、Raspberry Pi の 「WiFi Config」でGUIから設定可能です。のはず・・ですが、USBに接続してリブートしても WiFi Config の設定画面に表示されません。 lsusb ではデバイスは見つけています・・・。おかしいと思い、ifconfig すると、なんとwlan0が存在します。しかし、そのIPは自分の環境では全くのでたらめな数値・・・。ここで、BrickPiの設定ガイドの無線LANのページを見たところ、どうやら固定IPを振るような設定が /etc/network/interfaces ファイルに記述されていました。これを

   auto lo
   
   iface lo inet loopback

   iface eth0 inet dhcp

   allow-hotplug wlan0
   ifae wlan0 manual
   wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
   iface default inet dhcp

のように書き換えて、再起動して再度「Wifi Config」を起動することで、GUIから無線LAN設定ができるようになりました。この辺りは、固定IPで使うかDHCPで使うか等によって適宜使い分けが必要かと思います。 これで無線LANが使えるようになったので、有線LANケーブルは外してしまいます。

 OSを素からインストールしている場合は、wiringPi等色々なものをインストールする必要がありますが、今回はSDカードを購入しているので、最低限必要なものは入っています。なお、このカスタムSDイメージはここからダウンロードできるものが同じと思われます。(未確認)
 まずは、普段 Raspberry Pi の環境にインストールしているものを過去のメモを参考にしてインストールして、自分好みの環境を作りました。この辺りは、使われる方のお好みで。OpenCVのコンパイルなんかは非常に時間がかかるので、必要になった時にやればいいと思います。自分は

   Geany (プログラミング用エディタ)
   Chromium (ブラウザ)
   OpenCV
   guvcview

等をインストールしました。
 次に、サンプルのソース類を git から落としてきます。python と C のサンプルを落としてきます。

   git clone https://github.com/DexterInd/BrickPi_Python.git

   git clone https://github.com/DexterInd/BrickPi_C.git

 それぞれ、BrickPi_PythonBrickPi_C フォルダが作成され、サンプルファイルなどが展開されます。BrickPi_Python フォルダに移動して、setup.py を実行します。

   cd BrickPi_Python
   sudo apt-get install python-setuptools
   sudo python setup.py install

 Python の場合はコードの冒頭で import BrickPi すれば、ライブラリが使えるとのこと。
 C の場合は BrickPi_C/Drivers フォルダに BrickPi.htick.h というヘッダファイルがあります。また、wiringPi の wiringPi.h もインクルードする必要があります。コンパイル時にはwiringPi のライブラリをリンクする必要があります。以下の様なコマンドラインでの一例が BrickPiのサイトにありました。

   gcc -o program "Test BrickPi lib.c" -lrt -lm -L/usr/local/lib -lwiringPi

 ためしに、サンプルソースをビルドしてみます。

   cd ~/BrickPi_C/Project_Examples/simplebot
   gcc -o simplebot_simple simplebot_simple.c -ltr -lm -I/home/pi/BrickPi_C/Drivers -L/usr/local/lib -lwiringPi

 これで、 同フォルダに simplebot_simple という実行ファイルができるはずです。
 また、エディタとして Geany を使いたい場合は、


 こんな感じでビルドのオプションのところに前述のオプションを入れておけば、OKです。ただ、Warningがいっぱい出ました。詳しくは調べていません。


 自分は、最近はもっぱら、「VisualGDB」を愛用しています。有償ですが、Windows上のVisual Studioから Raspberry Pi や Beaglebone Black をクロス開発することが出来ます。


 こちらもMakefileのセッテイングに先ほどのビルドオプションをそれぞれ該当するフィールドに入れておくことでビルド可能です。


 自分はCでの開発が多いと思いますので、この VisualGDB(Visual Studio)でのクロス開発(正確にはリモート接続のセルフコンパイルとWindows上での純粋なクロスコンパイルと両方の方法が選択できる) か Geany でのセルフ開発がメインになると思いますが、Web系アプリを応用したロボットなどのために Python の開発環境も用意しておきます。 自分は Raspberry Pi での Python 開発には Adafruit の webIDE を利用させてもらっています。Adafruitのサイトに構築方法が解説されています。

   curl https://raw.github.com/adafruit/Adafruit-WebIDE/alpha/scripts/install.sh | sudo sh

 下記のような画面が表示されてインストールには数分かかります。


 インストールが終わると、通常だと、 http://xxx.xxx.xxx.xxx/ (xxxはRaspberry Pi のアドレス)でアクセスできるんですが、Webサーバの port 80 はWeb系アプリを動かすときのためにとっておきたいので、ポートの設定を変更します。

   redis-cli
   HMSET server port 3000
   exit

 これで、ポート3000での受けに変わります。一旦、sudo reboot して再起動します。
    
   http://xxx.xxx.xxx.xxx:3000/ (xxxはRaspberry Pi のアドレス)

に他のPCのブラウザでアクセスするとIDEへのログイン画面が表示されます。初回のみBitbucketの登録画面が表示されるので、登録作業を行います。ログインすると、こんな感じの画面になります。


 Webブラウザですが、オートインデントや色表示等ができます。


 これで、CとPythonでの開発環境も準備出来ました。

 ところで、無線LANドングルですが、 BrickPi Starter Bundle  に入っているコンパクトなものを使わずに、なぜわざわざ出っ張りの大きい Planex の BT-micro3H2X を使ったかというと、このドングルは無線LANとBluetoothがコンボになっているため、貴重なUSBポートを1つ節約できるからです。

 では、次にBluetoothを使えるように準備します。

   sudo apt-get install bluetooth bluez-utils bluez-compat bluez-hcidump
   sudo apt-get install libusb-dev libbluetooth-dev

で、Bluetooth 周りのインストールを行い、

   /etc/init.d/bluetooth status

と入力して、"[OK] bluetooth in running." のメッセージが返るのを確認します。


 Bluetooth が使えるようになったところで、せっかくなので、ロボット用途を前提として、PS3のDualShock3 とペアリングします。以前のメモ を見ながら・・・
 まずは、ペアリングツールを準備します。

   mkdir sixpair
   cd sixpair
   wget "http://www.pabr.org/sixlinux/sixpair.c" -O sixpair.c

でおとしてきて、コンパイルします。

   gcc -o sixpair sixpair.c -lusb

 コンパイルが通ったら、一旦、USBケーブルでDualShock3 と Raspberry Pi を接続します。



   sudo ./sipair

とすると

   Current Bluetooth master: xx:xx:xx:xx:xx:xx
   Setting master bd_addr to: xx:xx:xx:xx:xx:xx

のような表示が出て、ペアリングが行われます。


 ペアリングが成功したら、DualShock3 と Raspberry Pi の USBケーブルを外します。



 次に QtSixA のソースコードをダウンロードして、sixadの部分をコンパイルします。

   cd ~
   mkdir QtSixA
   cd QtSixA
   wget "https://sourceforge.net/projects/qtsixa/files/QtSixA%201.5.1/QtSixA-1.5.1-src.tar.gz/downloard" -O QtSixA-src.tar.gz

 ダウンロードしたファイルを展開します。

   tar zxvf QtSixA-src.tar.gz

 sixad のディレクトリに移動して、コンパイルしてインストールします。

   cd QtSixA-1.5.1/sixad
   make
   sudo make install

 sixad を起動します。

   sudo sixad -start

 DualShock3 の PSボタンを押して接続します。"Connected Sony Entertainment Wireless Controller" と表示されて、接続されます。別のターミナルをもう一つ起動して、

   cat /dev/input/js0

で、コントローラを操作して、バイナリが変動する表示が行われればOKです。Ctrl+Cで中断します。

とりあえず、利用のための準備はこんなところでしょうか。次は時間を見つけて、モータや各種センサを単体で動作させて試験するのと、車輪かクローラタイプのロボットをLEGOで組んで動かせればと思います。いつになるか、わからないけどね。