2013年12月13日金曜日

Raspberry Pi (その前に Mac で)+ OpenCV + OpenNI + Xtion Pro Live

まず、Mac でいろいろやってみる。
OpenCV は MacPorts で opencv @2.4.7_1+openni+python27 をインストールする。
OpenNI も MacPorts で一応入れたものの・・・openni @1.5.7.10_0
OpenNI-MacOSX-x64-2.2 をダウンロード。
「OpenNI-MacOSX-x64-2.2/Samples/Bin」にあるサンプルは動作している。

次に、Samples のソースをいじる前に、make できることを確認する。
make すると deprecated のエラーがでてしまう。
Makefile を修正してコンパイルオプションに「-Wno-deprecated」を追加する。
例を示す。
<<修正前>>
CFLAGS += -Wall -D_CLOSEST_POINT
<<修正後>>
CFLAGS += -Wall -D_CLOSEST_POINT -Wno-deprecated



ClosestPointViewer を make するには、MWClosestPoint を先に make しておかなければならない。
MWClosetPointApp を make するときも、先に MWClosestPoint を make しておかなければならない。

まず、MWClosestPoint/Bin は削除してから、MWClosestPoint を make する。

次に、ClosestPointViewer/Bin/ にある Intermediate と x64-Release の二つのディレクトリは空にする。
MWClosestPoint/Bin/x64-Release/libMWClosestPoint.dylib を、先ほど空にした ClosestPointViewer/Bin/x64-Release/ にコピーする。
コピーコマンドはこれ。
$ cp MWClosestPoint/Bin/x64-Release/libMWClosestPoint.dylib ClosestPointViewer/Bin/x64-Release/
そして、ClosestPointViewer を make する。

同様に、MWClosestPointApp/Bin/ にある Intermediate と x64-Release の二つのディレクトリは空にする。
MWClosestPoint/Bin/x64-Release/libMWClosestPoint.dylib を、先ほど空にした MWClosestPointApp/Bin/x64-Release/ にコピーする。
コピーコマンドはこれ。
$ cp MWClosestPoint/Bin/x64-Release/libMWClosestPoint.dylib MWClosestPointApp/Bin/x64-Release/
MWClosetPointApp を make する。

make できることが確認できたので、ソースをいろいろいじってみることにする。

2013年12月5日木曜日

Raspberry Pi + ビュートローバー ARM VS-WRC103LV (Mac に LPCXpresso をインストール)

ビュートローバー ARM VS-WRC103LV のソフトを作る話のメモ。
Mac に LPCXpresso をインストールし、C でソフトを作る。
NXP のダウンロードサイトから LPCXpresso をダウンロードしてインストールする。
アクティベーションがちょっと面倒。

2014.04.03 時点では、lpcxpresso_7.1.1_125.pkg がダウンロードされる。
これを開くとインストーラーが動き出す。アプリケーションフォルダに「lpcxpresso_7.1.1_125」という名前のフォルダがつくられるが、どれがアプリの本体なのかわからない。
「Open lpcxpresso」というファイルがあるけれど、どこかのファイルへのエイリアスになっている。調べると・・・「Open lpcxpresso -> lpcxpresso/lpcxpresso.app/Contents/MacOS/lpcxpresso」と、なっている。
lpcxpresso フォルダの中をみると「lpcxpresso」という名前のアプリケーションがある。これだね。これをダブルクリックすると立ち上がる。Dock のオプションで「Dock に追加」をしておくと、今後は Dock から起動できる。

で、この lpcxpresso_7.1.1_125.pkg は、USB 関係で使われる SciInit() で問題が発生する。帰ってこない。ここで止まってしまう。
これでは使い物にならないので、7.1.1 から 7.0.0 に戻した。

2014.05.23 現在、バージョン 7.2.0_153 が公開されていて、これは SciInit() の問題はない。7.1.1 は使えないが、 7.2.0_153 は使える。
ほかにも問題が改善されている。原因不明だが、ビュートローバーのセンサーの値を返すように修正し、その後、リビジョンを返す関数を追加した。しかし、そのリビジョンはなぜかセンサーの値になっていた。この問題は 7.0.0 で発生していたが、7.2.0 では正しくリビジョンを返すようになった。かなりいい加減な C の処理系らしい。

