LEGO MINDSORMS NXTをPCから操作

Dycoon2007-06-02

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ポートのモーターを回して停止するプログラムです。
停止のところでループさせているのは、
ある程度信号を送り続けないと「キーン」という、妙な音が消えなかったからです。