marunomaruno-memo

marunomaruno-memo

NXT 走行体 (2輪型倒立振子ロボット)の C 開発環境インストールとサンプルの実行

2009年03月26日 | ETロボコン
2009-09-06 変更
2009-07-04 変更
NXT 走行体 (2輪型倒立振子ロボット)の C 開発環境インストールとサンプルの実行
================================================================================

NXT 走行体を組み立てたら、PC に開発環境をインストールし、走行体が立つプログラム
サンプルを実行するまでの手順を示します。
なお、NXT 走行体は、タッチセンサーまで装着しておきます。

ここでは、まだ、EclipseCDT はインストールしていません。

PC は、Windows XP Professional SP2.

■参考
NXTway-GS(2輪型倒立振子ロボット) C API
http://lejos-osek.sourceforge.net/jp/nxtway_gs.htm

拡張NXTファームウェア + nxtOSEKのインストール方法(Windows XP/Vista)
http://lejos-osek.sourceforge.net/jp/installation_enf.htm


■開発環境のインストール

1. Cygwinのインストール
http://www.cygwin.com/

・インストール先は、C:/cygwin

・ここでは、Cygwin1.5.25 をインストール。
なぜか、cygdrive ディレクトリーではなく、cygrive ディレクトリーができているので
注意。


2. GNU ARMのインストール
・http://www.gnuarm.com/
・bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4.exe

・インストール時の注意点2009-09-06追記
・必ずGNUARM gcc 4.02 をインストールすること!
・[Little Endian]をチェック, [Floating Point Unit]のチェックをはずす
・[Install Cygwin DLLs...]は選択しない

・インストール先は、C:/cygwin/GNUARM


3. LEGO MINDSTORMS NXT Driverのインストール
http://mindstorms.lego.com/Support/Updates/
・upload1F7B2420-A5ED-44FF-9460-E262657029DC.zip


4. NeXTTool のインストール
・http://bricxcc.sourceforge.net/nexttool.zip
・nexttool.zip

・インストール先(解凍先)は、C:/cygwin/nexttool


5. 拡張 NXT ファームウェアのインストール
・http://bricxcc.sourceforge.net/lms_arm_jch.zip
・lms_arm_jch.zip

・解凍して、その中の lms_arm_nbcnxc_106.rfw ファイルを C:/cygwin/nexttool ディレ
クトリーにコピー


6. nxtOSEKのインストール・設定
・http://lejos-osek.sourceforge.net/jp/index.htm
・nxtOSEK_v207.zip

・/nxtOSEK/ecrobot/tool_gcc.mak ファイルを編集する。

------------------------------------------------------
    # specify GNU-ARM root directory
    ifndef GNUARM_ROOT
    GNUARM_ROOT = /cygrive/C/cygwin/GNUARM
    endif

    # specify NeXTTool root directory
    ifndef NEXTTOOL_ROOT
    NEXTTOOL_ROOT = /cygrive/C/cygwin/nexttool
    endif
------------------------------------------------------


・なお、Cygwin1.5.25 でインストールしたとき、/cygdrive/C/cygwin ではなく、
/cygrive/C/cygwin なので、注意。


■実行環境のインストール

7. 拡張 NXT ファームウェアの NXT へのアップロード

7.1 NXTをファームウェアアップデートモードにする

・リセットボタンを4秒以上押す


7.2 拡張 NXT ファームウェアのアップロード

$ cd C:/cygwin/nexttool
$ ./NeXTTool.exe /COM=usb -firmware=lms_arm_nbcnxc_106.rfw


7.3 リセット

・画面が砂嵐になったら、リセットボタンを押す


■ サンプルのコンパイルと実行の確認

9. HelloWorld

参考
拡張NXTファームウェア搭載のNXTへのnxtOSEKプログラムのアップロード方法
http://lejos-osek.sourceforge.net/jp/howtoupload_enf.htm

・NXT走行体の電源を入れる

・次のコマンドで、プログラムをコンパイル・リンク・アップロード
------------------------------------------------------
$ cd /nxtOSEK/samples/helloworld/
$ make all
Compiling ../../ecrobot/../toppers_osek/kernel/alarm.c to alarm.o
    :
Assembling ../../ecrobot/../toppers_osek/config/at91sam7s-gnu/irq.s to irq.oram
Generating binary image file: helloworld_OSEK_rom.bin
Generating binary image file: helloworld_OSEK_ram.bin
Generating binary image file: helloworld_OSEK.rxe

