まず、LegoのFantomというライブラリを経由して、操作するものを作った。
■LEGO MINDSTORMS NXTグレーブックをを参考に、Fantomライブラリに命令を出す部分のをDLLをC++で作成した。
これがなかなか、VB6で使えるようにするのが大変で苦労しました。
ノウハウとして残そうと思ったのですが、どうやったかもう忘れてしまいました。(この一件でこの備忘録を作ろうと思ったしだいです。)
ユーザーインターフェイス部分は相変わらずVB6で作成、やはりLAN経由で操作したかったので、WINSOCKで通信するクライアントも作った。操作はジョイパッドを使ってみた。
そこそこ、動くものが出来たが、学生に卒研でやらせようとしたらVB6のプログラムがC++のDLLを認識しなくたってしまった。
■FantomもC++もDLLも良く分からないく原因調査もめんどくさいので、VB6で(VB2005はこれまたよくわからない・・・・)全部出来ないかと思っていたら、普通のシリアルポートとして通信ができるとのこと、早速VB6+MSCOMMで作ってみた。
※こちらを参考にさせていただきました、ありがとうございました。
[VB] MSComm コントロールを使用してデータの送受信を行う方法
http://support.microsoft.com/kb/411403/ja
ruby-nxt の使い方 - モーターを回す(基本編)
http://bearmini.net/blog/View.aspx?bid=1&aid=133
NXTプログラミング
http://d.hatena.ne.jp/yaneurao/20080113
LEGO Mindstorm NXT Bluetooth
http://eto.com/d/LegoMindstormNxtBluetooth.html
※MSCOMMは16ポートまでしか使えないが、仮想COMポートがやたらと増えてしまったPCがあったので、減らす方法を調べた。
使用済みCOM番号(in use)を消す方法について
http://www.hdl.co.jp/USB/comno/index.html
XPのCOMポートの削除方法?
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200710/200710_07100027.html
----------------------------------------------------------------------
<Bluetooth接続処理>
Private Sub Command1_Click()
'接続処理
'開いていたらいたらシリアルポートを閉じる
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False 'シルアルポートを閉じる
End If
'ポートを設定
MSComm1.CommPort = Me.Combo1 ' 通信ポートCOMを指定
' Bluetoothの接続仮想ポートを確認
MSComm1.Settings = "9600,n,8,1" ' 通信条件設定
MSComm1.RThreshold = 1 ' 1バイト受信毎にOnCommイベント発生
MSComm1.SThreshold = 1 ' 送信バッファ空でOnCommイベント発生
End Sub
-------------------------------------------------------------------------
<ダイレクトコマンドをMSCommを経由して送る部分>
'データ送信
Form1.MSComm1.Output = Buffer
nxtGoodJob = 0
Exit Function
Err_End:
nxtGoodJob = -2
End Function
Function nxtBeep()
'ビープ音
'On Error GoTo Err_End
If Form1.MSComm1.PortOpen = False Then ' シリアルポートのオープン
Form1.MSComm1.PortOpen = True
End If
ReDim Buffer(7) As Byte
Buffer(0) = &H6
Buffer(1) = &H0
Buffer(2) = &H80
Buffer(3) = &H3
Buffer(4) = &H0
Buffer(5) = &H18
Buffer(6) = &H10
Buffer(7) = &H0
'データ送信
Form1.MSComm1.Output = Buffer
nxtBeep = 0
Exit Function
Err_End:
nxtBeep = -2
End Function
----------------------------------------------------------------
<Winsock>
Winsock部分は別の所で書いておきます。
■LEGO MINDSTORMS NXTグレーブックをを参考に、Fantomライブラリに命令を出す部分のをDLLをC++で作成した。
これがなかなか、VB6で使えるようにするのが大変で苦労しました。
ノウハウとして残そうと思ったのですが、どうやったかもう忘れてしまいました。(この一件でこの備忘録を作ろうと思ったしだいです。)
ユーザーインターフェイス部分は相変わらずVB6で作成、やはりLAN経由で操作したかったので、WINSOCKで通信するクライアントも作った。操作はジョイパッドを使ってみた。
そこそこ、動くものが出来たが、学生に卒研でやらせようとしたらVB6のプログラムがC++のDLLを認識しなくたってしまった。
■FantomもC++もDLLも良く分からないく原因調査もめんどくさいので、VB6で(VB2005はこれまたよくわからない・・・・)全部出来ないかと思っていたら、普通のシリアルポートとして通信ができるとのこと、早速VB6+MSCOMMで作ってみた。
※こちらを参考にさせていただきました、ありがとうございました。
[VB] MSComm コントロールを使用してデータの送受信を行う方法
http://support.microsoft.com/kb/411403/ja
ruby-nxt の使い方 - モーターを回す(基本編)
http://bearmini.net/blog/View.aspx?bid=1&aid=133
NXTプログラミング
http://d.hatena.ne.jp/yaneurao/20080113
LEGO Mindstorm NXT Bluetooth
http://eto.com/d/LegoMindstormNxtBluetooth.html
※MSCOMMは16ポートまでしか使えないが、仮想COMポートがやたらと増えてしまったPCがあったので、減らす方法を調べた。
使用済みCOM番号(in use)を消す方法について
http://www.hdl.co.jp/USB/comno/index.html
XPのCOMポートの削除方法?
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200710/200710_07100027.html
----------------------------------------------------------------------
<Bluetooth接続処理>
Private Sub Command1_Click()
'接続処理
'開いていたらいたらシリアルポートを閉じる
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False 'シルアルポートを閉じる
End If
'ポートを設定
MSComm1.CommPort = Me.Combo1 ' 通信ポートCOMを指定
' Bluetoothの接続仮想ポートを確認
MSComm1.Settings = "9600,n,8,1" ' 通信条件設定
MSComm1.RThreshold = 1 ' 1バイト受信毎にOnCommイベント発生
MSComm1.SThreshold = 1 ' 送信バッファ空でOnCommイベント発生
End Sub
-------------------------------------------------------------------------
<ダイレクトコマンドをMSCommを経由して送る部分>
Dim Buffer() As Byte ' ダイレクトコマンド用のバイト型配列 Function nxtMotCont(MODE, MOTORSPEED) 'モータ駆動 On Error GoTo Err_End If Form1.MSComm1.PortOpen = False Then ' シリアルポートのオープン Form1.MSComm1.PortOpen = True End If '配列の再定義 ReDim Buffer(13) As Byte 'セット内容 ' 0xC, /0 送信バイト 14 - 2 バイト ' 0x00, /1 送信バイト ' 0x00, /2 Command Type 0x00 0x80 ダイレクトコマンド ' 0x04, /3 SET OUTPUT STATE */ ' 0xFF /4 Output Port(0- 2, 0xFF:ALL) */ ' 0, /5 Power set point (-100 - 100) */ ' 1+2, /6 Mode byte (1=Moter on / 2=Breake(ブレーキ)/ 4=Requlated) 組合せ指定*/ ' 0, /7 Requlation mode (0=no Requlation / 1=Control speed / 2=Moter sync) Requlated指定の場合のオプション*/ ' 0, /8 Turn ratio (-100 - 100) Moter syncの時のオプション*/ ' 0x20, /9 Run state(0x00=Idle / 0x10=Ramp up / 0x20=Running / 0x30=Ramp down) */ ' 0,0,0,0 /10-13 Tacho Limit 回転の目標角度*/ '初期値セット Buffer(0) = &HC Buffer(1) = &H0 Buffer(2) = &H80 Buffer(3) = &H4 Buffer(4) = &HFF Buffer(5) = &H20 Buffer(6) = &H3 Buffer(7) = &H0 Buffer(8) = &H0 Buffer(9) = &H20 Buffer(10) = &H0 Buffer(11) = &H0 Buffer(12) = &H0 Buffer(13) = &H0 '引数によるデータセット Dim mot_r As Integer Dim mot_l As Integer Select Case MODE Case 1 'Forward mot_r = MOTORSPEED 'Motor Power(Right) mot_l = MOTORSPEED 'Motor Power(Left) Case 2: 'BK Forward mot_r = -MOTORSPEED 'Motor Power(Right) mot_l = -MOTORSPEED 'Motor Power(Left) Case 3: 'Turn Left mot_r = MOTORSPEED 'Motor Power(Right) mot_l = -MOTORSPEED 'Motor Power(Left) Case 4: 'Turn Right mot_r = -MOTORSPEED 'Motor Power(Right) mot_l = MOTORSPEED 'Motor Power(Left) Case 5: 'Forward Left mot_r = MOTORSPEED 'Motor Power(Right) mot_l = MOTORSPEED * 0.5 'Motor Power(Left) Case 6: 'Forward Right mot_r = MOTORSPEED * 0.5 'Motor Power(Right) mot_l = MOTORSPEED 'Motor Power(Left) Case 7: 'BK Forward Left mot_r = -MOTORSPEED 'Motor Power(Right) mot_l = -MOTORSPEED * 0.5 'Motor Power(Left) Case 8: 'BK Forward Right mot_r = -MOTORSPEED * 0.5 'Motor Power(Right) mot_l = -MOTORSPEED 'Motor Power(Left) Case 0: 'Stop mot_r = 0 'Motor Power(Right) mot_l = 0 'Motor Power(Left) End Select '右モータ データ送信-------------------------- Buffer(4) = 1 'Output Port b 'マイナスデータの為の処理 Dim b As Byte b = mot_r And &HFF Buffer(5) = b 'Motor Power 'データ送信 Form1.MSComm1.Output = Buffer '左モータ データ送信------------------------------ Buffer(4) = 2 'Output Port c b = mot_l And &HFF Buffer(5) = b 'Motor Power 'データ送信 Form1.MSComm1.Output = Buffer nxtMotCont = 0 Exit Function Err_End: nxtMotCont = -2 End Function Function nxtGoodJob() '音声 good job 'On Error GoTo Err_End '閉じていたらシリアルポートのオープン If Form1.MSComm1.PortOpen = False Then Form1.MSComm1.PortOpen = True End If '0:0x10 1:0x00 2:0x00 3:0x02 4:0x00 5:0x47 6:0x6f 7:0x6f 8:0x64 9:0x20 10:0x4a '11:0x6f 12:0x62 13:0x2e 14:0x72 15:0x73 16:0x6f 17:0x00 ReDim Buffer(17) As Byte Buffer(0) = &H10 Buffer(1) = &H0 Buffer(2) = &H80 Buffer(3) = &H2 Buffer(4) = &H0 Buffer(5) = &H47 Buffer(6) = &H6F Buffer(7) = &H6F Buffer(8) = &H64 Buffer(9) = &H20 Buffer(10) = &H4A Buffer(11) = &H6F Buffer(12) = &H62 Buffer(13) = &H2E Buffer(14) = &H72 Buffer(15) = &H73 Buffer(16) = &H6F Buffer(17) = &H0
'データ送信
Form1.MSComm1.Output = Buffer
nxtGoodJob = 0
Exit Function
Err_End:
nxtGoodJob = -2
End Function
Function nxtBeep()
'ビープ音
'On Error GoTo Err_End
If Form1.MSComm1.PortOpen = False Then ' シリアルポートのオープン
Form1.MSComm1.PortOpen = True
End If
ReDim Buffer(7) As Byte
Buffer(0) = &H6
Buffer(1) = &H0
Buffer(2) = &H80
Buffer(3) = &H3
Buffer(4) = &H0
Buffer(5) = &H18
Buffer(6) = &H10
Buffer(7) = &H0
'データ送信
Form1.MSComm1.Output = Buffer
nxtBeep = 0
Exit Function
Err_End:
nxtBeep = -2
End Function
----------------------------------------------------------------
<Winsock>
Winsock部分は別の所で書いておきます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます