UE村工房 本文へジャンプ

Visual Basic Express Editiron
コマンド方式サーボを動かしてみる(3)


(2)へ

(4)へ


5.サーボ動作

5.1.角度と時間を指定して動かす

トルクON/OFFだけじゃどーしようもないので、とりあえずサーボを動かす所まで作ってみます。
フォーム上にラベルとテキストボックスを2つずつと、ボタンを1つ配置します。
並び順はどれでもいいんですが、なんとなくこんな感じにしてみます。



ラベルは大して問題ないんですが、テキストボックスだけはプロパティで名称確認しておいてください。
当然ながら、そこの指定が間違っていると正常に動作しません。。

で、プログラムはこんな感じになります。


Dim ShortPacket(20) As Byte
Dim i, pID, sum As Integer
Dim pAngle, pTime As Integer

pID = CInt(TextBox1.Text)
pAngle = CInt(TextBox2.Text) * 10
pTime = CInt(TextBox3.Text) * 100


ShortPacket(0) = &HFA
ShortPacket(1) = &HAF
ShortPacket(2) = pID
ShortPacket(3) = &H0
ShortPacket(4) = &H1E
ShortPacket(5) = &H4

ShortPacket(6) = &H1

ShortPacket(7) = pAngle And &HFF
ShortPacket(8) = Int(pAngle / 256) And &HFF
ShortPacket(9) = pTime And &HFF
ShortPacket(10) = Int(pTime / 256) And &HFF


sum = ShortPacket(2)
For i = 3 To 10
sum = sum Xor ShortPacket(i)
Next

ShortPacket(11) = sum

Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show("シリアルポートエラー")
End Try

If SerialPort1.IsOpen = True Then
SerialPort1.Write(ShortPacket, 0, 12)
SerialPort1.Close()
End If
End Sub

トルクON/OFFとは違う点が出てきますので、ちょっとずつ解説をば。


Dim ShortPacket(20) As Byte
Dim i, pID, sum As Integer
Dim pAngle, pTime As Integer

目標角度”pAngle”と移動時間”pTime”をInt型で宣言しておきます。
別に二行目にまとめてしまっても問題ないですが、まぁ気持ちの問題ということで。


pID = CInt(TextBox1.Text)
pAngle = CInt(TextBox2.Text) * 10
pTime = CInt(TextBox3.Text) * 100

TextBox1の内容をpIDに入れるところはトルクON/OFFと同じ。

TextBox2の内容をpAngleに、TextBox3の内容をpTimeに代入しますが、ここで注意。
サーボに送信される角度は0.1度単位、時間は10msec=0.01秒単位になります。

テキストボックスに入力する内容は1度単位、1秒単位の方が判りやすいので、
入力された内容をそれぞれ10倍、100倍して単位を揃えます。


ShortPacket(0) = &HFA
ShortPacket(1) = &HAF
ShortPacket(2) = pID
ShortPacket(3) = &H0
ShortPacket(4) = &H1E
ShortPacket(5) = &H4

ShortPacket(6) = &H1

ヘッダーからフラグまでは特に変化なし。
ただのショートパケットなので、IDを指定して、フラグは0になります。

5バイト目と6バイト目でアドレスNo.30(1EH)から4バイト分を指定します。
No.30/31の2バイトが目標角度、No.32/33の2バイトが目標時間になります。

カウントは1に固定なので01Hのままです。


ShortPacket(7) = pAngle And &HFF
ShortPacket(8) = Int(pAngle / 256) And &HFF
ShortPacket(9) = pTime And &HFF
ShortPacket(10) = Int(pTime / 256) And &HFF

2バイトで指定する項目は、1バイトずつに分けて入力する必要があります。

たとえば150度を指定する場合、0.1度単位にすると1500になります。
1500は”05DC”という2バイト分になりますが、これを1バイトずつに分けるので
”DC””05”という連続した1バイトx2にする必要があります。

”pAngle And &HFF とすることで、下位2バイトだけを拾ってくれます。
なので下位2バイトはそのままpAngleとpTimeの下位2バイトを拾ったものを指定します。

あとは下位の分を切り捨てるために256(FFH)で割って整数化したものを拾うだけ。
上記の例で1500だったら256で割って5.859375、この小数点以下をInt()で切り捨てて整数部分が5(05H)になります。


※正直なところこの辺の言い方が良いのかどうかさっぱり判りません。
※まぁ、こういう風にすれば入力できるよ、という程度でご容赦ください。。

他の2バイトの場合も同様の方法でうまくいくハズです。


sum = ShortPacket(2)
For i = 3 To 10
sum = sum Xor ShortPacket(i)
Next

ShortPacket(11) = sum

例によってチェックサムの計算です。
データが長いので、全体で12バイトになります。

※Length利用して自動的に読み込みバイト数調整した方が便利そうです。


If SerialPort1.IsOpen = True Then
SerialPort1.Write(ShortPacket, 0, 12)
SerialPort1.Close()
End If
End Sub

送信するバイト数が違うのでご注意を。


ShortPacket(4) = &H24

5.2.トラックバーで動かす

これで数値を入力して動かせるようになりましたが、ちょっと寄り道して別の方法で操作してみます。
使うのは【ツールボックス】の中の【すべてのWindowsフォーム】内にある【トラックバー】です。


トラックバーは標準よりも長めの方が操作しやすいかもしれません。
画面サイズとかマウスの設定にもよりけりですので、お好みで表示幅調整してみてください。



トラックバーは、プロパティ欄でいくつか設定が必要になります。

【Maximum】
カーソルが右端に行ったときのトラックバーの値です。
サーボの角度の最大値にしたいので、”150”に設定します。

【Minimum】
カーソルが左端に行ったときのトラックバーの値です。
サーボの角度の最小値にしたいので、”-150”に設定します。

【Tick Frequency】
トラックバーの下にあるメモリの間隔です。
まぁ別にいじらなくてもいいんですが、気分的に”10”くらいにしときます。

で、プログラムです。
ボタン同様、トラックバーをダブルクリックしてプログラム入力欄に移動します。


Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
Dim ShortPacket(20) As Byte
Dim i, pID, sum As Integer
Dim pAngle, pTime As Integer

pID = CInt(TextBox1.Text)
pAngle = CInt(TrackBar1.Value) * 10
pTime = CInt(TextBox3.Text) * 100

TextBox2.Text = TrackBar1.Value

ShortPacket(0) = &HFA
ShortPacket(1) = &HAF
ShortPacket(2) = pID
ShortPacket(3) = &H0
ShortPacket(4) = &H1E
ShortPacket(5) = &H4
ShortPacket(6) = &H1

ShortPacket(7) = pAngle And &HFF
ShortPacket(8) = Int(pAngle / 256) And &HFF
ShortPacket(9) = pTime And &HFF
ShortPacket(10) = Int(pTime / 256) And &HFF

sum = ShortPacket(2)
For i = 3 To 10
sum = sum Xor ShortPacket(i)
Next

ShortPacket(11) = sum

Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show("シリアルポートエラー")
End Try

If SerialPort1.IsOpen = True Then
SerialPort1.Write(ShortPacket, 0, 12)
SerialPort1.Close()
End If
End Sub

基本的に角度入力して動かす場合と同じですので、丸ごとコピーして赤文字の2行をいじるだけでいいです。
pAngle = CInt(TrackBar1.Value) * 10

目標角度の指定を、テキストボックスではなくトラックバーの値(TrackBar1.Value)から取ります。
トラックバーの値を1度単位で作っていたので、10倍して0.1度単位に直しています。
TextBox2.Text = TrackBar1.Value

トラックバーだけだと何度を指示しているのかわからないので、角度の指定に使っていたテキストボックスにトラックバーで指示した角度の値を表示させます。

いじるのはたったこれだけです。
これでデバッグ実行して、トルクON後にトラックバーのカーソルをドラッグすると、サーボが動くはずです。

移動時間は移動時間入力欄の時間を拾ってくるようになっているので、動かし方に応じて適当に調整してみてください。
0にすると動きは速くなりますが、ちょっとギクシャクするような動きになります。
時間を遅くすれば動き自体は滑らかになりますが、操作に対してちょっと遅れが出ます。
このあたりは実際に使ってみて調整ということで・・・

ともかく、これでマウス操作で簡単に動かせるようになりました。