LEGO MINDSTORMS NXTシステムアーキテクチャ:

下図はLEGO社が公開しているLEGO MINDSTORMS NXT Hardware Developer Kitに基づいたNXTのシステムアーキテクチャ概要です。

NXT ではRCX(初代LEGO MINDSTORMS)と比較して、より複雑なシステムアーキテクチャが採用されています。nxtOSEKおよびアプリケーションプログラムはメインプロセッサであるARM7マイコン(ATMEL AT91SAM7S256)上で実行されますが、各種センサ、サーボモータ、NXT前面のボタン入力検出はARM7マイコンによって直接制御されるのではなく、専用の周辺制御マイコン(ATMEL AVR)によって制御されています。 ARM7マイコンと周辺制御マイコンの通信はI2C TWIを介して実現されており、データ送信/受信はそれぞれ2msec周期で相互におこなわれています。ただし、サーボモータの回転角度はARM7マイコ ンのパルスキャプチャ割り込みにより直接取得されています。また超音波センサデータは周辺制御マイコンを介さずに、ARM7マイコンと超音波センサ間の別 のI2C通信チャンネルを通して取得されています。このシステムアーキテクチャはnxtOSEKが提供している各種デバイスAPIおよびTOPPERS ATKの移植に大きく影響しています。

 

TOPPERS ATK1 API:

TOPPERSプロジェクトによると、TOPPERS ATK1は次のOSEKバージョンに対応しています:
OSEK OS Version 2.2.1
OSEK OIL Version 2.5


nxtOSEKにおけるTOPPERS ATK1機能の使用については若干の制約があります。アプリケーションプログラム中ではISRの定義および割り込み関連APIの使用はおこなわないでください。この制約はNXTのシステムアーキテクチャに起因しています。
TOPPERS ATK1使用方法の詳細については、 nxtOSEK\toppers_osek\doc ディレクトリ内に格納されているTOPPERSプロジェクト提供の日本語資料を参照してください。

 

ECRobot C API:

ECRobot C APIは、leJOS デバイスドライバAPIと ECRobot専用 C APIから構成されています。leJOS デバイスドライバAPIはJavaバーチャルマシン実装目的で設計されています。一方、ECrobot専用 C APIは、元々MATLAB&Simulinkを使用したモデルベース開発を適用したリアルタイム制御アプリケーション用途に向けて設計されています。ECRobot専用 C APIの一部は、leJOS デバイスドライバのラッパー関数(灰色の文字で記述)ですので、実行時オーバーヘッドを考慮してleJOS デバイスドライバAPIを直接使用したほうが良い場合もあります。ECRobot C APIを使用する場合は、ユーザーアプリケーションCソースファイルにecrobot_interface.hをインクルードする必要があります。


サーボモータAPIのうち、モータ回転角度の設定/取得はARM7マイコンのパルスキャプチャ機能を通しておこなわれています。一方、モータ回転速度の制御は周辺制御マイコンを介しておこなわれています。

サーボモータAPI
機能

int
nxt_motor_get_count(U32 n)

サーボモータ回転角度[度]の取得

引数:
    n: NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
戻り値:
    サーボモータ回転角度

void
nxt_motor_set_count(U32 n, int count)

サーボモータ回転角度[度]の設定

引数:
    n: NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
    count: サーボモータ回転角度設定値
戻り値:
    無し

void
nxt_motor_set_speed(U32 n, int speed_percent,
int brake)

サーボモータ回転速度(PWM値)およびモータ停止モード(ブレーキ/フロート)の設定

パラメータ:
    n: NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
    speed_percent: -100~100
    brake: 0(フロートモード), 1(ブレーキモード)
戻り値:
    無し

S32
ecrobot_get_motor_rev(U8 port_id)

サーボモータ回転角度[度]の取得(nxt_motor_get_countのラッパー関数)

引数:
    port_id: NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
戻り値:
    サーボモータ回転角度

void
ecrobot_set_motor_speed(U8 port_id, S8 speed)

サーボモータ回転速度(PWM値)の設定
(nxt_motor_set_speedのラッパー関数。ただしモータ停止モードはブレーキに固定)

引数:
    port_id: NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
    speed: -100~100
戻り値:
    無し

void
ecrobot_set_motor_mode_speed(U8 port_id,
S32 mode, S8 speed)

サーボモータ回転速度(PWM値)およびモータ停止モード(ブレーキ/フロート)の設定
(nxt_motor_set_speedのラッパー関数)

パラメータ:
    n: NXT_PORT_A, NXT_PORT_B, NXT_PORT_C
    speed_percent: -100~100
    brake: 0(フロートモード), 1(ブレーキモード)
戻り値:
    無し


光センサデータの取得および赤色LEDのON/OFFは周辺制御マイコンを介しておこなわれています。また、光センサデータは10ビットの分解能を持っています。

