LEGO MINDSORMS NXTをPCから操作
LEGO MINDSTORMS NXTは、PC上のプログラムから、
リアルタイムにモーターの回転やセンサーの入力を通信できるので、
試してみました。
プログラムを書く上で必要なのは、こちらのfantomSDK
http://mindstorms.lego.com/Overview/NXTreme.aspx
VC++2005でプログラミングできました。
モーターの回転を設定するときはsendDirectCommandで
バイト列を送るのですが、どんなのを送ったらいいかは
このページのBluetooth Developer Kitを見ると
なんとなくはわかりますが、
sendDirectCommandで送る内容とは差があるようです。
まずsendDirectCommandではBluetoothで送るバイト列の先頭は
第一引数の値で決まるようなので、sendDirectCommandでは記述しません。
また、モーターの出力を設定する場合は、Bluetooth Developer Kitでは
回転する回数を指定するようなことが書いてあるのですが、
それを削ったものを送らないと動作しないようです。
ここが参考になりました。
http://nemendur.ru.is/sverrirs01/rss.xml
ページが消えたのかrssしか残っていませんが。
プログラムの例を以下に示します。
#include "fantom/iNXT.h" #include "fantom/iNXTIterator.h" #include "fantom/tStatus.h" #include <string.h> #include <windows.h> void DycLegoLearn0() { nFANTOM100::tStatus status; nFANTOM100::iNXTIterator* nxtIteratorPtr = NULL; nFANTOM100::iNXT* nxtPtr = NULL; nxtIteratorPtr = nFANTOM100::iNXT::createNXTIterator(false, 0, status); if( status.isNotFatal() == false) return; nxtPtr = nxtIteratorPtr->getNXT( status ); nFANTOM100::iNXT::destroyNXTIterator( nxtIteratorPtr ); if( status.isNotFatal() == false) return; ViUInt8 protocolVersionMajor = 0; ViUInt8 protocolVersionMinor = 0; ViUInt8 firmwareVersionMajor = 0; ViUInt8 firmwareVersionMinor = 0; { ViUInt8 directCommandBuffer[] = { 0x04, 0x00, 0x19, 0x01 | 0x04, 0x01, 0x10, 0x20}; nxtPtr->sendDirectCommand( false, reinterpret_cast< ViByte* >( directCommandBuffer ), sizeof( directCommandBuffer ), NULL, 0, status); } Sleep(1000); for(int i = 0 ; i < 1000 ; i++) { ViUInt8 directCommandBuffer[] = { 0x04, 0x00, 0x00, 0x01 | 0x04, 0x01, 0x10, 0x20}; nxtPtr->sendDirectCommand( false, reinterpret_cast< ViByte* >( directCommandBuffer ), sizeof( directCommandBuffer ), NULL, 0, status); } //end nFANTOM100::iNXT::destroyNXT( nxtPtr ); }
1秒間Aポートのモーターを回して停止するプログラムです。
停止のところでループさせているのは、
ある程度信号を送り続けないと「キーン」という、妙な音が消えなかったからです。