サポート » テクニカルガイド »


■KBT-1を使ってロボットと無線通信をする(2)

関連カテゴリー:KHR-3HV, サポート, テクニカルガイド, 多脚ロボット, 無線機器

「KBT-1を使ってロボットと無線通信をする」の第2回です。今回から本格的に6足歩行ロボットKMR-M6を動かします。

まずは、KBT-1を用いて「HeartToHeart4KMR-M6間通信を無線化する」方法を紹介します。


 

前記事

KBT-1を使ってロボットと無線通信をする(1)

 

準備するもの

<ハードウェア>

  • ロボット:KMR-M6(RCB-4HV)
  • 無線モジュール:KBT-1
  • Bluetooth内蔵のPC、または市販のUSB Bluetooth アダプター(KBT-1はclass2ですので通信距離は10mとなっています)

 ※ドライバは市販モジュール付属の説明書に従いインストールしてください

<ソフトウェア>

  • HeartToHeart4 ver2.0 (あらかじめインストールを行い作業を始めてください)

 

KBT-1を用いてHTH4とKMR-M6間通信を無線化する

①KBT-1とRCB4-HVの配線をします

コネクタには向きがあります。黒いラインがケーブルの外側に来るように接続してください。

また、RCB-4HVの電源を切ってからケーブルを接続してください。

 

 

 

COM端子同士の接続

基板の内側に。。。RCB-4HVのCOM端子に接続されている延長ケーブルのコネクタを抜き、KBT-1に付属している赤いコネクタのZH クロスケーブルBに変更します。赤いコネクタ側をCOM端子に接続してください。ZHクロスケーブルのZHコネクタ側をKBT-1のCOMに接続します。

 

電源端子の接続

KBT-1の電源はRCB-4HVのSIOポートから出力される電源を用います。RCB-4HVのSIOポートとKBT-1のPWRをZH 接続ケーブルBを用いて接続します。

 

KBT-1のディップスイッチを「スレーブRCB-4モード」に設定します

HTH4を用いて、KBT-1経由でRCB4を動かすためには、KBT-1を「スレーブRCB-4モード」に設定します。

スイッチ SW1 SW2
スイッチ番号 1 2 1 2
状態 ON OFF OFF
ON

 

 

③ペアリングをします(初回時のみ)

ペアリングとは、KBT-1と接続するBluetoothデバイス同士のお互いのID番号を認識させることです。初めてBluetoothデバイスと接続するとき必ず1回はペアリングを行う必要があります。

ペアリングをする時、KBT-1側はPC側から見つけられるように設定する必要があります。

まず、KMR-M6の電源を入れます。電源を入れた後にKBT-1のRENEWボタンを押すと、KBT-1の赤いステータスLEDが早い点滅になり、他のUSB Bluetoothアダプタ(PCやBluetooth搭載端末)から見つけられるようになります。

ペアリングが完了すると、COMポート番号が割り当てられますので覚えておきます。

詳細なペアリング方法は、KBT-1の説明書3ページをご覧下さい。

④HTH4を起動します。

パソコンにインストールされているHTH4を起動してください。必ずVer.2.0以降を使用してください。

 

⑤COMポートを選択します。

HTH4のメインウィンドウにあるCOMツールバーでペアリング時に割り当てられたCOM番号を選択してください。

COM番号がわからなくなってしまった方は下記の手順で確認してください。「Bluetooth Stack for Windows by Toshiba ソフトウェア」を例にご紹介します。

  1. Bluetooth Stack for Windows by Toshiba ソフトウェアのBluetoothの設定を開きます。
  2. KBT-1のアイコンがありますので、右クリックをして詳細を選択します。KBT Managerを利用して名前を変更した場合は、その名前が表示されます。出荷時の名称は「KBT-1」です。名前がない場合はペアリングできていません。再度ペアリングを試みてください。

  3. 右図のような詳細画面がでます。設定情報の中にCOMポート名がありますので、こちらの番号を控えてください。


 

以上で設定は終わりです。通信が確立出来ている場合は緑の送受信LEDが点灯します。

これによりモーションの書き込みや再生等のコマンドを無線化することができました。

HTH4は普段のようにご使用下さい。また、HTH3でも同じように使用することができます。詳細は、KBT-1の取扱説明書をご参照下さい。

 

