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になるはずです。 
                   
                   |