$ sh ./rxeflash.sh
Executing NeXTTool to upload helloworld_OSEK.rxe...
helloworld_OSEK.rxe=17072
NeXTTool is terminated.
------------------------------------------------------


・標準 NXT ファームウェアの操作手順と同じように、アップロードした nxtOSEK プログ
ラムを実行

今回は、次の操作で NXT 画面に表示が出る。
[My Files] - [Software files] - [helloworld_OSEK] - [オレンジボタン] - [右ボタン]

[右ボタン]で、プログラムは終了する。
[EXIT]で、NXT の電源が切れる。


10. NXTway-GS C APIを使用したサンプルプログラム nxtway_gs

「NXTway-GS C APIを使用したサンプルプログラムはBluetooth通信を介したR/Cロボット
アプリケーションで、PC用ゲームパッドコントローラによってラジコン操作がおこなえま
す。ロボットのラジコン操作を実現するには、PC側にNXT GamePadというソフトウェアを
別途インストールする必要があります。サンプルプログラムでは更に超音波センサを使用
した障害物回避機能も実装されており、ロボットの前方約25cmの範囲内に障害物がある場
合、ロボットは自動的に後進して障害物を回避します。」

参考
NXTway-GS(2輪型倒立振子ロボット) C API
http://lejos-osek.sourceforge.net/jp/nxtway_gs.htm


・次のコマンドで、プログラムをコンパイル・リンク・アップロード
------------------------------------------------------
$ cd /nxtOSEK/samples/nxtway_gs
$ make all
Compiling ../../ecrobot/../toppers_osek/kernel/alarm.c to alarm.o
    :
Assembling ../../ecrobot/../toppers_osek/config/at91sam7s-gnu/irq.s to irq.oram
Generating binary image file: NXTway_GS_OSEK_rom.bin
Generating binary image file: NXTway_GS_OSEK_ram.bin
Generating binary image file: NXTway_GS_OSEK.rxe

$ sh ./rxeflash.sh
Executing NeXTTool to upload NXTway_GS_OSEK.rxe...
NXTway_GS_OSEK.rxe=25264
NeXTTool is terminated.
------------------------------------------------------


・プログラムの実行は、「HelloWorld」と同じ。


11. 「NXTway-GS 倒立振子制御 C API 解説書」のサンプル

・次のコマンドで、nxtway_gs ディレクトリーを nxtway_gs_sample ディレクトリーにコ
ピーして、クリーンアップ
------------------------------------------------------
$ cd /nxtOSEK/samples/
$ cp -r nxtway_gs/ nxtway_gs_sample/
$ cd nxtway_gs_sample/
$ make clean
Removing kernel config files
Removing objects
Removing targets
Removing map files
Removing upload scripts
------------------------------------------------------


・nxtway_gs.c と nxtway_gs.oil ファイル名を、sample.c とsample.oil に変更
------------------------------------------------------
$ mv nxtway_gs.c sample.c
$ mv nxtway_gs.oil sample.oil
------------------------------------------------------


・Makeファイルを以下のように変更
------------------------------------------------------
# Target specific macros
TARGET = sample_OSEK

NXTOSEK_ROOT = ../..

# nxtway_gs_balancer library desiged for NXTway-GS two wheeled self-balancing robot
USER_INC_PATH= $(NXTOSEK_ROOT)/ecrobot/nxtway_gs_balancer
USER_LIB = nxtway_gs_balancer

# using NXT standard tires (not Motorcycle tires)
#USER_DEF = NXT_STD_TIRE

# User application source
TARGET_SOURCES := 
        balancer_param.c 
        sample.c

# OSEK OIL file
TOPPERS_OSEK_OIL_SOURCE := ./sample.oil

# below part should not be modified
"Makefile" 25 lines, 606 characters
------------------------------------------------------


