タンサーボーグとの通信


タンサーボーグはネットタンサーの土台としても使われてますが、他の目的でも使えないか考えてみます。
まず、タンサーボーグとパソコンを専用ケーブルでつなぎ、ステータスを受け取ってみます。

↓タンサーボーグとパソコンとの通信プログラム1

;net tansor用tansor borgとの 通信プログラム1 for HSP 3
;by takuya matsubara

;20バイトをひたすら受信する

;tansor borgには
;C:\Program Files\Bandai\NetTansor\writerフォルダのNTfarm.mot
;を書き込む

#include "hspext.as"

#define COMNUM	1    // ポート番号

	sdim buf,32

	screen 0,640,480,0,0,0
	onexit *endbtn	//終了ボタンを押した時のジャンプ先を指定します

	comopen COMNUM,"baud=9600 parity=N data=8 stop=1"	//シリアルポートを初期化
	if stat : dialog "COM"+COMNUM+"は使えません" : end

	i=0
	buf="123456789ABCDEF01234"
	repeat
		stick k,0,1
		if(k != 0):end
		comgetc a
		if(stat==0):continue
		if(a == 13){
			if(i != 20){	//format error
			}else{
				pos 0,440:print buf
			}
			pos 0,0:gcopy 0,0,20,640,(480-20)	//scroll
			i=0
			continue
		}
		if(i < 20){
			poke buf,i,a
			i++
		}
	loop
	stop

//-----------------------------------
*endbtn
	comclose	;シリアルポートとの通信を終了します
	end


実行するとこんな感じ。
意味不明すぎるので、解読します。

↓タンサーボーグとパソコンとの通信プログラム2

;net tansor用tansor borgとの 通信プログラム2 for HSP 3
;by takuya matsubara

;赤外線センサの情報、CDSの情報、サウンドセンサの情報を表示

;tansor borgには
;C:\Program Files\Bandai\NetTansor\writerフォルダのNTfarm.mot
;を書き込む

#include "hspext.as"

#define COMNUM	1    // ポート番号
	sdim buf,32

	screen 0,640,480,0,0,0
	onexit *endbtn	//終了ボタンを押した時のジャンプ先を指定します

	comopen COMNUM,"baud=9600 parity=N data=8 stop=1"	//シリアルポートを初期化
	if stat : dialog "COM"+COMNUM+"は使えません" : end

	i=0
	buf="123456789ABCDEF01234"
	repeat
		stick k,0,1
		if(k != 0):end
		comgetc a
		if(stat==0):continue
		if(a == 13){
			if(i != 20){	//format error
			}else{
				a = peek(buf,1):gosub *atoi:irr = a	//IR sensor right
				a = peek(buf,2):gosub *atoi:irm = a	//IR sensor mid
				a = peek(buf,3):gosub *atoi:irl = a	//IR sensor left

				a = peek(buf,4):gosub *atoi:cdsr = a * 16
				a = peek(buf,5):gosub *atoi:cdsr = vol +a

				a = peek(buf,6):gosub *atoi:cdsl = a * 16
				a = peek(buf,7):gosub *atoi:cdsl = vol +a

				a = peek(buf,14):gosub *atoi:vol = a * 16
				a = peek(buf,15):gosub *atoi:vol = vol +a
				
				pos 0,440:print "IR右="+irr+" IR中央="+irm+" IR左="+irl+" CDS右="+cdsr+" CDS左="+cdsl+" 音="+vol
			}
			pos 0,0:gcopy 0,0,20,640,(480-20)	//scroll
			i=0
			continue
		}
		if(i < 20){
			poke buf,i,a
			i++
		}
	loop
	stop
//-----------------------------------(PC→TB)

*atoi
	if((a >= 0x30)and (a <=0x39)){
		a = a -0x30
		return
	}
	if((a >= 0x41)and (a <=0x46)){
		a = a -0x41
		a=a+10
		return
	}
	if((a >= 0x61)and (a <=0x66)){
		a = a -0x61
		a=a+10
		return
	}
	a=0
	return

//-----------------------------------
*endbtn
	comclose	;シリアルポートとの通信を終了します
	end


