■ICS3.5マネージャーマニュアル更新版
ICS3.5マネージャーのマニュアルを更新しました。
各設定項目の詳細情報や、初期パラメーターの値についての情報が追加されています。
ICS3.5マネージャー ソフトウエア マニュアルVer1.1
ICS3.5マネージャーのマニュアルを更新しました。
各設定項目の詳細情報や、初期パラメーターの値についての情報が追加されています。
ICS3.5マネージャー ソフトウエア マニュアルVer1.1
ICS(Interactive Communication System)は、モジュール・コントロールボード間の双方向データ通信規格です。コントロールボードでのサーボの制御時の通信や、PCなどを使用してのサーボモーターの設定変更などが可能です。コマンドリファレンスが公開されていますので、自作ボードでの制御にも対応します。
<”シリアル” ⇔ ”PWM”の切り替えが可能>
【ICS3.5】では、【ICS3.0】のシリアル制御機能はそのままに、PWM信号での制御が可能になりました。
▼ICS3.5コマンドリファレンスダウンロード
http://kondo-robot.com/sys/archives/2111
フリーソフトICS3.5マネージャーとICS USBアダプターHSを使用することでICS3.5対応サーボモーターの設定を簡単に変更できます。
▼ICS3.5マネージャーダウンロード
http://kondo-robot.com/sys/archives/3476
ISC3.5マネージャーソフトウエア アップデート版を公開します。
ICS3.5対応のKRS-403xシリーズに使用してサーボの各種設定を行っていただくことが出来ます。
同時に配布のマニュアルは以前のバージョンと同じで記載がありませんが、
【2011年2月16日更新】最新版にマニュアルを入れ替えております。
なお、最新版マニュアル単体は、こちらでダウンロードしていただけます。
Windows7 64ビット版でもご使用していただけます。
※ファイルは圧縮ファイルで提供されています。解凍すると
PDFファイルのマニュアルと、Ics35Managerフォルダが出来ますので
フォルダを適当な場所にコピーしてご使用ください。
なお、古いバージョンをお使いの場合には、あらかじめ前のバージョンのファイルを削除して下さい。
※使用するためには別途ICS-USB アダプターHS を用意して頂く必要があります。
KRS-6003HVが対応するISC3.0用のサーボマネージャー最新版です。
(以前は ICS3.0シリアルマネージャー B の名称で公開)
※使用するには、インターフェースとしてICS−USBアダプターまたはICS-USBアダプターHSが必要です。
ファイルは圧縮ファイルで提供されており、シリアルマネージャーのソフトウエアとマニュアルが含まれます。
10月29日公開ドライバーの一部に不都合がありましたので、修正版を公開します。
●修正点:Windows7 x64環境下で正常にインストール出来なかった。
該当する環境でご使用の方は、お手数ですが、ダウンロードの上ご使用下さい。
なお、既に正常に使用されている方は、差し替えの必要はありません。
新規に使用される方はこちらの最新版をご使用下さい。
新たにご用意したファイルは右からダウンロードして下さい。
KO_Driver2011_R2.zip
KO_Driver_2011は弊社製シリアルUSB変換機器をWindowsで使用するためのドライバーファイルです。対応OSは次のようになっています。
· Windows Server 2008 R2
· Windows 7 / Windows 7 x64
· Windows Server 2008 / Windows Server 2008 x64
· Windows Vista / Windows Vista x64
· Windows Server 2003 / Windows Server 2003 x64
· Windows XP / Windows XP x64
· Windows 2000
対応できるデバイスは以下の通りです。
| PID | デバイス名 |
| 0001 | ICS USB アダプター |
| 0002 | シリアルUSBアダプター |
| 0003 | ARC Type 4 |
| 0004 | 2.4GHzバンドモニター |
| 0005 | - |
| 0006 | ICS USB アダプター HS |
| 0007 | シリアルUSBアダプター HS |
ファイルを解凍すると、ドライバファイルのあるフォルダとインストールマニュアルができます。インストールマニュアルを参考にしてドライバーのインストールを行ってください。
今回はボタンやトラックバーにイベントを追加して、ICSサーボモーター制御プログラムを完成します。イベントとは「ボタンをクリックすると~~になる」というプログラムを作るときの「クリックすると」の部分です。例えばボタンの場合ですと「Click」というイベントがすでに用意されていますので、そのイベントについてプログラムを書き込むだけです。 前回フォーム上にたくさんのコントロールを配置しましたが、ここでは必要なイベントをまとめておきます。
| コントロール名 | イベント名 | 内容 |
| Button1 | Click | クリックされたらCOMポートを接続する |
| ComboBox1 | DropDown | メニューが表示されたら接続可能なCOMポート名を表示する |
| TrackBar1 | ValueChanged | トラックバーの位置が変わったらサーボのポジションを移動する |
前回のプロジェクト(またはソリューションファイル)を読み込み、次の手順でイベントを追加します。フォームが表示されない場合は、ソリューションエクスプローラーウィンドウを開き、「Form1.vb」アイコンをダブルクリックしてください。
ComboBox1コントロールのプルダウンメニューを開いたら、現在PCで接続可能なCOMポート一覧を表示するイベントを作ってみます。 プルダウンメニューを開くイベントは「DropDown」イベントです。フォーム上のComboBox1コントロールをクリックして、プロパティウィンドウの「DropDown」イベント名の横にある空欄をダブルクリックするとプログラムウィンドウが表示され、DropDownイベントのひな形が表示されます。ひな形が表示されましたら、下のプログラムを入力してください。入力するのはComboBox1.Items.Clear()~の2行だけです。
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を使ってComboBox1コントロールで選択したCOMポートに、SerialPort1コントロールを接続してシリアル通信可能な状態にします。 フォーム上にあるButton1コントロールを選択し、プロパティウィンドウから「Click」イベント名を探します。見つかったら左の欄をダブルクリックして「Click」イベントのひな形をプログラムに追加します。追加できたら下のプログラムを入力してください。
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コントロールを選択し、プロパティウィンドウから「ValueChanged」イベントを追加してください。このイベントは、TrackBarコントロールをスライドさせたり直接値を代入した場合に発生します。 イベントのひな形が追加されたら、下のプログラムを入力してください。
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キーを押してプログラムを実行し、下記手順でモーターを動かしてみてください。
内容を非常に簡略化したので、ボタンを押したときにCOMポートが正しく接続されているか分かりにくいので、正しく接続したときにはにフォームのタイトルバーに「接続完了」と表示するように下記プログラムを追加してもいいでしょう。
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#でプログラムを作成しましたので、ダウンロードしてご利用ください。 <注意点>
Visual C# のソースコード
Visual C++ のソースコード
Visual Basic のソースコード
シリアルサーボ制御方法(4) PCから直接制御編(その1)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(2) ICS編
シリアルサーボ制御方法(1) 回路編
今回は弊社製シリアルサーボモーターをPCから直接制御する方法およびプログラムについて説明します。
PCからシリアルサーボモーターを制御するには、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」を起動してください。
クリックで拡大
クリックで拡大
Visual Basicは昔ながらのBasic言語ではありません。作成したプログラムを実行するには、ビルド作業が必要です。デバッグメニューの「デバッグ開始」か、F5キーを押してください。
画面上に何もないウィンドウが表示されたらここまでは成功です。終了するにはフォーム上の終了ボタン(×マーク)をクリックするか、デバッグメニューから「デバッグの停止」を選択してください。
よく使うウィンドウは、「ツールボックス」ウィンドウと、「ソリューションエクスプローラー」ウィンドウ、「プロパティ」ウィンドウです。これらは「表示」メニューの「その他のウィンドウ」から開いたり閉じたりすることができます。
ウィンドウは取り外し、ドッキングができます。各ウィンドウのタイトルバーにある押しピンアイコンをクリックすると、自動的にウィンドウが隠れるような設定も可能です。
まずは画面をデザインしてみましょう。今回は下の手順で動作する、サーボモーター制御プログラムを作成します。
下のスクリーンショットのように、ツールボックスから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関数を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
プログラムを簡単に説明すると、次のような手順となっています。
「For i As Integer = 0 To 5 Setp 1」はC言語で書き直せば「int i; for (i = 0; i <= 5; i++)」と言う意味です。
19~24行あたりのTry~Catch節は簡単に言えば「とりあえずTry節を実行してみて、何か問題があったら(例外を受け取ったら)Catch節へ処理を移す」というものです。C言語などで存在していた実行時エラーによるプログラムクラッシュを予防することができるようになっています。
シリアル通信では設定した受信タイムアウト時間を待っても受信できなかったときには、SerialPort.ReadByte関数は「TimeoutException」例外を発生し、Catch節へ処理が移ります。
今回はSerialPort1の受信タイムアウト時間を適当に100msにセットしておきましたので、100ms待ってもサーボモーターから返事がない場合は、Catch節へ移動します。Catch節では受信に失敗しましたよフラグ(Flag)をセットして、Forループを終了(Exit For)しています。
プログラムの入力が完了したら、再度ビルド作業を行います。スクリーンショットのように、フォームが表示されればここまでは成功です。ビルド時にエラーが出たらエラーの文字をダブルクリックすると、エラーが発生した行が表示されますので、間違いを直して再ビルドしてください。
次回は画面デザイン時に設計した動作をプログラムに追加して、プログラムの完成を目指します。
シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(2) ICS編
シリアルサーボ制御方法(1) 回路編
ソフト編では、ICSコマンドをマイコンからサーボモーターに送るためのC言語のプログラムについて説明します。 ここでは説明を簡単にするため、シリアル通信に関しては1バイトのデータを受信する関数(char getchar())と1バイトを送信する関数(void putchar ())ができあがっていることにします。この2つの関数を元にして、シリアルサーボモーターのコマンドの仕組みと通信プログラムの作り方について説明します。 またポジション設定コマンドだけ扱いますので、他のコマンドについてはこれを参考にして作成してみてください。 プログラムは弊社製マイコンボード、KCB-1に付属しているSDK準拠で作成します。KCB-1ではICSコマンドはほとんど関数化されていますので、簡単にシリアルサーボモーターの制御ができます。KCB-1の詳しい情報についてはこちらをご覧ください。
ここではポジション設定コマンドを実行する関数としてset_posというC言語関数を作ってみます。
まずICSの規格に沿って、ポジションコマンドを作成しましょう。ポジションコマンドの基本命令は次のようになっています。ポジションコマンドやその他のICSコマンドの詳細は前回の「シリアルサーボ制御方法(2) ICS編」で確認してください。
| CMD | POS_H | POS_L |
CMD=メインコマンド0b100XXXXXとID=0b000XXXXXを合わせたものです。この2つのデータを1バイトに合わせるには、論理和(C言語では「|」と書く)を使います。 POS_Hは3500~11500で指定できるポジションデータの上位7ビットで、POS_Lは下位7ビットデータです。
set_pos関数に必要なデータは、ID番号とポジションデータです。ID番号は0~31までなので、unsigned char型で指定します。ポジションデータ範囲は3500~11500ですので、int型で指定します。 また、ポジションコマンドを送ると、現在位置データが返ってきますので、この関数の返値は現在位置データとします。 関数の基本構造は次のようになります。ここから中身を記述していきます。
int set_pos (unsigned char id, int pos)
{
// これから関数の中身を記述
}
送信コマンドを作成するには3バイトのデータが必要です。バイトデータは0~255までのunsigned char型の3バイト配列「tx」として宣言します。送信するポジションデータの変数名(仮引数名)をposとします。
int set_pos (unsigned char id, int pos)
{
unsigned char tx[3];
tx[0] = 0x80 | id;
tx[1] = (unsigned char)(pos >> 7 & 0x7F);
tx[2] = (unsgined char)(pos & 0x7F);
}
CMDを作成するには、0×80=0b10000000でID番号idと論理和を取ることにより(この場合は単に足し合わせてかまいません)、CMD=0x100XXXXX(XはID番号)ができあがります。実際はid番号が0以上31以下であることを確認してからコマンドを作成した方がよいのですが、ここでは割愛しています。
6行のtx[1]はPOS_Hです。引数のposの下位7ビットを捨てるため、右向きに7ビットシフトしています。またデータを7ビットに限定するために、0x7F(0b01111111)で下位7ビットのみ論理積で取り出しています。 tx[2]はPOS_Lですので、下位7ビットのみ論理積で取り出しています。 変数posはint型変数なので、unsigned char tx[]に型変換(キャスト)してから代入しています。 これで送信コマンドは完成です。
上記でできたコマンドを3バイト繰り返して送信します。その後すぐにサーボモーターから返ってくる3バイトのデータを受け取ります。
int set_pos (unsigned char id, int pos)
{
unsigned char tx[3]; // 送信用のデータ
unsigned char rx[3]; // 受信用のデータ
int i; // 繰り返し処理のためにつかう変数
tx[0] = 0x80 | id;
tx[1] = (unsigned char)(pos >> 7 & 0x7F);
tx[2] = (unsgined char)(pos & 0x7F);
for (i = 0; i < 3; i++)
{
putchar (tx[i]); // コマンドを1バイトずつ送信する
}
for (i = 0; i < 3; i++)
{
rx[i] = getchar (); // モーターからの返値を受け取り、rxに代入する
}
}
マイコンのクロック数やサーボモーターの種類によっては、送信後にサーボモーターからデータが返ってくるまで少しタイミングをおいた方がよい場合がありますので注意してください。 この例ではマイコンとのデータ通信を想定していますので、受け取るデータは3バイトになりますが、PCで同じような関数を作成した場合は6バイト受け取るようにしてください(詳しくは次回)。
最後にサーボから受け取ったデータから現在位置に変換します。
int set_pos (unsigned char id, int pos)
{
unsigned char tx[3]; // 送信用のデータ
unsigned char rx[3]; // 受信用のデータ
int i; // 繰り返し処理のためにつかう変数
int dat; // 現在位置を計算するための変数
tx[0] = 0x80 | id;
tx[1] = (unsigned char)(pos >> 7 & 0x7F);
tx[2] = (unsgined char)(pos & 0x7F);
for (i = 0; i < 3; i++)
{
putchar (tx[i]); // コマンドを1バイトずつ送信する
}
for (i = 0; i < 3; i++)
{
rx[i] = getchar (); // モーターからの返値を受け取り、rxに代入する
}
dat = (int)(rx[1] & 0x7F);
dat = (dat << 7) + (int)rx[2];
return dat;
}
16ビットマイコンのCコンパイラでは計算時に32ビット拡張を行わないものがあります。そのような場合8ビットデータを7ビットシフトした時点で8ビット以上の桁は全て0となってしまいますので、上記プログラムのように2段階に分けて、いったんint型変数に代入してからシフト演算をした方がよいでしょう。 計算結果はreturn命令で呼び出し元へ返します。これで関数の完成です。
下のプログラムはID番号が0~8までのシリアルサーボモーターをデイジーチェーン接続して、5000と10000のポジションを10往復する例です。細かい説明はしませんが、参考にしてください。 set_pos関数を繰り返して使う場合は、繰り返し間隔を適当に空ける必要があります。
int main ()
{
int pos, r_pos; // セットするポジションデータと返ってきたポジションデータ
int i, id; // idには適当な数値を入れておくこと
for (i = 0; i < 10; i++) // 10回繰り返す
{
pos = (pos == 5000 ? 10000 : 5000); // ポジションデータを切り替える
for (id = 0; id <= 8; id++)
{
r_pos = set_pos (id, pos);
printf ("[%d] pos = %d\n", id, r_pos);
}
}
}
次回はいよいよPCからサーボモーターを動かすプログラムをつくります。PCからシリアルサーボモーターを動かすには、近藤科学社製ICS USBアダプターまたはICS USBアダプターHSが必要です。ぜひ準備してお待ちください。
ICS通信は半二重通信ですので、送信・受信のどちらかしか有効にならないようなプログラムを作成する必要があります。マイコンプログラミングでは、送信前に必ず受信禁止状態にしてください。送信後はすぐに受信可能状態に戻すようにしてください。 受信コマンド(getchar)では、仮に何らかのエラーでICSデバイスから返事が来なかったり、またはデータを受け取り損ねたりした場合の処理が必要となります。できれば受信時に適当なカウンター変数を用意して、ある程度カウントしてもデータが来なかった場合には受信エラー処理を行う用に作成すると、受信に失敗した時点でプログラム全体が停止してしまうのを防ぐことができます。
シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(4) PCから直接制御編(その1)
シリアルサーボ制御方法(2) ICS編
シリアルサーボ制御方法(1) 回路編
今回は弊社製シリアルサーボモーターを動かすためのICSコマンドについて説明します。
ICSとは「Interactive Communication System」の略で、近藤科学独自のデータ通信規格です。従来はPWM※でサーボモーターに角度の指令を送っていましたが、特性の変更や拡張などをより細かく制御するため、規格をシリアル通信に変更しました。
ICSバージョン2.0では主にサーボモーターの位置制御や特性の変更をするために使用されてきましたが、現在はその他のデバイスも接続できるように拡張されています。バージョン3.5ではサーボモーターのモーター温度などが読み込めるようになりました。
各種ICS規格については、詳細なリファレンスマニュアルが公開されています。下記リンクからお持ちのサーボモーターに該当するマニュアルをダウンロードいただき、今回の記事と併せてご利用ください。
ICSコマンドはICSデータ通信の規格に沿った命令のことを言います。通信規格など基本的な構造は次のようになります。
| 通信速度 | 115200bps、625000bps※、1250000bps※(※ICS3.0以降) |
| データ長 | 8ビット |
| ストップビット長 | 1ビット |
| パリティ | 偶数 |
| フロー制御 | なし |
| バイト数 | 1(CMD) | 2(SC) | 3~N-1(DATA) |
| 内容 |
コマンドヘッダ= メインコマンド+ID番号 |
サブコマンド | データ |
コマンドヘッダ(CMD)部分は、メインコマンド4種類(ポジション、読み出し、書き込み、ID設定)とサーボモーターにセットされたID番号を連結したものです。下記のメインコマンド一覧にある数値で、「0b」がついているものは2進数での表記となっています。またこれ以降「0x」とついているものは16進数表記です。
| ポジション(サーボモーターの回転角度を決める) | 0b100XXXXX |
| 読み出し(パラメーターを読み出す。種類はサブコマンドで決める) | 0b101XXXXX |
| 書き込み(パラメーターを書き込む。種類はサブコマンドで決める) | 0b110XXXXX |
| ID(ID番号の読み込み、または書き出しを行う) | 0b111XXXXX |
XXXXXには5ビットのID番号が入ります。例えばID=12(5ビットの2進数で01100)のサーボにポジションをセットする場合は、ICSコマンド第1バイト目(コマンドヘッダ、CMD)は「0b10001100」となります。
サブコマンド(SC)は、メインコマンドのオプション設定で、サーボモーターのスピード、ストレッチ、電流値などがあります。ポジションコマンドにはサブコマンドはありません。下記一覧の※マークはICS3.5以降のサブコマンドです。
| EEPROM |
0x00 |
サーボモーターのROMデータに直接アクセスする |
| STRC |
0x01 |
ストレッチデータを扱う |
| SPD |
0x02 |
スピードデータを扱う |
| CUR※ |
0x03 |
電離位置を読み出す、または電流制限値を書き込む |
| TMP※ |
0x04 |
サーボモーターの温度を読み出す、または温度制限値を書き込む |
データ(DATA)は読み出しの場合は指定しません。書き込みの場合にサーボモーターに書き込みたいデータを指定します。ポジションコマンドのデータ部分だけは特殊なデータ構造になります。下記データ構造を作る方法は「コマンド例」をご覧ください。
| POS_H | ポジションデータの上位7ビット |
| POS_L | ポジションデータの下位7ビット |
データ構造で特に注意するのは、第1バイト目以外は全てMSB(1バイトデータのもっとも上位にあるビットのこと、8ビット目のこと)を0にする必要があることです。ICS規格では、MSBが1のデータからコマンドヘッダとID番号を読み取ろうとしますので、サブコマンドやデータ部分のMSBが1の場合にはコマンドヘッダと間違えて誤動作する可能性があります。
簡単な例として、ID番号が10のサーボモーターのスピードを変更するICSコマンドを作成してみます。リファレンスマニュアルから、設定できるスピード値は0~127(数値が小さいほど速度が下がる)であるので、ここでは100と設定します。
メインコマンドが「0b110XXXXX」で、ID番号は「0b00001010」ですので、CMDは11001010=202(0xCA)となります。
| CMD | SC | DATA(SPD) |
202(0xCA) |
2(0x02) |
100(0x64) |
スピード変更などの書き込みコマンド実行時には、サーボモーターから次のような返事が来ます。
| 1 | 2 | 3 | 4 | 5 | 6 |
| 送信コマンドのループバック | R_CMD | SC | DATA(SPD) | ||
ここで「送信コマンドのループバック」とは、送った3バイトのデータがそのまま返ってくることを示しています。ICS規格では送信線と受信線が同じ(詳細は「シリアルサーボ制御方法(1) 回路編」を参照してください)であるため、データを送ると同時に受信してしまうからです。
普通のマイコンでは送信時に受信はできません(フロー制御がないとき)ので、ループバックは無視して3バイトのみの受信でかまわないのですが、パソコンなどのOSが搭載されているものでは、ループバックはバッファに自動的に保存されますので、サーボモーターから来た返事は6バイト受け取るようにしてください。
なお4バイト目のサーボモーターから返ってきたCMDはMSBが0となっていますので、この例では送信CMD=202(0xCA)に対して、R_CMD=74(0x4A)が返ります。
ID番号を読み込むコマンドは他のコマンドと構造が違います。サーボからIDを読み取る時には、CMD=0xFFとしてください(※IDが分からないサーボモーターからも読み込むため)。SCは0固定で、3回繰り返します。
| CMD | SC | SC | SC |
255(0xFF) |
0(0x00) |
0(0x00) |
0(0x00) |
サーボモーターからは下のようなデータが返ってきます(PCで受信した場合のみ5バイト、そうでないなら1バイトのみ返る)。
| 1 | 2 | 3 | 4 | 5 |
| 送信コマンドのループバック | R_CMD | |||
R_CMDには、ID読み込みコマンド0b111XXXXXとサーボモーターのID番号0b000XXXXXが合わさった1バイトのデータで、MSBが0になったものが返ります。例えば読み出したサーボモーターのID番号が25(0b000110011)だった場合は、R_CMD=0b011110011(243=0xF3)が返ってきます。
サーボモーターのポジションデータに指定できる値は3500~11500となります。ポジションデータに0を入れたときだけ特殊操作となり、サーボモーターが脱力します。7500がいわゆるニュートラル位置です。
| CMD | POS_H | POS_L |
| 0b100XXXXX+ID | 16ビットデータの下位14ビットを7ビットずつ分解して、上位をPOS_H、下位をPOS_Lとする | |
ポジションの設定はすこし難しくなっています。コマンドヘッダ以外はMSBを0にしなければならない約束がありますので、2バイト(16ビット)データのうち、下位14ビットのみを使用します。取り出した14ビットを2分割して、上位をPOS_H、下位をPOS_Lとします。例えばニュートラル位置7500の場合は、7500=0b00011101_01001100(0b[00][011101_0][1001100])となりますので、POS_H=0b000111010=0x3A、POS_L=0b01001100=0x4Cとなります。
返値は現在位置データが送信コマンドと同じように、7ビットずつに分解されて返ってきますので、プログラムでデータを戻すには7ビットずつ取り出してつなぎ合わせる必要があります。
次回はICSコマンドをC言語で作ってみます。自作マイコンをターゲットにしていますので、プログラムできるマイコン(KCB-1でもかまいません)をお持ちの方はシリアル通信用端子から1バイト送信できる関数と、1バイト受信できる関数をあらかじめ用意してください。
シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(4) PCから直接制御編(その1)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(1) 回路編
近藤科学社製のロボット用サーボモーターは、ロボットコントローラーやPCから簡単に操作できるようなシステムになっています。今回より5回にわたって、近藤科学社製シリアルサーボモーターを制御する方法を紹介します。
今回の「回路編」では弊社製サーボモーターを動かすための電気回路について説明します。
下記回路図は近藤科学社製KCB-1マイコンボードのシリアルサーボモーターを駆動する部分のみを書き出したものです。回路図のSIOコネクタの番号は、1番が信号線、2番が電源線、3番がグランド線となっています。弊社製ロボット用シリアルサーボモーターは、電源電圧は10.8Vで、半二重シリアル通信により動作します。シリアル通信(信号)線はCMOSレベル(約3.3V以上でHIGHと認識される)の負論理となっています。
半二重通信を実現するために、マイコン側はシリアル通信用端子TXD(送信用端子)、RXD(受信用端子)を1本にまとめてSIOコネクタの信号線(1番)につないでいます。負論理回路にするため、信号線の信号電圧が5Vになるように、2.2kΩでプルアップ(R1)しています。RXDは入力用の端子ですので、ノイズや静電気が入るとCPUが壊れてしまう可能性があるため、直列に抵抗(R2)が入っています。
またKCB-1では降伏電圧5.6Vのツェナーダイオードがつながっています。回路図のようにダイオードの向きは信号線側にありますので、通常は信号線からグランド側に電気は流れませんが、5.6V以上の電圧がきたらグランド側へ流して、CPUに高い電圧がかからないようになっています。
2番端子には電源電圧(10.8V)、3番端子にはグランドをつなぎます。これで弊社製サーボモーターを動かす電気回路の準備は完了です。
シリアルサーボ制御方法(5) PCから直接制御編(その2)
シリアルサーボ制御方法(4) PCから直接制御編(その1)
シリアルサーボ制御方法(3) ソフト編
シリアルサーボ制御方法(2) ICS編