光センサAPI
機能

void
ecrobot_set_light_sensor_active(U8 port_id)

赤色LEDをONにします。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

void
ecrobot_set_light_sensor_inactive(U8 port_id)

赤色LEDをOFFにします。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

U16
ecrobot_get_light_sensor(U8 port_id)

光センサデータ(10ビットA/Dコンバータ)の取得。値が大きいほど反射率が低い(または暗い色からの反射)

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    0~1023


タッチセンサデータの取得は周辺制御マイコンを介しておこなわれています。タッチセンサ生データは10ビットの分解能を持っていますが、タッチセンサAPIは0/1値を返します。

タッチセンサAPI
機能

U8
ecrobot_get_touch_sensor(U8 port_id)

タッチセンサデータの取得

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    0(非接触), 1(接触)


サウンドセンサデータの取得は周辺制御マイコンを介しておこなわれています。サウンドセンサデータは10ビットの分解能を持っています。

サウンドセンサAPI
機能

U16
ecrobot_get_sound_sensor(U8 port_id)

サウンドセンサデータの取得。小さい値ほど大きな音を意味します。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    0~1023


超音波センサにはI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。nxtOSEK の超音波センサAPIでは、リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計されています。

超音波センサAPI
機能

void
ecrobot_init_sonar_sensor(U8 port_id)

指定のNXTセンサポートを超音波センサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    
無し

S32
ecrobot_get_sonar_sensor(U8 port_id)

超音波センサ計測距離データ[cm]の取得。超音波測定時にエコーが返ってこない場合の測定データは255[cm]となります。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    -1~255 (-1: 測定設定未完了状態)

void
ecrobot_term_sonar_sensor(U8 port_id)

指定のNXTセンサポートの超音波センサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


NXTカラーセンサは、カラーセンサ 機能に加えて、光センサとしても使用することができます。なお、nxtOSEKアプリケーションプログラム中では、NXTカラーセンサとの通信を維持する ために、バックグラウンドタスク上で専用APIをループ実行する必要があります。詳細についてはC/C++サンプルプログラムを参照してください。 

NXT カラーセンサ API
説明

void
ecrobot_init_nxtcolorsensor(U8 port_id, U8 mode)

指定のNXTセンサポートをNXTカラーセンサとの通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    mode: NXT_COLORSENSOR, NXT_LIGHTSENSOR_RED,
             NXT_LIGHTSENSOR_GREEN, NXT_LIGHTSENSOR_BLUE,
             NXT_LIGHTSENSOR_WHITE, NXT_LIGHTSENSOR_NONE,
             NXT_COLORSENSOR_DEACTIVATE
戻り値:
    無し

void 
ecrobot_process_bg_nxtcolorsensor(void)[RECOMMENDED TO USE]

NXTカラーセンサと通信をおこなうAPI。このAPIはバックグラウンドタスク上でループ実行する必要があります。使用方法詳細についてはC/C++サンプルプログラムを参照してください。
Cサンプル: nxtOSEK\samples_c\nxtcolorsensortest
C++サンプル:\nxtOSEK\samples_c++\cpp\NxtColorSensor 

引数:
    無し
戻り値:
    無し

void
ecrobot_set_nxtcolorsensor(U8 port_id, U8 mode) 

センサ動作モードを設定します。NXTカラーセンサは次の7つの動作モードをサポートしています。
・ カラーセンサ動作モード(NXT_COLORSENSOR)
・ 赤色LED点灯光センサ動作モード(NXT_LIGHTSENSOR_RED)
・ 緑色LED点灯光センサ動作モード(NXT_LIGHTSENSOR_GREEN)
・ 青色LED点灯光センサ動作モード(NXT_LIGHTSENSOR_BLUE)
・ 白色LED点灯光センサ動作モード(NXT_LIGHTSENSOR_WHITE)
・ LED点灯無し光センサ動作モード(NXT_LIGHTSENSOR_NONE)
・ センサ停止モード(NXT_COLORSENSOR_DEACTIVATE)

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    mode: NXT_COLORSENSOR, NXT_LIGHTSENSOR_RED,
             NXT_LIGHTSENSOR_GREEN, NXT_LIGHTSENSOR_BLUE,
             NXT_LIGHTSENSOR_WHITE, NXT_LIGHTSENSOR_NONE,
             NXT_COLORSENSOR_DEACTIVATE
戻り値:
    無し
 

U8
ecrobot_get_nxtcolorsensor_mode(U8 port_id) 

設定されているセンサ動作モードを取得できます。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    sensor mode: NXT_COLORSENSOR, NXT_LIGHTSENSOR_RED,
                        NXT_LIGHTSENSOR_GREEN, NXT_LIGHTSENSOR_BLUE,
                        NXT_LIGHTSENSOR_WHITE, NXT_LIGHTSENSOR_NONE,
                        NXT_COLORSENSOR_DEACTIVATE

