marunomaruno-memo

marunomaruno-memo

Lego Mindstoms NXT - leJOS - (14) ジャイロセンサー

2009年03月30日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (14) ジャイロセンサー

各速度を測定できるジャイロセンサーを使った例です。
なお、このジャイロセンサーは、Lego Mindstomes NXT の基本セットにも、おもちゃセッ
トにも含まれていませんので、別途購入する必要があります。

ジャイロセンサーは、HiTechnic 社の NXT Gyro Sensor (Model: NGY1044) です。
HiTechnic Product: http://www.hitechnic.com/

HiTechnic 社の説明から
---
HiTechnic社製ジャイロセンサ(NGY1044)は光センサ等と同様に10ビットの分解能を持った
A/Dデータとして取得されます。ジャイロセンサの更新レートは約300回/秒で、±360度の
測定範囲に対応します。
---

▼ジャイロセンサーから取得できる値?
---
ジャイロセンサーは、角速度(1秒間に何度動いたか)を検出するセンサー。正しくは
「ジャイロスコープ」というようで、ジャイロセンサーは和製英語らしいが、上記製品も
Gyro Sensor なので、どうなんだろう。(どうでもいいこと)

角速度自体は、スカラー値のようだが、この説明だと、当然、正負値が取得できる。
実際に、走行体に載せるとこれは3次元なので、実は各周波数を取得しているのかな? だ
としたら、非負値しか取得できないと思うが、実際には符号付値で取得できている。何か
を基準に、1次元に落としているんだろうか。その基準が、オフセット値? でも、オフセ
ット値もスカラー値なので、もう1次元分は何なのかな?
不思議な気がする。

もっとも、安い(数千円)のセンサーだから、角速度だけを取得しているだけかもしれない。
じゃあ、オフセット値は何? 何かの基準だと思われるが、0度の位置を表しているのかな?
実際のジャイロセンサーのソース(GyroSensor.java)を見ると、オフセットは 600 がデフ
ォルト値として設定されている。そして、readValue メソッドは、単に、
port.readRawValue() - offset
を返しているだけ。

□ウィキペディアからの説明の引用:

ジャイロセンサーは、運動している(ある速度をもっている)モノが回転すると、その速
度方向と垂直に「コリオリの力」が働くという物理現象を利用して角速度を検出している。
(http://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AD%E3%82%B9%E3%8
2%B3%E3%83%BC%E3%83%97)

角速度は、物体や質点の回転の速さを表す量であり、角度と時間の商で定義される。量記
号は ω(ギリシャ文字の小文字のオメガ)。角速度は3次元空間ではベクトル量として定
義でき、その大きさが角周波数である(ω = |→ω|)。単位は通常ラジアン毎秒(rad/
s)を用いる。
(http://ja.wikipedia.org/wiki/%E8%A7%92%E9%80%9F%E5%BA%A6)

コリオリの力は、回転座標系(Rotating reference frame)上で移動した際に移動方向と
垂直な方向に移動速度に比例した大きさで受ける慣性力の一種。
(http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AA%E3%82%AA%E3%83%AA%E3%81%AE%E5%8
A%9B)
---


■ジャイロセンサー値を取得するアプリケーション

取得している間の最小値と最大値も合わせて表示する。取得の間隔は 50 ミリ秒。

□GyroSensor01.java
------------------------------------------------------
import lejos.nxt.Button;
import lejos.nxt.GyroSensor;
import lejos.nxt.LCD;
import lejos.nxt.SensorPort;

/**
 * ジャイロセンサー値を取得するアプリケーション。
 * @author maruno
 * @version 1.0, 2009/03/28
 * @since 1.0
 */
public class GyroSensor01 {

    public static void main(String[] args) throws Exception {

        // ジャイロセンサー・オブジェクトをポート4で生成する。
        GyroSensor gyroSensor = new GyroSensor(SensorPort.S4);      // (1)
        
        int value = gyroSensor.readValue();    // (2)
        int min = value;
        int max = value;

        // Escapeボタンが押されるまでループ
        while (!Button.ESCAPE.isPressed()) {
            min = Math.min(min, value);
            max = Math.max(max, value);
            LCD.clear();
            LCD.drawString("value = " + value, 0, 1);
            LCD.drawString("min   = " + min, 0, 2);
            LCD.drawString("max   = " + max, 0, 3);
            Thread.sleep(50);
            value = gyroSensor.readValue();
        }
    }
}
------------------------------------------------------


プログラムのパターンは、今までのセンサー値を表示するプログラムとまったく変わりま
せん。leJOS には、はじめからジャイロセンサーを扱うクラスが用意してあります。

□ GyroSensor gyroSensor = new GyroSensor(SensorPort.S4); // (1)

ジャイロセンサーオブジェクトを、ポート4につなげて生成します。


□コンストラクター
---
GyroSensor(ADSensorPort port)
---


□ LCD.drawString("value = " + gyroSensor.readValue(), 0, 1); // (2)

ジャイロセンサーからの値を取得して、NXT 画面に表示します。

□メソッド
---
int readValue()
ジャイロセンサーの値を取得する。値は、-1000 ~ 1000 の範囲くらいか?

void setOffset(int offset)
オフセット値を設定する。
---

以上


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」と同じだが、画面にはなにも表示されなくなった
ら、タッチセンサーを押下することによって倒立するようになる。

以上