実行するとこんな感じ。
さきほどの意味不明な20バイトはセンサの生データだったわけです。
最初の3つ「IRxxx」は赤外線センサの反応(0〜5)です。物体が近づくほど値が上がります。
CDS」というのはCDSの値。可視光の明るさです。
「音」っていうのは、音センサの値です。大きな音を検出すると値が上がります。


↓タンサーボーグとパソコンとの通信プログラム3

;net tansor用tansor borgとの 通信プログラム3 for HSP 3
;by takuya matsubara

;キーボードのカーソルを押すと移動コマンド発行
;[esc]で終了

;tansor borgには
;C:\Program Files\Bandai\NetTansor\writerフォルダのNTfarm.mot
;を書き込む

#include "hspext.as"

#define COMNUM	1    // ポート番号
	sdim buf,32
	sdim tbuf,20

	screen 0,640,480,0,0,0
	onexit *endbtn	//終了ボタンを押した時のジャンプ先を指定します

	comopen COMNUM,"baud=9600 parity=N data=8 stop=1"	//シリアルポートを初期化
	if stat : dialog "COM"+COMNUM+"は使えません" : end

	i=0
	buf="123456789ABCDEF01234"
	repeat
		stick k,0,1
		if(k & 1):gosub *send_l //left
		if(k & 2):gosub *send_f //up
		if(k & 4):gosub *send_r //right
		if(k & 8):gosub *send_b //down
		if(k == 128):end
		comgetc a
		if(stat==0):continue
		if(a == 13){
			if(i != 20){	//format error
			}else{
			}
			i=0
			continue
		}
		if(i < 20){
			poke buf,i,a
			i++
		}
	loop
	stop
//-----------------------------------(PC→TB)
*send_f
	tbuf = "fd,10,10"		//
	goto *send_xx
*send_b
	tbuf = "bk,10,10"		// 
	goto *send_xx
*send_l
	tbuf = "lt,10,90"		// 
	goto *send_xx
*send_r
	tbuf = "rt,10,90"		// 
	goto *send_xx

*send_xx
	comput tbuf
	computc 13	//改行
	pos 0,440:print tbuf
	pos 0,0:gcopy 0,0,20,640,(480-20)	//scroll
	wait 100
	return
//-----------------------------------
*atoi
	if((a >= 0x30)and (a <=0x39)){
		a = a -0x30
		return
	}
	if((a >= 0x41)and (a <=0x46)){
		a = a -0x41
		a=a+10
		return
	}
	if((a >= 0x61)and (a <=0x66)){
		a = a -0x61
		a=a+10
		return
	}
	a=0
	return

//-----------------------------------
*endbtn
	comclose	;シリアルポートとの通信を終了します
	end


実行するとこんな感じ。これで、パソコンからタンサーボーグを操縦できます。
「fd〜」とか「bk〜」とかいうのが、タンサーボーグへ渡すコマンドです。ネットタンサー用のファームを入れた時の特別仕様です。
詳しいことは、「C:\Program Files\Bandai\NetTansor\doc」のプログラミングガイドに載ってます。
受信してる20バイトは全部捨ててます。

で、ここからが本題です。


これと同じことをEDU mk2+NicoBASICでやってみました。プログラムは次のとおりです。

60 IF SW AND 8 THEN STX "rt,10,90\r"
70 IF SW AND 4 THEN STX "lt,10,90\r"
80 IF SW AND 2 THEN STX "bk,10,5\r"
90 IF SW AND 1 THEN STX "fd,10,5\r"
100 for i=0 to 200
110 next
140 GOTO 60

7行だけです。「STX」というのは勝手に考えたシリアル送信用の命令です。
「\r」って書き方がBASICじゃないですが、まあ見逃してください。

EDU mk2についてるシリアルポート(RS232C)をクロスさせて、タンサーボーグにつなぎます。
実行後にEDU mk2側のスイッチを押すとタンサーボーグが動きます。


↓次にNicoMotorにタンサーボーグと同じコマンド体系を実装して、タンサーボーグに化けさせます。
NicoMotorにもRS232Cが付いてるので、これをネットタンサーの土台として置き換えることが可能、なはず(まだ未確認)。

いったい何がやりたいか、よくわからないと思いますが、
この技術を応用して迷路を解くようなロボットを作ってみたいと思います。