U16
ecrobot_get_nxtcolorsensor_id(U8 port_id) 

カラーセンサ動作モードで動作している場合にのみ、カラーID(黒/青/緑/黄/オレンジ/赤/白および未認識色)を取得できます。
注記: センサ個体差、計測条件等により、取得されたカラーIDが実際の色と異なる場合があります。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    カラーID: NXT_COLOR_BLACK, NXT_COLOR_BLUE, NXT_COLOR_GREEN,
                  NXT_COLOR_YELLOW, NXT_COLOR_ORANGE, NXT_COLOR_RED,
                  NXT_COLOR_WHITE, NXT_COLOR_UNKNOWN 

void
ecrobot_get_nxtcolorsensor_rgb
(U8 port_id, S16 rgb[3])

カラーセンサ動作モードで動作している場合のみ、センサのRGB生データを取得できます。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    rgb: rgb[0] = 赤色(R)センサ値, rgb[1] = 緑色(G)センサ値, rgb[2] = 青色(B)センサ値
戻り値:
    無し

U16
ecrobot_get_nxtcolorsensor_light(U8 port_id)

光センサ動作モードで動作している場合のみ、光センサA/D生データを取得できます。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    0 - 1023 光センサA/D生データ

void
ecrobot_term_nxtcolorsensor(U8 port_id)

指定のNXTセンサポートのNXTカラーセンサとの通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


RS485通信 API
機能

void
ecrobot_init_rs485(U32 baud_rate)

NXTセンサポート4をRS485通信用に初期化します。RS485の設定は次の通りです: データ長8ビット, 1 ストップビット, パリティチェック無し。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    baud_rate: RS485通信レート[bps]。LEGO標準の通信レートは921600 [bps]です 
戻り値:
    無し

U32
ecrobot_send_rs485(U8* buf, U8 off, U32 len)

RS485通信データを送信します。送信データ長は最大64バイトです。

引数:
    buf: 送信データバッファ
    off: 送信データバッファオフセット
    len: 送信データバイト数
戻り値:
    送信されたデータバイト数

U32
ecrobot_read_rs485(U8* buf, U8 offU32 len)

RS485通信データを受信します。受信データバイト数は最大64バイトです。

引数:
    buf: 受信データバッファ
    off: 受信データバッファオフセット
    len: 受信データバイト数
戻り値:

   
受信されたデータバイト数

void
ecrobot_term_rs485(void)

NXTセンサポート4のRS485通信を終了します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    無し
戻り値:
    無し

I2C通信 API
機能

void
ecrobot_init_i2c(U8 port_id U8 type)

指定のNXTセンサポートをI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    type: LOWSPEED_9V/LOWSPEED
戻り値:
    無し

SINT
ecrobot_send_i2c(U8 port_id, U32 address,
SINT i2c_reg, U8 *buf, U32 len)

I2C通信データを送信します。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    address: I2C通信アドレス (0x01 ~ 0x7F)
    i2c_reg: I2Cレジスタ (例, 0x42)
    buf: 送信データバッファ
    len: 送信データ長(バイト)
戻り値:
    1(送信成功) / 0(送信失敗)

SINT
ecrobot_read_i2c(U8 port_id, U32 address,
SINT i2c_reg, U8 *buf, U32 len)

I2C通信データを受信します。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    address: I2C通信アドレス (0x01 ~ 0x7F)
    i2c_reg: I2Cレジスタ (例, 0x42)
    buf: 受信データバッファ
    len: 受信データ長(バイト)
戻り値:
    1(受信成功) / 0(受信失敗)

void
ecrobot_term_i2c(U8 port_id)

指定のNXTセンサポートのI2C通信設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


NXT 内部にはBluecoreと呼ばれる専用のBluetooth通信チップが搭載されており、ARM7マイコンはUARTを介してBluecore通信チッ プと通信をおこなっています。LEGO社標準ファームウェアは多岐にわたる専用通信プロトコルを用意していますが、nxtOSEK Bluetooth通信APIはそのうちの一部にしか対応していません。
- NXT-PCのBluetooth通信機能に関しては、NXT GamePad という専用のPCユーティリティソフトウェアを提供しており、NXTのラジコン操作およびNXT内部データのロギング機能を実現しています。
- NXT-NXTのBluetooth通信機能に関しては、1:1の通信のみサポートしています。またNXT上でのBluetooth通信設定UIはサポー トしていません。そのため、Bluetooth通信接続に必要な全ての情報をコードに定義する必要があります。

Bluetooth通信API
機能
void
ecrobot_init_bt_master(const U8 *bd_addr,
const CHAR *pin)

