| 
 
                    
                      
                        | Visual Basic Express Editironでコマンド方式サーボを動かしてみる(3)
 |  
 (2)へ (4)へ 
 5.サーボ動作5.1.角度と時間を指定して動かすトルクON/OFFだけじゃどーしようもないので、とりあえずサーボを動かす所まで作ってみます。フォーム上にラベルとテキストボックスを2つずつと、ボタンを1つ配置します。
 並び順はどれでもいいんですが、なんとなくこんな感じにしてみます。
 
 
  
 ラベルは大して問題ないんですが、テキストボックスだけはプロパティで名称確認しておいてください。
 当然ながら、そこの指定が間違っていると正常に動作しません。。
 
 で、プログラムはこんな感じになります。
 
 Dim ShortPacket(20) As ByteDim 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 ByteDim 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) = &HFAShortPacket(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 &HFFShortPacket(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 ThenSerialPort1.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.ScrollDim 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にすると動きは速くなりますが、ちょっとギクシャクするような動きになります。
 時間を遅くすれば動き自体は滑らかになりますが、操作に対してちょっと遅れが出ます。
 このあたりは実際に使ってみて調整ということで・・・
 
 ともかく、これでマウス操作で簡単に動かせるようになりました。
 |