はじめに
今回は弊社製シリアルサーボモーターをPCから直接制御する方法およびプログラムについて説明します。
PCからシリアルサーボモーターを制御するには、Dual USBアダプターHS、ICS USBアダプターまたはICS USBアダプターHSを使います。付属の2又ケーブルと延長コードを使って信号線と電源線を接続してください。
環境設定
PCではどんな言語を使用しても良いのですが、今回はシリアル通信が簡単にできるような仕組みを持っている、Microsoft社のVisual Basicを使うことにします。Visual BasicはVisual Basic 2010 Express版が無料で使えますので、まずは下記URLにアクセスして、ダウンロードしてください。30日以上使用する場合はMicrosoft社に登録する必要がありますので注意してください。
ダウンロード先 http://www.microsoft.com/japan/msdn/vstudio/express/
ダウンロードが終わったらインストールを行ってください。
起動とプログラム作成
準備
インストールが終わったら早速起動してみましょう。スタートメニューの「Microsoft Visual Studio 2010 Express」から「Microsoft Visual Basic 2010 Express」を起動してください。
-
ファイルメニューから「新しいプロジェクト(P)」を選択します。
-
表示された「新しいプロジェクト」ダイアログから、「Windowsフォームアプリケーション」を選択します。
また、下にある「名前(N)」欄にプロジェクトの名前を入力します。ここでは「IcsSetPosition」と言う名前を付けますが、好きな名前で結構です。名前を入力したらOKボタンを押します。
クリックで拡大
-
下記のような起動画面が表示されます(ツールボックスウィンドウはタブをクリックすると開きます)。
クリックで拡大
ビルド
Visual Basicは昔ながらのBasic言語ではありません。作成したプログラムを実行するには、ビルド作業が必要です。デバッグメニューの「デバッグ開始」か、F5キーを押してください。
画面上に何もないウィンドウが表示されたらここまでは成功です。終了するにはフォーム上の終了ボタン(×マーク)をクリックするか、デバッグメニューから「デバッグの停止」を選択してください。
Visual Studioの簡単な説明
よく使うウィンドウは、「ツールボックス」ウィンドウと、「ソリューションエクスプローラー」ウィンドウ、「プロパティ」ウィンドウです。これらは「表示」メニューの「その他のウィンドウ」から開いたり閉じたりすることができます。
ウィンドウは取り外し、ドッキングができます。各ウィンドウのタイトルバーにある押しピンアイコンをクリックすると、自動的にウィンドウが隠れるような設定も可能です。
-
ツールボックス
-
ボタンなどの部品(コントロールと言います)がリスト表示されています。コントロールをクリックして選択してから、画面上のフォームをクリックすると、選んだコントロールが張り付きます。
-
ソリューションエクスプローラー
-
プロジェクトのファイル構成などを表示します。ツリー表示でファイル名を変更することもできます。
-
プロパティ
-
フォーム上でクリックしたコントロールのプロパティを表示します。プロパティでは文字の色や大きさを変えたりすることができます。また、プロパティウィンドウのツールバーにある「イベント」ボタン(稲妻マーク)を押すことで、選択したコントロールのイベントを設定できるようになります。
画面をデザインする
まずは画面をデザインしてみましょう。今回は下の手順で動作する、サーボモーター制御プログラムを作成します。
-
ComboBoxコントロール(入力も可能なプルダウン式メニュー)でシリアルポートを選択する。
-
接続ボタンでCOMポート(ICS USBアダプター)と接続する。
-
ID番号をセットする。
-
スライドバーを動かすとその通りにサーボモーターが動作する。
-
数値を直接代入することもできる。
下のスクリーンショットのように、ツールボックスからTrackBar(スライドバーのこと)、Button、ComboBox(入力もできるメニュー)などを配置してみましょう。コントロールの位置は画面と全く同じにする必要はありませんので、TrackBarを左右にスライドさせてサーボモーターを動かすことをイメージして、好きなように配置してください。TrackBarコントロールなど、ツールボックスウィンドウをぱっと見てもに見当たらないコントロールは、ツールボックスウィンドウの一番上にある「全てのWindowsフォーム」をクリックすると使用できる全コントロールがアルファベット順で表示されますので、そこから探してください。
シリアル通信を行うSerialPortコントロールは、非ビジュアルコントロールですので、フォーム上に貼り付けてもフォーム外(下の方)に配置されます。
クリックで拡大
配置が終わったら、ボタンなどのプロパティを設定します。プロパティウィンドウが表示されていない場合は、表示メニュー>その他のウィンドウメニューから開いてください。フォーム上のコントロールをクリックして選択すると、そのプロパティが表示されます。
プロパティウィンドウは左の欄がプロパティの名前で、その右側に値を入れるとコントロールの見た目や動作がリアルタイムに変化します。まずは各コントロールのプロパティ名の欄に対応するプロパティ値を下記表の通りに設定しながら、画面の変化を見てください。
SerialPortコントロールはフォーム上にはありません。フォームが表示されているウィンドウの下方に配置されていますので、注意してください。
|
コントロール名
|
プロパティ名
|
プロパティ値
|
内容
|
|
Form1
|
Text
|
ICS ポジション設定
|
ウィンドウのタイトル
|
|
Label1
|
Text
|
ID番号
|
ラベルの名称
|
|
Button1
|
Text
|
接続
|
ボタンのテキスト
|
|
NumericUpDown1
|
Maximum
|
31
|
ID最大値
|
|
|
Minimum
|
0
|
ID最小値
|
|
TextBox1
|
|
|
特に設定項目はない
|
|
TrackBar1
|
Maximum
|
11500
|
ポジション最大値
|
|
|
Minimum
|
3500
|
ポジション最小値
|
|
|
Value
|
7500
|
ニュートラル
|
|
|
TickFrequency
|
250
|
表示目盛りの細かさ
|
|
SerialPort1
|
Baudrate
|
115200
|
通信速度
|
|
|
Parity
|
Even
|
パリティを偶数にする
|
|
|
ReadTimeout
|
100
|
読み込み待ち時間を100msに
|
|
ComboBox1
|
|
|
特に設定項目はない
|
set_pos関数を作る
ソフト編で作成したset_pos関数をVisual Basicで作ってみます。まず、フォームの上で右クリックすると「コードの表示」というメニューが出るので、プログラムコードを表示してください。F7キーを押して表示もできます。フォームのデザインに戻るときは「Form1.vb [デザイン]」タブをクリックしてください。
クリックして拡大
画面上に「Public Class Form1 ~ End Class」と表示されますが、プログラムはこの間に記述します。内容はあまり考えずに、下のプログラムを入力してください(前回の「シリアルサーボ制御方法(3) ソフト編」のプログラムとほぼ同じ構成になっていますので比較してみてください)。入力途中で入力候補が表示されたときはTABキーを押すと候補が確定します。プログラムソースコードの緑の部分はコメントですので、入力しなくとも大丈夫です。
Public Class Form1
Private Function SetPos(ByVal Id As Integer, ByVal Pos As Integer) As Integer
Dim Tx(3) As Byte 'unsigned char Tx[3]
Dim Rx(6) As Byte 'unsigned char Rx[6](ループバックを含む)
Dim Dat As Integer 'int Dat
Dim Flag As Boolean = True '正しくデータが受け取れたかチェックするフラグ
Tx(0) = &H80 Or Id 'Tx[0] = 0x80 | id
Tx(1) = Pos >> 7 And &H7F 'Tx[1] = (pos >> 7) & 0x7F
Tx(2) = Pos And &H7F 'Tx[2] = pos & 0x7F
SerialPort1.DiscardInBuffer() 'いったんバッファをクリアする
SerialPort1.DiscardOutBuffer()
SerialPort1.Write(Tx, 0, 3) 'Tx配列(ICSコマンド)をシリアルポートから出力する
For i As Integer = 0 To 5 Step 1 '1バイト受信を6回繰り返します
Try 'データを1バイト受信する
Rx(i) = CType(SerialPort1.ReadByte(), Byte) 'CTypeは型変換関数
Catch ex As Exception '何かしらの理由で受信失敗
Flag = False
Exit For 'ループは終了する
End Try
Next
If Flag = False Then '受信に失敗したので-1を返す
SetPos = -1 '関数名に値を代入すると値を返して関数終了
End If
Dat = CType(Rx(4), Integer) 'データを元に戻す
Dat = (Dat << 7) + CType(Rx(5), Integer)
SetPos = Dat '関数名に値を代入すると値を返して関数終了
End Function
End Class
プログラムの簡単説明
プログラムを簡単に説明すると、次のような手順となっています。
-
C言語でのプログラムのように必要な変数を「Dim Tx(3), Rx(6) As Byte」などと準備してから、Txにはポジションコマンドをセットします。
-
「SerialPort1.Write (Tx, 0, 3)」で、Tx変数にセットしたコマンドを3バイト分だけSerialPort1から書き込みます。
-
ICS規格では、PCから送信した場合は送信多命令と同じものが返ってきますので、受け取りは6バイトになります。これを「For」の繰り返しで1バイトずつ受け取っています。
-
データ受け取りに失敗した場合はSetPos = -1としています。Visual Basicでは関数の名前に値を代入すると返値となります(C言語ではreturnに相当)。
-
データ受け取りに成功した場合は、受け取ったデータをポジションデータに戻して、値を返して関数を終了しています。
「For i As Integer = 0 To 5 Setp 1」はC言語で書き直せば「int i; for (i = 0; i <= 5; i++)」と言う意味です。
Try ~ Catch
19~24行あたりのTry~Catch節は簡単に言えば「とりあえずTry節を実行してみて、何か問題があったら(例外を受け取ったら)Catch節へ処理を移す」というものです。C言語などで存在していた実行時エラーによるプログラムクラッシュを予防することができるようになっています。
シリアル通信では設定した受信タイムアウト時間を待っても受信できなかったときには、SerialPort.ReadByte関数は「TimeoutException」例外を発生し、Catch節へ処理が移ります。
今回はSerialPort1の受信タイムアウト時間を適当に100msにセットしておきましたので、100ms待ってもサーボモーターから返事がない場合は、Catch節へ移動します。Catch節では受信に失敗しましたよフラグ(Flag)をセットして、Forループを終了(Exit For)しています。
再ビルド
プログラムの入力が完了したら、再度ビルド作業を行います。スクリーンショットのように、フォームが表示されればここまでは成功です。ビルド時にエラーが出たらエラーの文字をダブルクリックすると、エラーが発生した行が表示されますので、間違いを直して再ビルドしてください。
クリックして拡大
次回は画面デザイン時に設計した動作をプログラムに追加して、プログラムの完成を目指します。
用語説明
-
プロジェクト
-
Visual Basicなどではプログラムソースコードや画面のデザイン、コンパイル条件設定などをまとめて「プロジェクト」という単位で管理しています。従来はテキストエディタでソースコードを記述しコンパイルなどを行っていましたが、現在の開発環境ではあまりメジャーではなくなりました。
-
フォーム
-
フォームアプリケーションの、「フォーム」とは、起動時に表示されるウィンドウのことで、ボタンなどの様々なコントロールをこのフォーム上に配置することができます。
-
非ビジュアルコントロール
-
ボタンなどと違って、マウスクリックやキー入力などをきっかけにしてプログラムを実行したり、見た目を変化させたりする必要がないコントロールを非ビジュアルコントロールと言います。
シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(2) ICS編
シリアルサーボ制御方法(1) 回路編