NXT をBluetooth通信のマスターデバイスとして初期化し、NXTスレーブデバイスとの接続を確立します。Bluetooth デバイスアドレスは48bitデータとして構成されていますが、NXTはさらに8bitのデータを必要とします(合計7bytesデータ)。従って Bluetooth デバイスアドレスの最後に0x00を追加してください。このAPIはループ処理(例、ecrobot_device_initialize またはバックグラウンドタスク)の中で実行してください。

引数:
    bd_addr: NXTスレーブデバイスのBluetooth デバイスアドレス。
例えば、NXTスレーブデバイスが、00:16:53:04:F1:B3というBluetooth デバイスアドレスを持っていた場合、bd_addrは次のように定義する必要があります:
const U8 bd_addr[7] = {0x00,0x16,0x53,0x04,0xF1,0xB3,0x00};
    pin: パスキー交換用ピンコード(最大16文字)
戻り値:
    無し

void
ecrobot_init_bt_slave(const CHAR *pin)
NXT をBluetooth通信のスレーブデバイスとして初期化し、マスターデバイス(PC, NXTマスターデバイス)との接続を確立します。このAPIはループ処理(例、ecrobot_device_initialize またはバックグラウンドタスク)の中で実行してください。

引数:
    pin: パスキー交換用ピンコード(最大16文字)
戻り値:
    無し

void
ecrobot_init_bt_connection(void)

NXTとPC間のBluetooth通信初期化および接続確立用API。Bluetoothペアリング時のPINCODE(パスキー)は"MATLAB"に固定されています。このAPIはループ処理(例、ecrobot_device_initialize またはバックグラウンドタスク)の中で実行してください。

引数:
    無し
戻り値:
    無し

U8
ecrobot_get_bt_device_name(CHAR* bd_name)

Bluetoothデバイス名の取得

引数:
    bd_name: デバイス名
戻り値:
    
1(succeeded)/0(failure)

U8
ecrobot_set_bt_device_name(const CHAR* bd_name)

Bluetoothデバイス名の設定

注記: この関数は、Bluetooth未接続状態で使用してください。
注記:この関数を使って設定したデバイス名を、Windows上のBluetoothデバイスダイアログ上で確認するためには、NXT BIOSを使用する必要があるようです。(拡張NXTファームウェア使用時には反映されない)

引数:
    bd_name: デバイス名(最大16文字)
戻り値:
   1(succeeded)/0(failure)

SINT
ecrobot_get_bt_status(void)

Bluetooth接続状態の取得。Bluetoothデータの送受信をおこなうには、接続状態がBT_STREAMである必要があります。

引数:
    無し
戻り値:
    
Bluetooth接続状態
        BT_NO_INIT (未初期化状態)
        BT_INITIALIZED (初期化状態)
        BT_CONNECTED (接続確立状態)
        BT_STREAM (データ送受信可能状態)

S16
ecrobot_get_bt_signal_strength(void)

Bluetooth信号強度の取得

引数:
    無し
戻り値:
    信号強度(-1~255)。大きい数字が信号強度:強を意味します。-1はBluetooth未接続を意味します。

U32
ecrobot_send_bt_packet(U8 *buf, U32 bufLen)

データ送信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。

引数:
    buf: 送信データバッファ
    bufLen: 送信データサイズ(最大 254バイト)
戻り値:
    送信されたデータの
バイト数

U32
ecrobot_send_bt(const void* buf, U32 off, U32 len)

データ送信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。

※ecrobot_send_bt_packetと比較して、こちらのAPIの方が速度/メモリ面で効率が良く、かつ、データフレーム構造についての自由度が高いため、こちらの使用を推奨します。

引数:
    buf: 送信データバッファ
    off: 送信データバッファ内オフセット
    len: 送信データサイズ(最大 256バイト)
戻り値:
    送信されたデータの
バイト数

U32
ecrobot_read_bt_packet(U8 *buf, U32 bufLen)

データ受信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。

引数:
    buf: 受信データバッファ
    bufLen: 受信データバッファサイズ(最大 254126バイト)
戻り値:
    受信されたデータの
バイト数

U32
ecrobot_read_bt(void *buf, U32 off, U32 len)

データ受信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。

※ecrobot_read_bt_packetと比較して、こちらのAPIの方が速度/メモリ面で効率が良く、かつ、データフレーム構造についての自由度が高いため、こちらの使用を推奨します。

引数:
    buf: 受信データバッファ
    off: 受信データバッファ内オフセット
    len:  受信データバッファサイズ(最大 128バイト)
戻り値:
    受信されたデータのバイト数

U8
ecrobot_set_bt_factory_settings(void)

NXT内蔵のBlueCoreチップに保存されているBluetooth設定情報を工場出荷時の状態に戻す。この関数を実行した後は、NXTのバッテリを外して、BlueCoreチップを再起動するようにしてください。再起動させない場合の動作は不定となります。
注記: この関数は、Bluetooth未接続状態で使用してください。