【注意事項】

※「COM通信速度」は115200bpsのみ設定可能です。1.25Mbpsでは速度が違い通信ができませんので必ずプロジェクト設定ウィンドウでCOM通信速度を115200bpsに設定してください

COM速度設定

 

※ROMやRAMに保存されているモーションは再生できますが、こちらからデータを送り続けるオンライン再生は対応しておりません。

 


 

次回は

次回は、PCからロボットのモーションを再生する方法をご紹介します。

■この記事へのリンクはこちらです。

■KBT-1を使ってロボットと無線通信をする(1)

関連カテゴリー:KHR-3HV, サポート, テクニカルガイド, 多脚ロボット, 無線機器

これから3回にわたり、ロボット用bluetoothモジュールKBT-1を用いて6足歩行ロボットKMR-M6をPCから無線で動かす方法について紹介していきます。

 

目次

  • 第1回:KBT-1の紹介(この記事)

  • 第2回:HeartToHeart4とKMR-M6間の通信を無線化する

弊社モーション作成ソフトウェアHeartToHeart4(以降HTH4)と6足歩行ロボットKMR-M6をKBT-1を用いて無線化する方法を紹介します。

  • 第3回:KMR-M6に登録したモーションを再生する

HTH4で作成したモーションを様々な方法で無線コントロールする方法を紹介します。

(続きを読む…)

■この記事へのリンクはこちらです。

■KBT-1 ロボットの連続動作がうまく再生されなかったら

関連カテゴリー:KHR-3HV, サポート, テクニカルガイド, 多脚ロボット

BluetoothモジュールKBT-1で無線操縦しているときに、ボタン分岐を使った連続歩行など連続動作がうまく再生されない場合は、次の内容をご確認下さい。

 

【KBT-1とKRI-3は一緒に使えません】

KRI-3とは、KHR-3HVやKMR-M6などに搭載されているコントロールボードRCB-4HVと、受信機KRR-1をつなぐ中継基板です。このKRI-3は、送信機KRC-2ADなどでロボットを無線操縦するときにロボット側に搭載します。

KBT-1を使用するとPCやAndroid携帯から無線操縦することができますが、KRI-3がロボットに接続されていると連続動作がうまく再生されません。原因は、送信機から受信機へ信号がない場合にKRI-3は常にニュートラルの信号をコントロールボードへ送っているためです。

例えば、PCやAndroid携帯からBluetoothでロボットに連続歩行の命令を送ったときに、KBT-1からは「歩行しなさい」との命令を受けますが、KRI-3からは「信号はありません(ニュートラル状態)」との命令を受けます。そのため、歩行モーション内のボタン分岐でニュートラル信号を受け取ってしまい、ロボットは「1歩だけ歩いて止まる」動作を繰り返すことになります。

 

KBT-1を搭載するときは、必ずKRI-3を外してから使用するように注意してください。

■この記事へのリンクはこちらです。

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

関連カテゴリー:ICS・サーボモータ, サポート, テクニカルガイド

はじめに

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

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

 

イベントの追加

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

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

ComboBox1でCOMポート選択

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で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を左右にスライドさせたら、その位置に合わせてサーボモーターを動かすプログラムを作成します。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キーを押してプログラムを実行し、下記手順でモーターを動かしてみてください。

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

その他追加事項

内容を非常に簡略化したので、ボタンを押したときに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#でプログラムを作成しましたので、ダウンロードしてご利用ください。 <注意点>

  • 下の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# のソースコード  Visual C++ のソースコード  Visual Basic のソースコード 

 

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

■この記事へのリンクはこちらです。

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

関連カテゴリー:ICS・サーボモータ, サポート, テクニカルガイド

はじめに

今回は弊社製シリアルサーボモーターを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」を起動してください。

  1. ファイルメニューから「新しいプロジェクト(P)」を選択します。
  2. 表示された「新しいプロジェクト」ダイアログから、「Windowsフォームアプリケーション」を選択します。
    また、下にある「名前(N)」欄にプロジェクトの名前を入力します。ここでは「IcsSetPosition」と言う名前を付けますが、好きな名前で結構です。名前を入力したらOKボタンを押します。
    クリックで拡大

  3. 下記のような起動画面が表示されます(ツールボックスウィンドウはタブをクリックすると開きます)。
    クリックで拡大

 