・sample.c を変更
------------------------------------------------------
/**
******************************************************************************
** ファイル名 : sample.c
**
** 概要 : NXTway-GS(2輪倒立振子ロボット)のTOPPERS/ATK(OSEK)用サンプルプログラム
**
******************************************************************************
**/
#include "kernel.h"
#include "kernel_id.h"
#include "ecrobot_interface.h"
#include "balancer.h" /* 倒立振子制御用ヘッダファイル */
#define GYRO_OFFSET 610 /* ジャイロセンサオフセット値(角速度0[deg/sec]時) */
//*****************************************************************************
// 関数名 : user_1ms_isr_type2
// 引数 : なし
// 戻り値 : なし
// 概要 : 1msec周期割り込みフック関数(OSEK ISR type2カテゴリ)
//*****************************************************************************
void user_1ms_isr_type2(void) { /* 空 */ }   // 2009-03-29 修正 
//*****************************************************************************
// タスク名 : OSEK_Task_bg
// 概要 : バックグラウンド(常駐)タスク
//*****************************************************************************
TASK(OSEK_Task_bg)
{
    signed char pwm_L, pwm_R; /* 左右モータPWM出力 */
    while (ecrobot_get_touch_sensor(NXT_PORT_S1) == 0) ; /* タッチセンサ押下待機 */
    balance_init(); /* 倒立振子制御初期化 */
    nxt_motor_set_count(NXT_PORT_C, 0); /* 左モータエンコーダリセット */
    nxt_motor_set_count(NXT_PORT_B, 0); /* 右モータエンコーダリセット */
    while(1) 
    {
        /* 倒立振子制御 */
        balance_control(
        (float)0, /* 前後進命令 */
        (float)0, /* 旋回命令 */
        (float)ecrobot_get_gyro_sensor(NXT_PORT_S4), /* ジャイロセンサ値 */
        (float)GYRO_OFFSET, /* ジャイロセンサオフセット値 */
        (float)nxt_motor_get_count(NXT_PORT_C), /* 左モータ回転角度[deg] */
        (float)nxt_motor_get_count(NXT_PORT_B), /* 右モータ回転角度[deg] */
        (float)ecrobot_get_battery_voltage(), /* バッテリ電圧[mV] */
        &pwm_L, /* 左モータPWM出力値 */
        &pwm_R); /* 右モータPWM出力値 */
        nxt_motor_set_speed(NXT_PORT_C, pwm_L, 1); /* 左モータPWM出力セット */
        nxt_motor_set_speed(NXT_PORT_B, pwm_R, 1); /* 右モータPWM出力セット */
        systick_wait_ms(4); /* 4msecウエイト */
    }
}
------------------------------------------------------


・sample.oil を変更
------------------------------------------------------
/**
******************************************************************************
** ファイル名 : sample.oil
**
** 概要 : サンプル用OSEK OIL(OSEK Implementation Language)ファイル
**
** ※OSEK OIL記述方法詳細については
** nxtOSEKtoppers_osekdocTOPPERS_OSEKカーネルSG取扱説書.pdfを参照してください。
**
******************************************************************************
**/
#include "implementation.oil"
CPU ATMEL_AT91SAM7S256
{
    OS LEJOS_OSEK /* nxtOSEKの旧名 */
    {
        STATUS = EXTENDED;
        STARTUPHOOK = FALSE;
        ERRORHOOK = FALSE;
        SHUTDOWNHOOK = FALSE;
        PRETASKHOOK = FALSE;
        POSTTASKHOOK = FALSE;
        USEGETSERVICEID = FALSE;
        USEPARAMETERACCESS = FALSE;
        USERESSCHEDULER = FALSE;
    };
    APPMODE appmode1{};
    /* OSEK_Task_bgタスク設定 */
    TASK OSEK_Task_bg
    {
        AUTOSTART = TRUE /* StartOSで自動的にREADY */
        {
            APPMODE = appmode1;
        };
        PRIORITY = 1; /* 最低優先度 */
        ACTIVATION = 1;
        SCHEDULE = FULL;
        STACKSIZE = 512; /* bytes */
    };
};
------------------------------------------------------


・次のコマンドで、プログラムをコンパイル・リンク・アップロード
------------------------------------------------------
$ cd /nxtOSEK/samples/nxtway_gs
$ make all
Compiling ../../ecrobot/../toppers_osek/kernel/alarm.c to alarm.o
    :
Assembling ../../ecrobot/../toppers_osek/config/at91sam7s-gnu/irq.s to irq.oram
Generating binary image file: NXTway_GS_OSEK_rom.bin
Generating binary image file: NXTway_GS_OSEK_ram.bin
Generating binary image file: NXTway_GS_OSEK.rxe

$ sh ./rxeflash.sh
Executing NeXTTool to upload sample_OSEK.rxe...
sample_OSEK.rxe=19408
NeXTTool is terminated.
------------------------------------------------------


・プログラムの実行は、「nxtway_gs」と同じだが、画面にはなにも表示されなくなった
ら、タッチセンサーを押下することによって倒立するようになる。

以上