引数:
    無し
戻り値:
    無し

void
ecrobot_term_bt_connection(void)

Bluetooth通信終了処理用API。このAPIはBluetooth マスター/スレーブの両方で使用できます。

引数:
    無し
戻り値:
    無し

void
ecrobot_bt_data_logger(S8 data1, S8 data2)

データロギング用送信API。NXTの全ポートに接続されたセンサおよびモータ(回転角度)のデータおよび内部状態データ(システムタイマー、バッテリ電圧) 等を送信します。このAPIを実装することで、NXT GamePadのデータロギング機能を使用することができます。
NXT GamePadではロギングしたデータを任意のCSVファイルとして保存することができます。

データパケット    0-3バイト: システムタイマー値[msec], データタイプ U32
データパケット       4バイト: ユーザーデータ1, データタイプ S8
データパケット       5バイト: ユーザーデータ2, データタイプ S8
データパケット    6-7バイト: バッテリ電圧値[mV], データタイプ U16
データパケット  8-11バイト: ポートA サーボモータ回転角度[度], データタイプ S32
データパケット12-15バイト: ポートB サーボモータ回転角度[度], データタイプ S32
データパケット16-19バイト: ポートC サーボモータ回転角度[度], データタイプ S32
データパケット20-21バイト: ポートS1 A/Dセンサデータ, データタイプ S16
データパケット22-23バイト: ポートS2 A/Dセンサデータ, データタイプ S16
データパケット24-25バイト: ポートS3 A/Dセンサデータ, データタイプ S16
データパケット26-27バイト: ポートS4 A/Dセンサデータ, データタイプ S16
データパケット28-31バイト: 超音波センサデータ, データタイプ S32

引数:
    data1: ユーザーデータ1 (例, 左側ゲームパッド入力)
    data2: ユーザーデータ2 (例, 右側ゲームパッド入力)
戻り値:
    無し

USB 通信APIを使用する場合、ホストプログラムではLibUsbとLibNXTを使用する必要があります。samplesディレクトリ内のusbtest ディレクトリにはUSBターゲットサンプルとUSBホストサンプル(/usbhost)が含まれています。USB通信APIでは複数のNXTとの同時通信機能はサポートしていません。

2009/01: nxtOSEK v2.05ではLEGO FantomドライバをUSBホストプログラムに使用するようになりました。さらに以前のバージョンと比較して、USB通信プロトコルの充実(例、アプリケーション実行中の明示的な通信接続/切断)および機能拡張(例、複数NXTとのホスト通信)が図られています。
USB通信APIの使用方法の詳細は、samples\usbtestディレクトリに格納されているサンプルを参照してください。またUSBホスト側のサンプルについてはsamples\usbtest\usbhostディレクトリを参照してください。

USB通信API
機能

void
ecrobot_init_usb(void)

NXTのUSB通信機能を初期化する。

引数:
    無し
戻り値:
    無し

SINT
ecrobot_set_name_usb(U8* name)

USB通信用のデバイス名を設定する。デフォルトでは"nxt"がデバイス名としてecrobot_init_usb内で設定されます。

引数:
    name: デバイス名 (最大16文字)
戻り値:
    1(success)/0(failure)

U8
ecrobot_process1ms_usb(void)

USB通信接続確立用USB通信プロセスハンドラ。この関数は1msec周期で起動する必要があります。
(例、1msecウェイト付きループまたはOSEK/JSPの1msec周期起動タスク内に実装)

引数:
    無し
戻り値:
    USB通信状況(USB_NO_INIT/USB_INIT/USB_CONNECTED)

SINT
ecrobot_read_usb(U8 *buf, U32 off, U32 len)

USB通信接続確立後、USBデータを受信する。

引数:
    buf: データ受信バッファ
    off: データ受信バッファオフセット
    len
: 受信データ数(最大64 バイト)
戻り値:
    受信したデータ数(バイト)

SINT
ecrobot_send_usb(U8 *buf, U32 off, U32 len)

USB通信接続確立後、USBデータを送信する。

引数:
    buf: データ送信バッファ
    off: データ送信バッファオフセット
    len
: 送信データ数 (最大64 バイト)
戻り値:
    送信したデータ数(バイト)

SINT
ecrobot_disconnect_usb(void)

接続した USB通信を切断する。USB通信を終了後に、ホスト側から再接続を設定することで、アプリケーション実行中にUSB通信の接続/切断をおこなうことがで きます。USB通信切断後は、デバイス名はデフォルト名("nxt")になるので、ユニークなデバイス名を設定する場合は ecorobt_set_name_usbを実行する必要があります。

引数:
    無し
戻り値:
    1(success)/0(failure)

void
ecrobot_term_usb(void)

NXTのUSB通信機能を終了する。

引数:
    無し