サンプルでついてくる VS-WRC103LV_Sample_LED_20110118_1104.zip を解凍してビルド。
その後、VS-WRC103LV に書き込む。Debug フォルダに作成された「VS-WRC103LV_Sample_LEDなんたらかんたら.bin」をマウントした VS-WRC103LV にコピーするのだが、実行すると動かない。
ファインダからコピーすると不可視ファイルをいくつかつくるので、それが邪魔をしてうまくいかないと思われる。ちなみに Ubuntu Desktop でも試してみるが同様にうまくいかない。Mac でビルドした bin ファイルを Windows でコピーすると動くので、LPCXpresso は正しく動いているようだ。
Mac のターミナルでコピーすると正常に動いたので、そのときの手順をメモしておく。

  1. VS-WRC103LV を Mac に接続する
    VS-WRC103LV のボタンを押したまま Mac に接続し、マウントされたらボタンを話す。このとき、VS-WRC103LV の電源は OFF にしておく。
    マウントした VS-WRC103LV をファインダで開かないで、そっとしておく。

  2. ターミナルから次のコマンドで、古い farmware.bin を削除する
    $ rm /Volumes/CRP\ DISABLD/firmware.bin

  3. 新しい bin ファイルをコピーする
    「New_VS-WRC103LV_Firmware.bin」をコピーしている例。
    $ cp New_VS-WRC103LV_Firmware.bin /Volumes/CRP\ DISABLD/

  4. VS-WRC103LV のマウントを解除し、イジェクトする
    イジェクトする前に df コマンドで、Filesystem 名の確認を行う。
    ここでは「/dev/disk1」になっている。
    $ df -h
    Filesystem Size Used  Avail Capacity iused ifree %iused Mounted on
    /dev/disk1 32Ki 7.0Ki  25Ki    22%      16     0  100%  /Volumes/CRP DISABLD

    df コマンドで調べた Filesystem 名で VS-WRC103LV をイジェクトする。
    $ sudo diskutil eject /dev/disk1

  5. VS-WRC103LV を Mac から取り外す

付属している前進・後退のソフトをちょっと修正して LED を点滅させている例。
#include "lpc13xx.h"
#include "gpio.h"
#include "vs-wrc103.h"
#include "ixbus.h"

int main(void) {
    int ii;
    const unsigned short MainCycle = 60;
    Init(MainCycle);
    LED(3);
    while (getSW() != 1) {
        // ボタンが押されるまで待つ
        Wait(50);
        LED(0);
        Wait(50);
        LED(3);
    }
    LED(0);
    while (getSW() == 1) {
        ; // ボタンが離されるまで待つ
    }

    while (1) {
        // 前進
        Mtr_Run_lv(10000, -10000, 0, 0, 0, 0);
        LED(3);
        Wait(1000);
        // 停止
        Mtr_Run_lv(0, 0, 0, 0, 0, 0);
        LED(0);
        Wait(1000);
        // 後進
        Mtr_Run_lv(-10000, 10000, 0, 0, 0, 0);
        for (ii = 0; ii < 10; ii++) {
            LED(1);
            Wait(50);
            LED(2);
            Wait(50);
        }
        // 停止
        Mtr_Run_lv(0, 0, 0, 0, 0, 0);
        LED(0);
        Wait(1000);
    }
    return 0;
}

=== そのほか
LPCXpresso を起動した状態で、何もしていないのにエラーがでている。
これは気にしなくてもいい?
Description Resource Path Location Type
make: *** [src/main.o] Error 1     C/C++ Problem


Linux では注意!
ソースの中では「lpc13xx.h」となっているが、実際は「LPC13xx.h」と、大文字も使っているファイルがいくつかある。Mac/Win ではファイル名の大文字と小文字を区別しないので問題は起きない。でも Linux では大文字と小文字を区別するので、ファイルが見つからないというエラーが発生する。ファイル名を直すか、ソースを直す処置が必要。


LPCXpresso は Eclipse 
Eclipse のプラグインがそのまま使える。
MercurialEclipse をインストールして使っている。



LPCXpresso の設定変更のメモ:
タブはスペースにしたい。
General -> Editors -> Text Editors の Insert spaces for tabs にチェック。
C/C++ -> Code Style -> Formatter で、新しい profile を作成する。
その中で、Indentation を Spaces only にする。

Code Style の設定は、Source メニューの Format の時に使われる。