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プロジェクトによると、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は、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 |
サーボモータ回転角度[度]の取得 引数: |
void |
サーボモータ回転角度[度]の設定 引数: |
void |
サーボモータ回転速度(PWM値)およびモータ停止モード(ブレーキ/フロート)の設定 パラメータ: |
S32 |
サーボモータ回転角度[度]の取得(nxt_motor_get_countのラッパー関数) 引数: |
void ecrobot_set_motor_speed(U8 port_id, S8 speed) |
サーボモータ回転速度(PWM値)の設定 引数: |
void |
サーボモータ回転速度(PWM値)およびモータ停止モード(ブレーキ/フロート)の設定 パラメータ: |
光センサデータの取得および赤色LEDのON/OFFは周辺制御マイコンを介しておこなわれています。また、光センサデータは10ビットの分解能を持っています。
光センサAPI |
機能 |
void |
赤色LEDをONにします。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
void |
赤色LEDをOFFにします。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
U16 |
光センサデータ(10ビットA/Dコンバータ)の取得。値が大きいほど反射率が低い(または暗い色からの反射) 引数: |
タッチセンサデータの取得は周辺制御マイコンを介しておこなわれています。タッチセンサ生データは10ビットの分解能を持っていますが、タッチセンサAPIは0/1値を返します。
タッチセンサAPI |
機能 |
U8 |
タッチセンサデータの取得
引数: |
サウンドセンサデータの取得は周辺制御マイコンを介しておこなわれています。サウンドセンサデータは10ビットの分解能を持っています。
サウンドセンサAPI |
機能 |
U16 |
サウンドセンサデータの取得。小さい値ほど大きな音を意味します。 引数: |
超音波センサにはI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。nxtOSEK
の超音波センサAPIでは、リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計されています。
超音波センサAPI |
機能 |
void |
指定のNXTセンサポートを超音波センサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
S32 |
超音波センサ計測距離データ[cm]の取得。超音波測定時にエコーが返ってこない場合の測定データは255[cm]となります。 引数: |
void |
指定のNXTセンサポートの超音波センサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
NXTカラーセンサは、カラーセンサ
機能に加えて、光センサとしても使用することができます。なお、nxtOSEKアプリケーションプログラム中では、NXTカラーセンサとの通信を維持する
ために、バックグラウンドタスク上で専用APIをループ実行する必要があります。詳細についてはC/C++サンプルプログラムを参照してください。
NXT カラーセンサ
API |
説明 |
void |
指定のNXTセンサポートをNXTカラーセンサとの通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
void |
NXTカラーセンサと通信をおこなうAPI。このAPIはバックグラウンドタスク上でループ実行する必要があります。使用方法詳細についてはC/C++サンプルプログラムを参照してください。 引数: |
void ecrobot_set_nxtcolorsensor(U8 port_id, U8 mode) |
センサ動作モードを設定します。NXTカラーセンサは次の7つの動作モードをサポートしています。 引数: |
U8 ecrobot_get_nxtcolorsensor_mode(U8 port_id) |
設定されているセンサ動作モードを取得できます。 引数: |
U16 ecrobot_get_nxtcolorsensor_id(U8 port_id) |
カラーセンサ動作モードで動作している場合にのみ、カラーID(黒/青/緑/黄/オレンジ/赤/白および未認識色)を取得できます。 |
void ecrobot_get_nxtcolorsensor_rgb (U8 port_id, S16 rgb[3]) |
カラーセンサ動作モードで動作している場合のみ、センサのRGB生データを取得できます。 引数: |
U16 ecrobot_get_nxtcolorsensor_light(U8 port_id) |
光センサ動作モードで動作している場合のみ、光センサA/D生データを取得できます。 引数: |
void |
指定のNXTセンサポートのNXTカラーセンサとの通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
RS485通信 API |
機能 |
void |
NXTセンサポート4をRS485通信用に初期化します。RS485の設定は次の通りです: データ長8ビット, 1 ストップビット, パリティチェック無し。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
U32 |
RS485通信データを送信します。送信データ長は最大64バイトです。 引数: |
U32 |
RS485通信データを受信します。受信データバイト数は最大64バイトです。 引数:buf: 受信データバッファ off: 受信データバッファオフセット len: 受信データバイト数 戻り値: 受信されたデータバイト数 |
void |
NXTセンサポート4のRS485通信を終了します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
I2C通信 API |
機能 |
void |
指定のNXTセンサポートをI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
SINT |
I2C通信データを送信します。 引数: |
SINT |
I2C通信データを受信します。 引数: |
void |
指定のNXTセンサポートのI2C通信設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
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 またはバックグラウンドタスク)の中で実行してください。 引数: |
void ecrobot_init_bt_slave(const CHAR *pin) |
NXT
をBluetooth通信のスレーブデバイスとして初期化し、マスターデバイス(PC,
NXTマスターデバイス)との接続を確立します。このAPIはループ処理(例、ecrobot_device_initialize
またはバックグラウンドタスク)の中で実行してください。 引数: pin: パスキー交換用ピンコード(最大16文字) 戻り値: 無し |
void |
NXTとPC間のBluetooth通信初期化および接続確立用API。Bluetoothペアリング時のPINCODE(パスキー)は"MATLAB"に固定されています。このAPIはループ処理(例、ecrobot_device_initialize またはバックグラウンドタスク)の中で実行してください。 引数:無し 戻り値: 無し |
U8 |
Bluetoothデバイス名の取得 引数: |
U8 |
Bluetoothデバイス名の設定 引数: |
SINT ecrobot_get_bt_status(void) |
Bluetooth接続状態の取得。Bluetoothデータの送受信をおこなうには、接続状態がBT_STREAMである必要があります。 引数: |
S16 ecrobot_get_bt_signal_strength(void) |
Bluetooth信号強度の取得 引数: |
U32 |
データ送信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。 引数: |
U32 ecrobot_send_bt(const void* buf, U32 off, U32 len) |
データ送信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。 引数: |
U32 |
データ受信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。 引数: |
U32 ecrobot_read_bt(void *buf, U32 off, U32 len) |
データ受信API。このAPIはBluetooth マスター/スレーブの両方で使用できます。 引数: |
U8 |
NXT内蔵のBlueCoreチップに保存されているBluetooth設定情報を工場出荷時の状態に戻す。この関数を実行した後は、NXTのバッテリを外して、BlueCoreチップを再起動するようにしてください。再起動させない場合の動作は不定となります。 引数: |
void |
Bluetooth通信終了処理用API。このAPIはBluetooth マスター/スレーブの両方で使用できます。 引数: |
void |
データロギング用送信API。NXTの全ポートに接続されたセンサおよびモータ(回転角度)のデータおよび内部状態データ(システムタイマー、バッテリ電圧)
等を送信します。このAPIを実装することで、NXT GamePadのデータロギング機能を使用することができます。 |
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 |
NXTのUSB通信機能を初期化する。 引数: |
SINT ecrobot_set_name_usb(U8* name) |
USB通信用のデバイス名を設定する。デフォルトでは"nxt"がデバイス名としてecrobot_init_usb内で設定されます。 引数: |
U8 ecrobot_process1ms_usb(void) |
USB通信接続確立用USB通信プロセスハンドラ。この関数は1msec周期で起動する必要があります。 引数: |
SINT |
USB通信接続確立後、USBデータを受信する。 引数: |
SINT ecrobot_send_usb(U8 *buf, U32 off, U32 len) |
USB通信接続確立後、USBデータを送信する。 引数: |
SINT ecrobot_disconnect_usb(void) |
接続した USB通信を切断する。USB通信を終了後に、ホスト側から再接続を設定することで、アプリケーション実行中にUSB通信の接続/切断をおこなうことがで きます。USB通信切断後は、デバイス名はデフォルト名("nxt")になるので、ユニークなデバイス名を設定する場合は ecorobt_set_name_usbを実行する必要があります。 引数: |
void |
NXTのUSB通信機能を終了する。 引数: |
液 晶画面に画像等を表示するために、nxtOSEKではBMPファイルを直接取り込むことができます。つまり、PC上のペイントブラシなどのアプリケーショ ンソフトウェア上でデザインした白黒BMPファイルを容易にNXTの液晶画面に表示することができます。この機能はGCCのobjcopyを使用すること で実現しています。詳細はsamplesディレクトリ内のanimeおよびbmptestサンプルプログラムを参照してください。
液晶表示API |
機能 |
SINT |
白黒BMPファイルの画像データを液晶表示用データに変換します。 引数: |
void display_bitmap_copy(const U8 *data, U32 width, U32 depth, U32 x, U32 y) |
BMP液晶表示用データの表示。 引数: |
void |
液晶表示の更新。このAPIを実行することで液晶表示が実際に更新されます。 引数: |
void display_clear(U32 updateToo) |
液晶表示用データバッファのクリア 引数: |
void display_goto_xy(int x, int y) |
文字表示位置の設定。液晶画面左上の位置を(0,0)とします 引数: |
void display_string(const char *str) |
文字データの液晶表示用データバッファへの格納 引数: |
void display_hex(U32 val, U32 places) |
整数データの液晶表示用データバッファへの格納(16進表示用) 引数: |
void display_unsigned(U32 val, U32 places) |
符号無し整数データの液晶表示用データバッファへの格納 引数: |
void display_int(int val, U32 places) |
符号付き整数データの液晶表示用データバッファへの格納 引数: |
void
ecrobot_status_monitor(const CHAR *target_name) |
NXT内部状態データの液晶表示用API。あらかじめ設定された次の各データが液晶画面に表示されます: 引数: |
NXT のサウンド出力ソースとして、WAVファイル(8bit モノラル PCM音源)を使用することもできます。この機能はGCCのobjcopyを使用することで実現しています。詳細はsamplesディレクトリ内の wavtestサンプルプログラムを参照してください。
サウンド出力API |
機能 |
SINT |
トーンサウンドの出力。 |
SINT |
8bit モノラル PCM音源のWAVファイルデータをサウンド出力します。 引数: |
void |
トーンサウンドの出力。 引数: 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 |
RUNボタンのON/OFF状態の取得 引数: 無し 戻り値: RUNボタンの状態 1: ON 0: OFF |
U16 |
バッテリ電圧値[mV]の取得 引数: |
U32 |
システムタイマー値[msec]の取得。システムタイマー値は、アプリケーションプログラム開始時ではなく、nxtOSEK起動時にカウントが開始されます。 引数: |
U32 |
システムタイマー値[msec]の取得。(systick_get_msのラッパー関数) 引数: |
void |
待機時間[msec]の設定 引数: |
HiTechnic社製加速度センサ(NAC1040)に
はI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。加速度センサAPIでは、リ
アルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計
されています。HiTechnic社によると、加速度センサの更新レートは約100回/秒で、±2gの範囲を200カウント/gの分解能で計測することが
できます。加速度センサの詳細情報についてはHiTechnic社のサイトを参照してください。
HiTechnic社製加速度センサAPI |
機能 |
void |
指定のNXTセンサポートを加速度センサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
void |
3軸の加速度データの取得 引数: |
void |
指定のNXTセンサポートの加速度センサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
HiTechnic社製ジャイロセンサ(NGY1044)は光センサ等と同様に10ビットの分解能を持ったA/Dデータとして取得されます。ジャイロセンサの更新レートは約300回/秒で、±360度の測定範囲に対応します。ジャイロセンサの詳細情報についてはHiTechnic社のサイトを参照してください。
HiTechnic社製ジャイロセンサAPI |
機能 |
U16 |
ジャイロセンサデータの取得。ジャイロセンサデータは角速度0の時に約600のオフセット値を持っています。 引数: |
HiTechnic社製赤外線検出センサ(NSK1042)にはI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。赤外線検出センサAPIでは、リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計されています。赤外線検出センサの詳細情報についてはHiTechnic社のサイトを参照してください。
HiTechnic社製赤外線検出センサAPI |
説明 |
void |
指定のNXTセンサポートを赤外線検出センサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
void |
赤外線検出データの取得(方向および各センサの赤外線信号強度データ) 引数: |
void |
指定のNXTセンサポートの赤外線検出センサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
HiTechnic社製コンパスセンサ(NMC1034)に
はI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。コンパスセンサAPIでは、
リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設
計されています。コンパスセンサの詳細情報についてはHiTechnic社のサイトを参照してください。
HiTechnic社製コンパスセンサAPI |
説明 |
void |
指定のNXTセンサポートをコンパスセンサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
void |
コンパスセンサの較正をおこないます。コンパスセンサの構成に関してはHiTechnic社のサイトを参照してください。 |
S16 |
方角データ(0~359[度])を取得します。南の方角が180になります。 引数: |
void |
指定のNXTセンサポートのコンパスセンサセンサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
HiTechnic社製カラーセンサ(NCO1038)に
はI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。カラーセンサAPIでは、リ
アルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設計
されています。カラーセンサの詳細情報についてはHiTechnic社のサイトを参照してください。
HiTechnic社製カラーセンサAPI |
説明 |
void |
指定のNXTセンサポートをカラーセンサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
void |
カラーセンサーデータの取得(RGB生データ) 引数: |
void |
指定のNXTセンサポートのカラーセンサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
HiTechnic社製プロトタイプセンサ(NPS1055)
にはI2C通信機能が搭載されており、ARM7マイコンと専用のI2C通信チャンネルを介してデータ取得がおこなわれています。カラーセンサAPIでは、
リアルタイム制御アプリケーション用途のためにデータ取得に1サイクルの遅れを設けることで、I2C通信完了までの待機処理を実装する必要がないように設
計されています。プロトタイプセンサの詳細情報については HiTechnic
Web siteを参照してください。
HiTechnic社製プロトタイプセンサAPI |
説明 |
void |
指定のNXTセンサポートをカラーセンサI2C通信用に初期化します。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
void |
アナログ入力データを取得できます。 引数: |
U8 |
デジタル入力データを取得できます。 引数: |
void |
デジタル出力データを設定できます。 引数: |
void |
指定のNXTセンサポートのプロトタイプセンサI2C通信用設定を解除します。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください。 引数: |
RCXアクティブセンサAPI |
機能 |
void |
アクティブセンサ駆動のための電圧供給設定用API。このAPIはnxtOSEKが提供しているデバイス初期化用フック関数内に実装してください。 引数: |
S16 ecrobot_get_RCX_sensor(U8 port_id) |
RCXアクティブセンサデータの取得 引数: |
void ecrobot_term_RCX_power_source(U8 port_id) |
アクティブセンサ駆動のための電圧供給停止用API。このAPIはnxtOSEKが提供しているデバイス終了用フック関数内に実装してください 引数: |
RCXのタッチセンサデータは、NXTのタッチセンサAPI(ecrobot_get_touch_sensor)を使用しても取得することができます。しかし、NXT/RCXの区別を明確にするために専用のAPIを提供しています。
RCXタッチセンサAPI |
機能 |
U8 |
タッチセンサデータの取得
引数: |
nxtOSEK
では3つのフック関数を提供しています。3つのフック関数については必ずユーザーアプリケーション内に定義する必要があります。フック関数の使用方法につ
いては、サンプルプログラムのNXTwayに含まれているecrobot_main.cファイル等が参考になります。
|
|
|