戻り値:
    無し

液 晶画面に画像等を表示するために、nxtOSEKではBMPファイルを直接取り込むことができます。つまり、PC上のペイントブラシなどのアプリケーショ ンソフトウェア上でデザインした白黒BMPファイルを容易にNXTの液晶画面に表示することができます。この機能はGCCのobjcopyを使用すること で実現しています。詳細はsamplesディレクトリ内のanimeおよびbmptestサンプルプログラムを参照してください。

液晶表示API
機能

SINT
ecrobot_bmp2lcd(const CHAR *file, U8 *lcd,
S32 width, S32 height)

白黒BMPファイルの画像データを液晶表示用データに変換します。

引数:
    file: BMP_DATA_START(BMPファイル名)マクロを指定します
    BMPファイル名には拡張子(.bmp)を含まないこと
    lcd: 液晶表示用データバッファ(最大サイズ800)
    width: 液晶表示用データのビット幅(最大100)
    height: 液晶表示用データのビット高さ (最大64)
戻り値:
    1: BMPファイル変換成功
    0: BMPファイル変換失敗

void
display_bitmap_copy(const U8 *data, U32 width,
U32 depth, U32 x, U32 y)

BMP液晶表示用データの表示。

引数:
    data: 液晶表示用データ
    width: 液晶表示用データのビット幅(最大100)
    depth: 液晶表示用データのバイト高さ (最大18)
    x: 液晶表示用データの水平方向ビット位置 (0 - 100)
    y: 液晶表示用データの垂直方向バイト位置 (0 - 8)
戻り値:
    無し

void
display_update(void)

液晶表示の更新。このAPIを実行することで液晶表示が実際に更新されます。

引数:
    無し
戻り値:
    無し

void
display_clear(U32 updateToo)

液晶表示用データバッファのクリア

引数:
    updateToo: 0 (液晶表示の更新無し), 1(データバッファのクリア後、液晶表示を更新)
戻り値:
    無し

void
display_goto_xy(int x, int y)

文字表示位置の設定。液晶画面左上の位置を(0,0)とします

引数:
    x: 水平方向の位置 (0 - 15)
    y: 垂直方向の位置 (0 - 7)
戻り値:
    無し

void
display_string(const char *str)

文字データの液晶表示用データバッファへの格納

引数:
    str: ASCII文字データ(0x00~0x7F)
戻り値:
    無し

void
display_hex(U32 val, U32 places)

整数データの液晶表示用データバッファへの格納(16進表示用)

引数:
    val: 表示用整数データ
    places: データ表示用文字列表示領域
戻り値:
    無し

void
display_unsigned(U32 val, U32 places)

符号無し整数データの液晶表示用データバッファへの格納

引数:
    val: 表示用符号無し整数データ
    places: データ表示用文字列表示領域
戻り値:
    無し

void
display_int(int val, U32 places)

符号付き整数データの液晶表示用データバッファへの格納

引数:
    val: 表示用符号付き整数データ
    places: データ表示用文字列表示領域
戻り値:
    無し

void
ecrobot_status_monitor(const CHAR *target_name)

NXT内部状態データの液晶表示用API。あらかじめ設定された次の各データが液晶画面に表示されます:
ターゲット名
システムタイマー[sec]
バッテリ電圧[mV]
モータ回転角度(A/B/C) [度]
A/Dセンサデータ(S1/S2/S3/S4)
Bluetooth通信状態(1:接続, 0:接続無し)
超音波センサ[cm]

このAPIの表示処理は負荷が高いため、低頻度(例, 500msec周期)で起動するようにしてください。

引数:
    target_name: ターゲット名文字列
戻り値:
    無し

NXT のサウンド出力ソースとして、WAVファイル(8bit モノラル PCM音源)を使用することもできます。この機能はGCCのobjcopyを使用することで実現しています。詳細はsamplesディレクトリ内の wavtestサンプルプログラムを参照してください。

サウンド出力API
機能

SINT
ecrobot_sound_tone(U32 freq, U32 ms, U32 vol)

トーンサウンドの出力。

引数:
    freq: トーン周波数[Hz]。31Hz - 2100Hz
    ms
: 出力持続時間[10msec単位]。最大256 (= 2.56sec)
    vol: ボリューム (0 - 100)。 0はミュート
戻り値:
    1: サウンドトーン出力OK

SINT
ecrobot_sound_wav(const CHAR *file, U32 length,
S32 freq, U32 vol)

8bit モノラル PCM音源のWAVファイルデータをサウンド出力します。

引数:
    file: WAV_DATA_START(WAVファイル名) マクロを指定します
    WAVファイル名には拡張子(.wav)を含まないこと    
    length: WAV_DATA_SIZE(WAVファイル名) マクロを指定します
    
