アルツの備忘録

最近、年のせいで物忘れが激しい。
そこで、いろんなことをここに記録して行きたいと思います。

LEGO MINDSTORMS の遠隔操作 2

2008年01月27日 22時20分10秒 | LEGO MINDSORMS
まず、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を経由して送る部分>

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部分は別の所で書いておきます。



最新の画像もっと見る

コメントを投稿