ビルド

Visual Basicは昔ながらのBasic言語ではありません。作成したプログラムを実行するには、ビルド作業が必要です。デバッグメニューの「デバッグ開始」か、F5キーを押してください。

画面上に何もないウィンドウが表示されたらここまでは成功です。終了するにはフォーム上の終了ボタン(×マーク)をクリックするか、デバッグメニューから「デバッグの停止」を選択してください。

Visual Studioの簡単な説明

よく使うウィンドウは、「ツールボックス」ウィンドウと、「ソリューションエクスプローラー」ウィンドウ、「プロパティ」ウィンドウです。これらは「表示」メニューの「その他のウィンドウ」から開いたり閉じたりすることができます。

ウィンドウは取り外し、ドッキングができます。各ウィンドウのタイトルバーにある押しピンアイコンをクリックすると、自動的にウィンドウが隠れるような設定も可能です。

ツールボックス
ボタンなどの部品(コントロールと言います)がリスト表示されています。コントロールをクリックして選択してから、画面上のフォームをクリックすると、選んだコントロールが張り付きます。
ソリューションエクスプローラー
プロジェクトのファイル構成などを表示します。ツリー表示でファイル名を変更することもできます。
プロパティ
フォーム上でクリックしたコントロールのプロパティを表示します。プロパティでは文字の色や大きさを変えたりすることができます。また、プロパティウィンドウのツールバーにある「イベント」ボタン(稲妻マーク)を押すことで、選択したコントロールのイベントを設定できるようになります。

画面をデザインする

まずは画面をデザインしてみましょう。今回は下の手順で動作する、サーボモーター制御プログラムを作成します。

  1. ComboBoxコントロール(入力も可能なプルダウン式メニュー)でシリアルポートを選択する。
  2. 接続ボタンでCOMポート(ICS USBアダプター)と接続する。
  3. ID番号をセットする。
  4. スライドバーを動かすとその通りにサーボモーターが動作する。
  5. 数値を直接代入することもできる。

下のスクリーンショットのように、ツールボックスから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

プログラムの簡単説明

プログラムを簡単に説明すると、次のような手順となっています。

  1. C言語でのプログラムのように必要な変数を「Dim Tx(3), Rx(6) As Byte」などと準備してから、Txにはポジションコマンドをセットします。
  2. SerialPort1.Write (Tx, 0, 3)」で、Tx変数にセットしたコマンドを3バイト分だけSerialPort1から書き込みます。
  3. ICS規格では、PCから送信した場合は送信多命令と同じものが返ってきますので、受け取りは6バイトになります。これを「For」の繰り返しで1バイトずつ受け取っています。
  4. データ受け取りに失敗した場合はSetPos = -1としています。Visual Basicでは関数の名前に値を代入すると返値となります(C言語ではreturnに相当)。
  5. データ受け取りに成功した場合は、受け取ったデータをポジションデータに戻して、値を返して関数を終了しています。

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) 回路編
 

 

 

■この記事へのリンクはこちらです。

■シリアルサーボ制御方法(3) ソフト編

関連カテゴリー:ICS・サーボモータ, テクニカルガイド

はじめに

ソフト編では、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命令で呼び出し元へ返します。これで関数の完成です。

set_pos関数を使うときには

下のプログラムは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からシリアルサーボモーターを動かすには、近藤科学社製Dual USBアダプターHS、ICS USBアダプターまたはICS USBアダプターHSが必要です。ぜひ準備してお待ちください。

注意

ICS通信は半二重通信ですので、送信・受信のどちらかしか有効にならないようなプログラムを作成する必要があります。マイコンプログラミングでは、送信前に必ず受信禁止状態にしてください。送信後はすぐに受信可能状態に戻すようにしてください。 受信コマンド(getchar)では、仮に何らかのエラーでICSデバイスから返事が来なかったり、またはデータを受け取り損ねたりした場合の処理が必要となります。できれば受信時に適当なカウンター変数を用意して、ある程度カウントしてもデータが来なかった場合には受信エラー処理を行う用に作成すると、受信に失敗した時点でプログラム全体が停止してしまうのを防ぐことができます。

 

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

■この記事へのリンクはこちらです。