WAVファイル名には拡張子(.wav)を含まないこと
    freq: サンプリング周波数[Hz]。 2000Hz - 22050Hz または -1: WAVファイルオリジナル
    サンプリング周波数を使用
    vol:
ボリューム (0 - 100)。 0はミュート
戻り値:
    1: サウンド出力OK
    0: サウンドリソースが占有されている
    -1: WAVファイルデータ読み込み失敗

void
sound_freq(U32 freq, U32 ms)

トーンサウンドの出力。

引数:
    freq: トーン周波数[Hz]。31Hz - 2100Hz
    ms
: 出力持続時間[10msec単位]。最大256 (= 2.56sec)
戻り値:
    1: サウンドトーン出力OK


NXT内部関連APIとして、バッテリ電圧計測、システムタイマー取得(単位:msec)等を提供しています。

NXT内部関連API
機能
U8
ecrobot_is_ENTER_button_pressed(void)
ENTER (ENTR)ボタンのON/OFF状態の取得

引数:
    無し
戻り値:
    ENTER (ENTR)ボタンの状態
    
1: ON
    0: OFF

U8
ecrobot_is_RUN_button_pressed(void)

RUNボタンのON/OFF状態の取得

引数:
    無し
戻り値:
    
RUNボタンの状態
    1: ON
    0: OFF

U16
ecrobot_get_battery_voltage(void)

バッテリ電圧値[mV]の取得

引数:
    無し
戻り値:
    バッテリ電圧値 (例, 9000 = 9.000V)

U32
systick_get_ms(void)

システムタイマー値[msec]の取得。システムタイマー値は、アプリケーションプログラム開始時ではなく、nxtOSEK起動時にカウントが開始されます。

引数:
    無し
戻り値:
    システムタイマー値[msec]

U32
ecrobot_get_systick_ms(void)

システムタイマー値[msec]の取得。(systick_get_msのラッパー関数)

引数:
    無し
戻り値:
    システムタイマー値[msec]

void
systick_wait_ms(U32 ms)

待機時間[msec]の設定

引数:
    ms: 待機時間[msec]
戻り値:
    
無し


HiTechnic社製加速度センサ(NAC1040)に はI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。加速度センサAPIでは、リ アルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計 されています。HiTechnic社によると、加速度センサの更新レートは約100回/秒で、±2gの範囲を200カウント/gの分解能で計測することが できます。加速度センサの詳細情報についてはHiTechnic社のサイトを参照してください。

HiTechnic社製加速度センサAPI
機能

void
ecrobot_init_accel_sensor(U8 port_id)

指定のNXTセンサポートを加速度センサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

void
ecrobot_get_accel_sensor(U8 port_id, S16 buf[3])

3軸の加速度データの取得

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    buf: 3軸の加速度データ (buf[0]: x軸, buf[1]: y, buf[2]: z)

戻り値:
    無し

void
ecrobot_term_accel_sensorr(U8 port_id)

指定のNXTセンサポートの加速度センサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


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

HiTechnic社製ジャイロセンサAPI
機能

U16
ecrobot_get_gyro_sensor(U8 port_id)

ジャイロセンサデータの取得。ジャイロセンサデータは角速度0の時に約600のオフセット値を持っています。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


HiTechnic社製赤外線検出センサ(NSK1042)にはI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。赤外線検出センサAPIでは、リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計されています。赤外線検出センサの詳細情報についてはHiTechnic社のサイトを参照してください。

HiTechnic社製赤外線検出センサAPI
説明

void
ecrobot_init_ir_seeker(U8 port_id)

指定のNXTセンサポートを赤外線検出センサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

void
ecrobot_get_ir_seeker(U8 port_id, S16 buf[6])

赤外線検出データの取得(方向および各センサの赤外線信号強度データ)

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    buf: 赤外線検出データ(buf[0]: 検出方向, buf[1]: 信号強度1, ... buf[5]: 信号強度5)
戻り値:
    無し

void
ecrobot_term_ir_seeker(U8 port_id)

指定のNXTセンサポートの赤外線検出センサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


HiTechnic社製コンパスセンサ(NMC1034)に はI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。コンパスセンサAPIでは、 リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設 計されています。コンパスセンサの詳細情報についてはHiTechnic社のサイトを参照してください

HiTechnic社製コンパスセンサAPI
説明

void
ecrobot_init_compass_sensor(U8 port_id)

指定のNXTセンサポートをコンパスセンサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

void
ecrobot_cal_compass_sensor(U8 port_id)

コンパスセンサの較正をおこないます。コンパスセンサの構成に関してはHiTechnic社のサイトを参照してください

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

S16
ecrobot_get_compass_sensor(U8 port_id)

方角データ(0~359[度])を取得します。南の方角が180になります。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    方角データ (0~359[度])

void
ecrobot_term_compass_sensor(U8 port_id)

指定のNXTセンサポートのコンパスセンサセンサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


HiTechnic社製カラーセンサ(NCO1038)に はI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。カラーセンサAPIでは、リ アルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計 されています。カラーセンサの詳細情報についてはHiTechnic社のサイトを参照してください。

HiTechnic社製カラーセンサAPI
説明

void
ecrobot_init_color_sensor(U8 port_id)

指定のNXTセンサポートをカラーセンサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

void
ecrobot_get_color_sensor(U8 port_id, S16 buf[3])

カラーセンサーデータの取得(RGB生データ)

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    buf: カラーセンサー生データ (buf[0]: Red, buf[1]: Green, buf[2]: Blue)
戻り値:
    無し

void
ecrobot_term_color_sensorr(U8 port_id)

指定のNXTセンサポートのカラーセンサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

 
HiTechnic社製プロトタイプセンサ(NPS1055) にはI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。カラーセンサAPIでは、 リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設 計されています。プロトタイプセンサの詳細情報については HiTechnic Web siteを参照してください。

HiTechnic社製プロトタイプセンサAPI
説明

void
ecrobot_init_prototype_sensor(U8 port_id, U8 rate, U8 dir)

指定のNXTセンサポートをカラーセンサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    rate: センササンプリングレート (4~100 msec) 
    dir: 6チャンネルのデジタルポートの入出力設定。0~5ビットの各ビットにポート毎の
          入出力(出力1/入力0)が設定できます。
戻り値:
    無し

void
ecrobot_get_prototype_analog_sensor(U8 port_id, S16 buf[5])

アナログ入力データを取得できます。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    buf: 5チャンネルのアナログデータ取得用バッファ
戻り値:
    無し

U8
ecrobot_get_prototype_digital_sensor(U8 port_id)

デジタル入力データを取得できます。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    デジタル入力データ(0 - 5 ビット) 

void
ecrobot_send_prototype_digital_sensor(U8 port_id, U8 data)

デジタル出力データを設定できます。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
    data: デジタル出力データ (0 - 5 ビット)
戻り値:
    無し 

void
ecrobot_term_prototype_sensor(U8 port_id)

指定のNXTセンサポートのプロトタイプセンサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し



RCXのアクティブセンサ(例, 光センサ)をNXTに接続した場合、センサ用電源供給が別途必要になるために専用APIを提供しています。
RCXアクティブセンサAPI
機能

void
ecrobot_set_RCX_power_source(U8 port_id)

アクティブセンサ駆動のための電圧供給設定用API。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し

S16
ecrobot_get_RCX_sensor(U8 port_id)

RCXアクティブセンサデータの取得

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    アクティブセンサデータ

void
ecrobot_term_RCX_power_source(U8 port_id)

アクティブセンサ駆動のための電圧供給停止用API。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    無し


RCXのタッチセンサデータは、NXTのタッチセンサAPI(ecrobot_get_touch_sensor)を使用しても取得することができます。しかし、NXT/RCXの区別を明確にするために専用のAPIを提供しています。

RCXタッチセンサAPI
機能

U8
ecrobot_get_RCX_touch_sensor(U8 port_id)

タッチセンサデータの取得

引数:
    port_id: NXT_PORT_S1, NXT_PORT_S2, NXT_PORT_S3, NXT_PORT_S4
戻り値:
    0(非接触), 1(接触)

nxtOSEK フック関数:

nxtOSEK では3つのフック関数を提供しています。3つのフック関数については必ずユーザーアプリケーション内に定義する必要があります。フック関数の使用方法につ いては、サンプルプログラムのNXTwayに含まれているecrobot_main.cファイル等が参考になります。

void ecrobot_device_initialize(void)
{
    /* Initialize ECRobot used devices */
    ecrobot_set_light_sensor_active(NXT_PORT_S1);
    ecrobot_set_light_sensor_active(NXT_PORT_S3);
    ecrobot_init_sonar_sensor(NXT_PORT_S2);
    ecrobot_init_bt_connection();
}

void ecrobot_device_terminate(void)
{
    /* Terminate ECRobot used devices */
    ecrobot_set_light_sensor_inactive(NXT_PORT_S1);
    ecrobot_set_light_sensor_inactive(NXT_PORT_S3);
    ecrobot_set_motor_speed(NXT_PORT_B, 0);
    ecrobot_set_motor_speed(NXT_PORT_C, 0);
    ecrobot_term_sonar_sensor(NXT_PORT_S2);
    ecrobot_term_bt_connection();
}

#include "kernel.h"
#include "kernel_id.h"

void user_1ms_isr_type2(void)
{
    StatusType ercd;

    /* Increment System Timer Count */
    ercd = SignalCounter(SysTimerCnt);
    if (ercd != E_OK)
    {
        ShutdownOS(ercd);
    }
}