シリアルサーボ制御方法(5) PCから直接制御編(その2)
はじめに
今回はボタンやトラックバーにイベントを追加して、ICSサーボモーター制御プログラムを完成します。イベントとは「ボタンをクリックすると~~になる」というプログラムを作るときの「クリックすると」の部分です。例えばボタンの場合ですと「Click」というイベントがすでに用意されていますので、そのイベントについてプログラムを書き込むだけです。 前回フォーム上にたくさんのコントロールを配置しましたが、ここでは必要なイベントをまとめておきます。
コントロール名 | イベント名 | 内容 |
Button1 | Click | クリックされたらCOMポートを接続する |
ComboBox1 | DropDown | メニューが表示されたら接続可能なCOMポート名を表示する |
TrackBar1 | ValueChanged | トラックバーの位置が変わったらサーボのポジションを移動する |
イベントの追加
前回のプロジェクト(またはソリューションファイル)を読み込み、次の手順でイベントを追加します。フォームが表示されない場合は、ソリューションエクスプローラーウィンドウを開き、「Form1.vb」アイコンをダブルクリックしてください。
- Form1.vb[デザイン]タブをクリックしてフォームを表示します。
- イベントを追加したいコントロールをクリックして選択します。
- プロパティウィンドウのツールバーにあるイベントボタン(稲妻マーク)をクリックして、選択したコントロールのイベント一覧を表示します。
- イベント名の横の空欄をダブルクリックするとソースコードにイベントのひな形が追加されますので、そのひな形の中にプログラムを書きます。
ComboBox1でCOMポート選択
ComboBox1コントロールのプルダウンメニューを開いたら、現在PCで接続可能なCOMポート一覧を表示するイベントを作ってみます。 プルダウンメニューを開くイベントは「DropDown」イベントです。フォーム上のComboBox1コントロールをクリックして、プロパティウィンドウの「DropDown」イベント名の横にある空欄をダブルクリックするとプログラムウィンドウが表示され、DropDownイベントのひな形が表示されます。ひな形が表示されましたら、下のプログラムを入力してください。入力するのはComboBox1.Items.Clear()~の2行だけです。
1 2 3 4 |
Private Sub ComboBox1_DropDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.DropDown ComboBox1.Items.Clear() 'ComboBoxメニューの中身をいったん削除する ComboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()) '接続中の全COMポート名をメニューに追加する End Sub |
入力が完了しましたら、F5キーを押してデバッグ実行してみてください。ComboBox1コントロールの横にある下向き矢印ボタンを押すと、現在PCに接続されているCOMポート一覧が選択できるようになっています。
Button1でCOMポートに接続
次にButton1を使ってComboBox1コントロールで選択したCOMポートに、SerialPort1コントロールを接続してシリアル通信可能な状態にします。 フォーム上にあるButton1コントロールを選択し、プロパティウィンドウから「Click」イベント名を探します。見つかったら左の欄をダブルクリックして「Click」イベントのひな形をプログラムに追加します。追加できたら下のプログラムを入力してください。
1 2 3 4 5 6 7 |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SerialPort1.Close() 'いったんポートを閉じる If ComboBox1.Text <> String.Empty Then 'COMポート名が空っぽでなかったら(正しく選択されていた場合) SerialPort1.PortName = ComboBox1.Text 'ポート名を指定する SerialPort1.Open() 'ポートを開く(接続する) End If End Sub |
ボタンを押したときに現在の接続状態を調べることは面倒なので、ボタンを押したら無条件でいったん通信を切断しています。そのあとでComboBoxコントロールで正しいCOMポートが選択されているか確認し、接続を行っています。
TrackBar1を動かしたらサーボを動かす
最後にTrackBar1を左右にスライドさせたら、その位置に合わせてサーボモーターを動かすプログラムを作成します。TrackBar1コントロールを選択し、プロパティウィンドウから「ValueChanged」イベントを追加してください。このイベントは、TrackBarコントロールをスライドさせたり直接値を代入した場合に発生します。 イベントのひな形が追加されたら、下のプログラムを入力してください。
1 2 3 4 5 6 7 8 9 |
Private Sub TrackBar1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.ValueChanged Dim Pos As Integer 'サーボから返ってきたデータを保存するための変数 If SerialPort1.IsOpen = True Then 'COMポートが接続済みである場合だけ処理を行う Pos = SetPos(NumericUpDown1.Value, TrackBar1.Value) 'SetPosコマンドにID番号とTrackBarの位置(ポジション)を送る If Pos <> -1 Then 'モーターがきちんと動作した場合 TextBox1.Text = Pos.ToString() '受け取った現在位置データを文字列に変換して、TextBoxコントロールに表示する End If End If End Sub |
ここでは前回作成したSetPosコマンドを使っています。ID番号(NumericUpDown1.Value)とTrackBarコントロールのスライド位置(TrackBar1.Value)をSetPos関数に送ってサーボモーターを動かし、サーボモーターから返ってきた値が正しい場合はTextBox1コントロールに結果を表示しています。
SetPos関数でポジションコマンドを送ったときに返ってくる値は、サーボモーターがコマンドを受け取った時点での位置です。サーボモーターはコマンドで指示された位置へ到達しているわけではありませんので、スライドバーの位置とTextBox1の値は必ずしも連動しません。 なお、「If Pos <> -1 Then ~ End If」の部分では、SetPos関数でポジションコマンドをサーボモーターに送ったとき、何らかのエラーがおきるとSetPos関数は-1を返すように設計しました(詳細は「シリアルサーボ制御方法(4) PCから直接制御編(その1)」を参照)ので、「エラーが起きていない場合は返値をTextBox1に表示する」という処理をしています。 Visual Basicでは「~に等しくない」という条件を「<>」と表現します。C言語における「!=」にあたります。
プログラムを実行しましょう
以上でプログラムは完了です。F5キーを押してプログラムを実行し、下記手順でモーターを動かしてみてください。
- サーボモーターをICS USBアダプターに接続する。
- プログラムを起動して、ICS USBアダプターのCOMポートを選択する
- 接続ボタンを一回押す
- ID入力欄でサーボモーターのIDを選択する
- トラックバーをスライドさせて、モーターを動かす
その他追加事項
内容を非常に簡略化したので、ボタンを押したときにCOMポートが正しく接続されているか分かりにくいので、正しく接続したときにはにフォームのタイトルバーに「接続完了」と表示するように下記プログラムを追加してもいいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SerialPort1.Close() 'いったんポートを閉じる If ComboBox1.Text <> String.Empty Then 'COMポート名が空っぽでなかったら(正しく選択されていた場合) SerialPort1.PortName = ComboBox1.Text 'ポート名を指定する SerialPort1.Open() 'ポートを開く(接続する) '----- 追加部分 ----- If SerialPort1.IsOpen = True Then 'ポートが接続完了した場合 Me.Text = Me.Text + " [接続完了] " 'フォーム(ここではMe)のタイトルバーに[接続完了]の文字を追加する End If '----- 追加部分 ----- End If End Sub |
まとめ
サーボモーターを動かすGUIプログラムが、なんと40行程度の入力で完成しました(※予期せぬエラーを防ぐような仕組みは、説明を簡単にするためにあまり取り入れていません)。 全5回構成でICSシリアルサーボモーターの制御方法などの説明と、サーボモーターを実際動かしてみるプログラムを作成しました。近藤科学株式会社のICS規格は半二重通信ですので、特に送受信タイミングもそれほどシビアではなく、プログラミングも簡単です。SetPos関数と同様にSetSpeedやSetStretch関数などを作成して、コントロールを追加すれば簡単にサーボモーターの特性を変えることもできます。ぜひお試しください。 今回はVisual Basicでプログラムを作成しましたが、同様の方法でVisual C++とVisual C#でプログラムを作成しましたので、ダウンロードしてご利用ください。 <注意点>
- 下のZIPファイルを解凍しますと、それぞれ「IcsSetPosition_CSS」、「IcsSetPosition_CPP」、「IcsSetPosition_VB」というフォルダができます。それぞれのフォルダには「Debug」というフォルダがありますので、その中にある「IcsSetPosition.exe」を起動してください。
- また、それぞれのフォルダにはIcsSetPosition.slnというVisual Studioソリューションファイルがあります。プログラムを書き直したい場合はこちらをダブルクリックして開いてください。
- 2010より以前のVisual Studioではソリューションファイルを開くことはできません。その場合は各フォルダにあるソースコード(C#: Form1.cs、C++: Form1.h、VB: Form1.vb)を参照にプログラムを書き直してください。古いVisual Studioでも使い方はそれほど変わりません。
- ソリューションファイルを開いたときにフォームが表示されない場合は、ソリューションエクスプローラーウィンドウからForm.vb(またはForm.cs、Form.h)をダブルクリックして開くとフォームが表示されます。
シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(4) PCから直接制御編(その1)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(2) ICS編
シリアルサーボ制御方法(1) 回路編
KRS-2552R3HV ICSの詳細をみる KRS-3204R2 ICSの詳細をみる KRS-2572R2HV ICSの詳細をみる KRS-2552R2HV ICSの詳細をみる KRS-2542R2HV ICS の詳細をみる KRS-9004HV ICSの詳細をみる KRS-5054HV ICS H.Cの詳細をみる KRS-5053HV ICS H.Cの詳細をみる KRS-5034HV ICSの詳細をみる KRS-5033HV ICSの詳細をみる KRS-5032HV ICSの詳細をみる KRS-6104FHV ICSの詳細をみる KRS-3304R2 ICSの詳細をみる KRS-3302 ICSの詳細をみる KRS-6003R2HV ICSの詳細をみる KRS-3301 ICSの詳細をみる KRS-3304 ICSの詳細をみる KRS-3204 ICSの詳細をみる KRS-6003RHV ICSの詳細をみる KRS-2572HV ICSの詳細をみる KRS-4037HV ICSの詳細をみる KRS-4034HV ICSの詳細をみる KRS-4033HV ICSの詳細をみる KRS-4032HV ICSの詳細をみる KRS-4031HV ICSの詳細をみる KRS-2552RHV ICSの詳細をみる KRS-2542HV ICSの詳細をみる KRS-6003HV ICS Red Versionの詳細をみる