■シリアルサーボ制御方法(2) ICS編

関連カテゴリー:ICS・サーボモータ, サポート, テクニカルガイド

ICSコマンドについて

今回は弊社製シリアルサーボモーターを動かすための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番号は10(2進数で0b00001010)です。
  • スピード設定サブコマンドは2です。

メインコマンドが「0b110XXXXX」で、ID番号は「0b00001010」ですので、CMDは11001010=202(0xCA)となります。

CMD SC DATA(SPD)
202(0xCA)
2(0x02)
100(0x64)

スピード変更などの書き込みコマンド実行時には、サーボモーターから次のような返事が来ます。

送信コマンドのループバック R_CMD SC DATA(SPD)

ここで「送信コマンドのループバック」とは、送った3バイトのデータがそのまま返ってくることを示しています。ICS規格では送信線と受信線が同じ(詳細は「シリアルサーボ制御方法(1) 回路編」を参照してください)であるため、データを送ると同時に受信してしまうからです。

普通のマイコンでは送信時に受信はできません(フロー制御がないとき)ので、ループバックは無視して3バイトのみの受信でかまわないのですが、パソコンなどのOSが搭載されているものでは、ループバックはバッファに自動的に保存されますので、サーボモーターから来た返事は6バイト受け取るようにしてください。

なお4バイト目のサーボモーターから返ってきたCMDはMSBが0となっていますので、この例では送信CMD=202(0xCA)に対して、R_CMD=74(0x4A)が返ります。

ID番号を読み出す

ID番号を読み込むコマンドは他のコマンドと構造が違います。サーボからIDを読み取る時には、CMD=0xFFとしてください(※IDが分からないサーボモーターからも読み込むため)。SCは0固定で、3回繰り返します。

CMD SC SC SC
255(0xFF)
0(0x00)
0(0x00)
0(0x00)

サーボモーターからは下のようなデータが返ってきます(PCで受信した場合のみ5バイト、そうでないなら1バイトのみ返る)。

送信コマンドのループバック 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バイト受信できる関数をあらかじめ用意してください。

用語説明

PWM
Pulse Width Modulationの略で、信号線をHIGHにする時間を調整することによりモーターの回転を制御する方法のこと。DC(直流電圧)モーターでは入力電圧を変えると回転速度も変わりますが、マイコンで計算した値をアナログ電圧に変換(DA変換)する必要があるため、様々なコストがかかります。そこで信号のONとOFFを細かく切り替えて見かけ上電圧を変える方式になりました。
ラジコンサーボではPWMで直接モーターを制御しているわけではなく、パルスの幅にモーターの位置情報という意味を持たせています。パルスを受け取ったモーターはその幅を位置情報に変換し、改めて内部でモーターの位置制御を行っています。
MSB
Most Significant Bitの略で、ビット列の中で位(くらい)が一番大きなビットのこと。1バイトデータの場合は8ビット目がMSBとなります。最も小さい位は LSB(Least Significant Bit)といいます。
2進数、16進数
一般に使われている数値は10進数と言います。9に1を足すと桁が上がり、「10」という書き方をします。使える数値は0~9までです。2進数では1に1を足すと桁上がりして「10」と書きます。使える数値は0と1だけです。16進数では0~9とA、B、C、D、E、Fを使います。A が10進数の10にあたり、Fは15です。Fに1を足すと桁上がりして、同じように「10」となります。
10進数では10を掛けたり割ったりすると桁が上下しますが、2進数では2を掛けると桁上がりして、2で割ると桁が下がります。同じように16進数では16を掛けたり割ったりすると桁が上下します。2進数と16進数は単にコンピューター上で数値をビット列とした扱うときに分かりやすいという理由で使われています。また、16進数は大きな数値も少ない桁数で扱えるので、コンピューターでは重宝します。

 

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

 

■この記事へのリンクはこちらです。

■シリアルサーボ制御方法(1) 回路編

関連カテゴリー:ICS・サーボモータ, サポート, テクニカルガイド

はじめに

近藤科学社製のロボット用サーボモーターは、ロボットコントローラーやPCから簡単に操作できるようなシステムになっています。今回より5回にわたって、近藤科学社製シリアルサーボモーターを制御する方法を紹介します。

回路編
自作マイコンでサーボモーターを制御するために必要な電気回路について説明します。
ICS編
ロボット用シリアルサーボモーターのICSコマンドについて詳しく説明します。
ソフト編
ICSコマンドを自作マイコンで使うためのテクニックについて説明します。
PCから直接制御編(その1)
Microsoft Visual Basicを使って、PCからICSコマンドを送信するための準備をします。
PCから直接制御編(その2)
Microsoft Visual Basicでスライドバーでシリアルサーボモーターを動かすプログラムを行います。

今回の「回路編」では弊社製サーボモーターを動かすための電気回路について説明します。

 

回路説明

下記回路図は近藤科学社製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番端子にはグランドをつなぎます。これで弊社製サーボモーターを動かす電気回路の準備は完了です。

 

用語説明

半二重通信
半二重とはデータを送る線と受け取る線が1本にまとまめて、送信または受信を交互に行う通信方式です。トランシーバーやタクシー無線などがこれにあたります。電話などのように送信と受信を同時に行うことができる方式を全二重通信といいます。 半二重通信は全二重通信に対して送信線、受信線が1本ですむこと、サーボモーターに固有のIDを付けておくと、信号線を共用できるメリットがあります。
負論理
信号がHIGHになると「1」と認識するのが正論理回路です。逆が負論理回路となります。近藤科学のシリアルサーボモーターと通信する場合は負論理回路を作ります。
プルアップ・プルダウン
マイコンの端子は何も設定していないと電圧は不定(浮いているという)となります。一般的にマイコンの端子はインピーダンスが高いため、微弱な電流でも高い電圧となることがあります(V=IR)。そこで電源線に抵抗を介して接続することで、マイコンの端子電圧を信号電圧(通常5V)に合わせることをプルアップ(電圧を引っ張り上げるという意味)といいます。逆に0Vにするためには抵抗を介してグランドと接続します。これをプルダウンといいます。

 

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

 

■この記事へのリンクはこちらです。

■KCB-1 アップデーター Ver.1.3.0 Rev.20100807

関連カテゴリー:KCB-1, KCBサポート, アップデート, サポート, ソフトウエア, テクニカルガイド

KCB-1 SDKのアップデーター Ver.1.3.0 Rev.20100807をリリースします。今回のアップデートではICS3.5への対応、RCB-3/4に接続されたセンサーの読み取りや、RCB-3のCOMポートからKRCのボタンデータ(コントロール入力値)を書き換える関数、RCB-4に接続されているサーボモーターを一斉に動かす関数などが追加されています。詳しい内容は下記のようになっています。

 

<アップデート内容>

  • uart.h  UART1(COM)にタイムアウトを付けられるようにした
  • rcb3.h  RCB-3のADポート読み込み、exput関数の追加
  • rcb4.h  RCB-4のAD/PIOなどの設定など
  • ics.h   ICS3.5に対応

 

<追加サンプルプログラム>

  • ICS35_GetData:  ICS3.5対応のサーボモーターからデータを取り込む
  • RCB3_Exput: rcb3_exput_7Bcode関数のサンプルプログラム
  • RCB4_AD_READ: RCB-4のADポートからのデータ読み込み
  • RCB4_PIO: RCB-4のPIOポートからのデータ読み込み・書き出し
  • RCB4_Servos: RCB-4に接続されたサーボモーターを複数同時駆動する
  • RCB4_SingleServo: RCB-4でサーボモーターを単独で駆動する

 

<インストール前にご確認ください>

  • 圧縮ファイルを解凍するとEXEファイルがありますので、ダブルクリックしてインストールしてください。
  • インストールにはCD-ROMジャケットに記載されているシリアル番号が必要です。
  • インストールにはKCB-1 SDK Ver.1.2.0までがすでにコンピューターへインストール済みであることが必要です。

 

ダウンロードはこちらから KCB1SDK_V13020100807.zip ZIP File

■この記事へのリンクはこちらです。

■シリアルUSBアダプターをLinuxで使うには

関連カテゴリー:サポート, シリアル通信, テクニカルガイド

準備

弊社製シリアルUSBアダプターシリーズはWindows OS以外での動作保証をしておりませんが、適切なドライバーを使うことで、Linuxでも使用できます。 Linuxで使用するときはusbserial.ko、ftdi_sio.koという2つのドライバー(正式にはカーネルモジュールと言います)が必要となります。このドライバーはUbuntu Linuxなどでは標準でインストールされています。例えばUbuntu Linux 10.04では「/lib/modules/2.6.32-21-generic/kernel/drivers/usb/serial」にインストールされています。

次にシリアルUSBアダプターHSを取り付け、下記コマンドでドライバーをセットしてください。modprobeコマンドでftdi_sioドライバーを取り付けると、自動的にusbserial.koドライバーも取り付けられます。

<rootユーザーの場合>

# modprobe ftdi_sio vendor=0x165C product=0007

<Ubuntu Linuxなど、sudoコマンドが必要な場合>

$ sudo modprobe ftdi_sio vendor=0x165C product=0007

 

テスト

上記コマンドを実行後、dmesgコマンドで確認をします。

-----
$ dmesg

...
[18188.873370] USB Serial support registered for FTDI USB Serial Device
[18188.874223] ftdi_sio 2-1:1.0: FTDI USB Serial Device converter
detected
[18188.875151] usb 2-1: Detected FT232RL
[18188.875154] usb 2-1: Number of endpoints 2
[18188.875156] usb 2-1: Endpoint 1 MaxPacketSize 64
[18188.875159] usb 2-1: Endpoint 2 MaxPacketSize 64
[18188.875161] usb 2-1: Setting MaxPacketSize 64
[18188.892767] usb 2-1: FTDI USB Serial Device converter now attached to ttyUSB0
[18188.892794] usbcore: registered new interface driver ftdi_sio
[18188.892796] ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
-----

上記出力例のように「FTDI USB Serial Device converter now attached to ttyUSB0」というような表示が出ましたら、シリアルUSBアダプターHSはデバイス「/dev/ttyUSB0」として使用することが可能です。最近のLinuxではデバイスファイルは自動的に作成されますが、自動作成されなかった場合は次のようにデバイスファイルを作成する必要があります。 # mknod /dev/ttyUSB0 c 188 0 デバイスファイルに対してechoコマンドを使って適当な文字列を出力すると、シリアルUSBアダプターHSから文字列が出力されます。

$ echo "Hello World!" > /dev/ttyUSB0

標準状態でのパリティやボーレートの変更はsttyコマンドなどを使用してください。なおC言語でのプログラムではプログラム内でボーレートなどを設定してください。

 

その他

その他のドライバーを使用する場合

システムにドライバーがない場合やチップメーカーのFTDI社純正ドライバーを使用する場合は、FTDI社からドライバーをダウンロードしてインストールするか、カーネルをアップデートする必要があります。ドライバーは下記URLよりダウンロードしてください。FTDI社のドライバーにつきましては上記ドライバーと使い方が違います。また弊社では未検証ですので注意してご利用ください。

http://www.ftdichip.com/Drivers/D2XX.htm

その他のドライバーにつきましては、下記のようなものがあります。こちらも弊社では未検証です。

FTDI Linux USB full speed char driver http://sourceforge.jp/projects/sfnet_ftdifullspddrv/

FTDI USB Serial Converter Driver http://sourceforge.jp/projects/sfnet_ftdi-usb-sio/

その他のシリアルUSB変換器を使う場合

近藤科学株式会社のシリアル変換アダプターを使うには、生産者ID(VID)と製品ID(PID)番号が必要です。modporobeコマンドのオプションを下記リストを参考にして、適宜入れ替えて使用してください。

VID:165C (近藤科学USB製品共通)
-------------------------------------------------------------
PID  = デバイス名           (日本語でのデバイス名)
-------------------------------------------------------------
0001 = ICS USB ADAPTER     (ICS USB アダプター)
0002 = SERIAL USB ADAPTER  (シリアルUSBアダプター)
0006 = ICS USB ADAPTER HS  (ICS USB アダプター High Speed)
0007 = SERIAL USB ADAPTER HS(シリアルUSBアダプター High Speed)

 

その他の情報

KCB-3WLに付属のSDKにはシリアル通信でRCB-4やRCB-3を動かすライブラリとサンプルプログラムがあります。LinuxでRCB-4などを動かすシリアル通信プログラムをやってみたい人は、参考にしてみてはいかがでしょうか。

■この記事へのリンクはこちらです。