シリアルサーボ制御方法(5) PCから直接制御編(その2)

Posted on 2010.09.29 in

 

はじめに

今回はボタンやトラックバーにイベントを追加して、ICSサーボモーター制御プログラムを完成します。イベントとは「ボタンをクリックすると~~になる」というプログラムを作るときの「クリックすると」の部分です。例えばボタンの場合ですと「Click」というイベントがすでに用意されていますので、そのイベントについてプログラムを書き込むだけです。 前回フォーム上にたくさんのコントロールを配置しましたが、ここでは必要なイベントをまとめておきます。

コントロール名 イベント名 内容
Button1 Click クリックされたらCOMポートを接続する
ComboBox1 DropDown メニューが表示されたら接続可能なCOMポート名を表示する
TrackBar1 ValueChanged トラックバーの位置が変わったらサーボのポジションを移動する

 

イベントの追加

前回のプロジェクト(またはソリューションファイル)を読み込み、次の手順でイベントを追加します。フォームが表示されない場合は、ソリューションエクスプローラーウィンドウを開き、「Form1.vb」アイコンをダブルクリックしてください。

  1. Form1.vb[デザイン]タブをクリックしてフォームを表示します。
  2. イベントを追加したいコントロールをクリックして選択します。
  3. プロパティウィンドウのツールバーにあるイベントボタン(稲妻マーク)をクリックして、選択したコントロールのイベント一覧を表示します。
  4. イベント名の横の空欄をダブルクリックするとソースコードにイベントのひな形が追加されますので、そのひな形の中にプログラムを書きます。

IcsVBAddEvent

ComboBox1でCOMポート選択

ComboBox1コントロールのプルダウンメニューを開いたら、現在PCで接続可能なCOMポート一覧を表示するイベントを作ってみます。 プルダウンメニューを開くイベントは「DropDown」イベントです。フォーム上のComboBox1コントロールをクリックして、プロパティウィンドウの「DropDown」イベント名の横にある空欄をダブルクリックするとプログラムウィンドウが表示され、DropDownイベントのひな形が表示されます。ひな形が表示されましたら、下のプログラムを入力してください。入力するのはComboBox1.Items.Clear()~の2行だけです。

入力が完了しましたら、F5キーを押してデバッグ実行してみてください。ComboBox1コントロールの横にある下向き矢印ボタンを押すと、現在PCに接続されているCOMポート一覧が選択できるようになっています。

Button1でCOMポートに接続

次にButton1を使ってComboBox1コントロールで選択したCOMポートに、SerialPort1コントロールを接続してシリアル通信可能な状態にします。 フォーム上にあるButton1コントロールを選択し、プロパティウィンドウから「Click」イベント名を探します。見つかったら左の欄をダブルクリックして「Click」イベントのひな形をプログラムに追加します。追加できたら下のプログラムを入力してください。

ボタンを押したときに現在の接続状態を調べることは面倒なので、ボタンを押したら無条件でいったん通信を切断しています。そのあとでComboBoxコントロールで正しいCOMポートが選択されているか確認し、接続を行っています。

TrackBar1を動かしたらサーボを動かす

最後にTrackBar1を左右にスライドさせたら、その位置に合わせてサーボモーターを動かすプログラムを作成します。TrackBar1コントロールを選択し、プロパティウィンドウから「ValueChanged」イベントを追加してください。このイベントは、TrackBarコントロールをスライドさせたり直接値を代入した場合に発生します。 イベントのひな形が追加されたら、下のプログラムを入力してください。

ここでは前回作成した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キーを押してプログラムを実行し、下記手順でモーターを動かしてみてください。

  1. サーボモーターをICS USBアダプターに接続する。
  2. プログラムを起動して、ICS USBアダプターのCOMポートを選択する
  3. 接続ボタンを一回押す
  4. ID入力欄でサーボモーターのIDを選択する
  5. トラックバーをスライドさせて、モーターを動かす

IcsVBRunProgram

その他追加事項

内容を非常に簡略化したので、ボタンを押したときにCOMポートが正しく接続されているか分かりにくいので、正しく接続したときにはにフォームのタイトルバーに「接続完了」と表示するように下記プログラムを追加してもいいでしょう。

 

まとめ

サーボモーターを動かす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)をダブルクリックして開くとフォームが表示されます。

Visual C# のソースコード Zip_icon

Visual C++ のソースコード Zip_icon

Visual Basic のソースコード Zip_icon

 

シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(4) PCから直接制御編(その1)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(2) ICS編
シリアルサーボ制御方法(1) 回路編

 

KRS-3301 ICSの詳細をみる KRS-3304 ICSの詳細をみる KRS-3204 ICSの詳細をみる KRS-6003RHV ICSの詳細をみる KRS-2572HV ICSの詳細をみる KRS-4034HV ICSの詳細をみる KRS-4033HV ICSの詳細をみる KRS-4032HV ICSの詳細をみる KRS-4031HV ICSの詳細をみる KRS-2552RHV ICSの詳細をみる KRS-2542HV ICSの詳細をみる KRS-6003HV ICS Red Versionの詳細をみる