Excel VBAでG-Robotsを制御する覚書


現在、出張で東京に着ているのですが、スーツケースにG-Robotsを忍ばせてきているので、講習会終わった後はラーメン屋めぐりしつつ、ホテルではまったりプログラミングしてたりします。

出張前にKO-LINK2のエクセルでの歩行シミュレーターにジョイスティックを対応させてみたのだけれど、エクセルからサーボも制御できればもっと面白いことが出来るはず・・・。
ただ、Dynamixelを制御マイコンのCM-5からスルーパケットで制御するためのライブラリがないので(作れば良いのだけれど)…
というわけで、ライブラリが公開されているG-Robotsを使ってエクセルで制御してみました。

ライブラリがRSC-U485用なので、RロボのRPU-11用に書き直しました。その改造方法を覚書として残します。
(今日のツイートでUE村さんも作られたみたいなので、出来ればFUTABAのサイトでスマートな公式版を出していただけると非常にありがたいですけど。)

さて基本的にFUTABAの「RSC-U485用サンプル for Microsoft Excel」をベースに改造します。改造点は3か所。

1.標準モジュール1内のsrvSendを改造

' サーボ制御用関数
' このコマンドを使用する場合には、通信ポートをオープンしておく必要がある
' 送信用する
'
Public Function srvSend(ByVal pCom As Long, ByVal pID As Integer, ByVal pFlag As Integer, ByVal pAddress As Integer, ByVal pCount As Integer, ByVal pLength As Integer, ByVal pDataLen As Integer, ByRef pData() As Byte) As Integer
Dim myBuf(512) As Byte
Dim mySum As Byte
Dim myRet As Long
Dim i As Integer
' 送信バッファを作成する
myBuf(0) = &H53                 ' 0x53
myBuf(1) = (pLength + 8) And &HFF
myBuf(2) = &HFA                 ' 0xFA
myBuf(3) = &HAF                 ' 0xAF
myBuf(4) = pID And &HFF         ' ID
myBuf(5) = pFlag And &HFF       ' Flag
myBuf(6) = pAddress And &HFF    ' Address
myBuf(7) = pLength And &HFF     ' Length
myBuf(8) = pCount And &HFF      ' Count
For i = 0 To (pDataLen - 1)
myBuf((i + 9)) = pData(i)
Next i
' SUMの計算
mySum = myBuf(4)
For i = 5 To (pDataLen + 8)
mySum = mySum Xor myBuf(i)
Next i
myBuf((pDataLen + 9)) = mySum
' 送信する
myRet = WriteComm(pCom, (pDataLen + 10), myBuf)
srvSend = myRet
End Function

2.受信用に標準モジュール1内にsrvSend2を追記

' サーボ制御用関数2(リターンパケット用)
' このコマンドを使用する場合には、通信ポートをオープンしておく必要がある
' 送信用する
'
Public Function srvSend2(ByVal pCom As Long, ByVal pID As Integer, ByVal pFlag As Integer, ByVal pAddress As Integer, ByVal pCount As Integer, ByVal pLength As Integer, ByVal pDataLen As Integer, ByRef pData() As Byte) As Integer
Dim myBuf(512) As Byte
Dim mySum As Byte
Dim myRet As Long
Dim i As Integer
' 送信バッファを作成する
myBuf(0) = &H54                 ' 0x54
myBuf(1) = (pLength + 9) And &HFF
myBuf(2) = &HFA                 ' 0xFA
myBuf(3) = &HAF                 ' 0xAF
myBuf(4) = pID And &HFF         ' ID
myBuf(5) = pFlag And &HFF       ' Flag
myBuf(6) = pAddress And &HFF    ' Address
myBuf(7) = pLength And &HFF     ' Length
myBuf(8) = pCount And &HFF      ' Count
For i = 0 To (pDataLen - 1)
myBuf((i + 9)) = pData(i)
Next i
' SUMの計算
mySum = myBuf(4)
For i = 5 To (pDataLen + 8)
mySum = mySum Xor myBuf(i)
Next i
myBuf((pDataLen + 9)) = mySum
myBuf((pDataLen + 10)) = &H10
' 送信する
myRet = WriteComm(pCom, (pDataLen + 11), myBuf)
srvSend2 = myRet
End Function

3.受信用に標準モジュール2内のServoGetDataを下記の通り改変

' サーボのデータを取得する
' 別途、通信用のポートをオープンしておく必要がある
' ビット演算がVBAにはない;;
' pCom      :通信ポート
' pID       :サーボID
'
Public Function ServoGetData(ByVal pCom As Long, ByVal pID As Integer, ByVal pFlag As Integer, ByRef pData() As Byte) As Long
Dim mySend As Long
Dim myRead As Long
Dim myID As Integer
Dim myFlag As Integer
Dim myAddress As Integer
Dim myCount As Integer
Dim myLength As Integer
Dim myBuf(256) As Byte
' 引数設定
myID = pID
myFlag = pFlag          ' 通常は9
myAddress = 0
myCount = 1
myLength = 0
myBuf(0) = 0
myBuf(1) = 0
' データを送信する
mySend = srvSend2(pCom, myID, myFlag, myAddress, myCount, myLength, myLength, myBuf)
' データの読み込み
myRead = ReadComm(pCom, 48, pData)
' 戻りを設定
ServoGetData = myRead
End Function

なんかかなり簡単に動いたので拍子抜け。
この勢いでGロボの逆運動学のエクセルシートも作ってみようと思う。

ただ、なぜか大腿部のサーボが焼けてしまったのでとりあえず帰ってから修理かな。
予備のサーボないのでションボリ。RS301CRって高いのよねー。ぐぬぬ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

アーカイブ

広告

Top