Visual Basic Express Editironで
コマンド方式サーボを動かしてみる(2)
|
(1)へ
(3)へ
4.サーボのトルクON/OFF
4.1.動作の内容
一番簡単な動作確認用のプログラムということで、
「ボタンを押したら指定されたIDのサーボのトルクをONにする」
というものを作ってみます。
とりあえずそれさえ出来れば、後は大体同じ感じで動かせるようになるかと。
4.2.入力欄の配置
サーボを動かすために必要な部品の構成ということで、ボタンやら入力欄やらを配置します。
以下いくつか、【ツールボックス】の【コモン コントロール】からフォーム上にドラッグ&ドロップしていきます。
ラベルとテキストボックス、ボタンを1つずつ配置します。
位置やサイズは後で調整できるので、適当なところにポンポン置いちゃいます。
置いたパーツをクリックすると、プロパティ欄に詳細が表示されます。
とりあえず表示内容に関連する部分を変更します。
【Label1】のプロパティで【Text】を、”Label1”から”ID”に変更します。
同様に、【Button1】のプロパティで【Text】を、”Button1”から”トルクON”に変更します。
4.3.プログラムの作成
先に作成したトルクONボタンをダブルクリックすると、次のような画面が開きます。
”Private Sub Button1_Click(・・・” から ”End Sub” の間が、
Butto1(トルクONのボタン)がクリックされたときのプログラム作成部になります。
で、そのプログラムの内容はこちら。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim ShortPacket(20) As Byte
Dim i, pID, sum As Integer
pID = CInt(TextBox1.Text)
ShortPacket(0) = &HFA
ShortPacket(1) = &HAF
ShortPacket(2) = pID
ShortPacket(3) = &H0
ShortPacket(4) = &H24
ShortPacket(5) = &H1
ShortPacket(6) = &H1
ShortPacket(7) = &H1
sum = ShortPacket(2)
For i = 3 To 7
sum = sum Xor ShortPacket(i)
Next
ShortPacket(8) = sum
Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show("シリアルポートエラー")
End Try
If SerialPort1.IsOpen = True Then
SerialPort1.Write(ShortPacket, 0, 9)
SerialPort1.Close()
End If
End Sub
これを丸ごとコピペするだけでも大丈夫なはずですが、内容の解説を。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
ここは自動的に作成されるので気にせずそのままに。
続けて使用する変数の定義をします。
Dim ShortPacket(20) As Byte
Dim i, pID, sum As Integer
サーボに送信されるショートパケットはByte型の変数”ShortPacket”で、長さは普通20バイトも無いと思いますがそれくらいに。
それと繰り返しのカウント用の”i”、IDのパラメータの”pID”、チェックサムの計算用の”sum”を、いずれも整数型で定義しておきます。
pID = CInt(TextBox1.Text)
テキストボックス1の内容を整数化したものをIDの変数”pID”とします。
続いて、ショートパケットの作成に入ります。
ShortPacket(0) = &HFA
ShortPacket(1) = &HAF
ショートパケットのヘッダーなので、FA AF となります。
VBなので16進法のままの表記の場合は頭に”&H”を付けます。
ShortPacket(2) = pID
3バイト目はIDなので、先ほど定義したpIDを入力します。
ShortPacket(3) = &H0
4バイト目はフラグです。
フラグは8ビットそれぞれに意味があるので、地道に考えます。
●ビット7:不使用
もともと不使用なので、常に0になります。
●ビット6:フラッシュROMに書き込み
トルクON/OFFはフラッシュROM領域とは関係ないので0で。
●ビット5:サーボを再起動
これも今は関係ないので0です。
●ビット4:初期値に戻す
戻さないので0で。
●ビット3~0:リターンパケットの指定
今回リターンパケットは取らないので、全部0で。
以上の内容をビット7→ビット0の順に並べて、内容確認します。
ビット7 6 5 4 3 2 1 0
値 0 0 0 0 0 0 0 0 = 0
ということで、ここも0(&H00)になります。
ShortPacket(4) = &H24
5バイト目はアドレスです。
サーボの取扱説明書に記載されているメモリマップを確認してください。
トルクON/OFFは、メモリマップのアドレスNo.36(16進法で24)になりますので、ここの値を&H24とします。
(実際には単に ”ShortPacket(4) = 36” でも動作します)
ShortPacket(5) = &H1
6バイト目はサーボに書き込むデータのバイト数(Length)です。
今はサーボON/OFFの1バイトしか書き込まないので、”1”になります。
ShortPacket(6) = &H1
7バイト目はデータを送信する対象となるサーボの数(実際にはそのIDの種類の数)です。
ショートパケットはサーボ1個を動かすためのものなので、常に”1”になります。
ShortPacket(7) = &H1
8バイト目以降が、実際に書き込まれるデータです。
今回はトルクONの1バイト分のみで、トルクONなら”1”になります。
これが”0”だとトルクOFF、”2”だとブレーキモードになります。
(詳細はサーボの取扱説明書、メモリマップNo.36の説明を参照)
sum = ShortPacket(2)
For i = 3 To 7
sum = sum Xor ShortPacket(i)
Next
ShortPacket(8) = sum
8バイト目はチェックサムになります。
※チェックサムの内容はアールティ様の方で紹介されているものと異なりますのでご注意ください。
双葉電子工業製のコマンド方式サーボ用のパケットでは、チェックサムは次のように定義されます。
チェックサム
=パケット列の ID からData の最後までを1バイト単位でXOR した値
”XOR”の意味については”排他的論理和”とかでググってみてください。
VB上での計算方法は非常にシンプルに”A XOR B”でAとBの排他的論理和が得られます。
IDは3バイト目、データは8バイト目までなので、3~8バイト目をXORします。
最初に3バイト目の値をsumに代入し、8バイト目までXORを繰り返していきます。
最終的な結果を、9バイト目に代入してパケットの作成は完了です。
Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show("シリアルポートエラー")
End Try
ここはアールティ様の講座からコピー。
指定されたシリアルポートをオープンするんですが、失敗したら「シリアルポートエラー」というメッセージが表示されるように仕込んでおきます。
If SerialPort1.IsOpen = True Then
SerialPort1.Write(ShortPacket, 0, 9)
SerialPort1.Close()
End If
ここもコピー。
シリアルポート1がオープン状態だったら、
シリアルポート1にショートパケットを0バイト目から9バイト分書き込み、
シリアルポートを閉じる
という内容になっています。 シリアルポートが開きっぱなしになっていると、あちこちに不都合があるので必ずCloseしてください。
End Sub
以上でボタン1をクリックしたときの内容は終了です。
4.4.動作確認
前項までの内容が書き終わったら、動作確認の意味でデバッグしてみましょう。
メニューの【デバッグ】から【デバッグ開始】を選択するか、F5キーを押してください。
下のようなウィンドウが開くと思います。
IDのテキストボックスに”接続しているサーボのID”(工場出荷時は”1”)を入力し、”トルクON”ボタンをクリックします。
問題がなければ、サーボの出力がONになります(回転はしません。ONしたときの位置のまま、出力だけがONになります)。
この時点ではトルクOFFボタンを作っていないので、一度トルクONになったら一旦サーボの電源入れなおしてから試してください。
VBとしての書式とかがおかしい場合は、デバッグ実行時にエラー表示が出ます。
ここでの内容についてはVB関連の書籍等参考に修正してください。
4.5.トルクOFFボタンの追加
フォーム上にもう1つボタンを追加します。
多分button2という名称になっていますので、表示だけ”トルクOFF”にします。
ボタン2が出来たら、ダブルクリックしてプログラムを作成します。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
Dim ShortPacket(20) As Byte
Dim i, pID, sum As Integer
pID = CInt(TextBox1.Text)
ShortPacket(0) = &HFA
ShortPacket(1) = &HAF
ShortPacket(2) = pID
ShortPacket(3) = &H0
ShortPacket(4) = &H24
ShortPacket(5) = &H1
ShortPacket(6) = &H1
ShortPacket(7) = &H0
sum = ShortPacket(2)
For i = 3 To 7
sum = sum Xor ShortPacket(i)
Next
ShortPacket(8) = sum
Try
SerialPort1.Open()
Catch ex As Exception
MessageBox.Show("シリアルポートエラー")
End Try
If SerialPort1.IsOpen = True Then
SerialPort1.Write(ShortPacket, 0, 9)
SerialPort1.Close()
End If
End Sub
こう言ってはナンですが、トルクONの場合とほとんど全く同じです。
違うのは赤字で書かれた一行だけ。
ShortPacket(7) = &H0
サーボの取扱説明書にもあるとおり、アドレスNo.36を”0(00H)”に設定すると、トルクがOFFになります。
というわけでデータに”0”を設定しています。
これでプログラム実行すれば、トルクONボタンでトルクがONに、トルクOFFボタンでOFFになるはずです。
|