サポート »


■KCB-3WLを使った音声データ通信

関連カテゴリー:KCB-3WL, KCBサポート, サポート

はじめに

KCB-3WLにIPフォンの機能を持たせると、ネットワーク経由で音声データ通信ができます。多くのWEBカメラにはマイク機能がついていますので、今回は普段使っているWEBカメラのマイクで拾った音をKCB-3WLを通じて、PCやAndroid携帯で聞くことにチャレンジします。

KCB-3WLには音声デバイスドライバーや、音声通信ソフトウェアなどの準備が必要となりますが、準備する手順が難しいため、弊社で用意したデバイスドライバーやソフトウェアをKCB-3WLにインストールしてデータ通信を行います。

クライアント側(PCなど)ではマイクとスピーカー、そしてWindows、MacintoshまたはAndroid用のlinphoneソフトウェア(IPフォンソフトウェア)が必要です。クライアント側で音を聞くだけならPC内蔵のスピーカーが使えます。

今回はKCB-3WLのシステムを修正し、普段ハードディスクのように使っているエリアをメモリーとして使用し、RAMを増やす作業も行います。

なお今回の記事内容につきましては、全てのデバイスにおいて動作保証をするものではありません。また各デバイスについての質問にはお答えいたしかねます。あらかじめご理解の上でご使用なさいますようお願いいたします。

 

準備

  • KCB-3WL
  • PCにスピーカー、あるいはSkypeなどのIPフォンなどの音声出力装置
  • linephoneソフトウェア(ダウンロードして、あらかじめインストールしてください http://www.linphone.org/eng/download/packages/linphone.html
  • KCB-3WL側ではWEBカメラのマイクを利用します(その他使用できるサウンドデバイスについては後述)

 

ソフトウェアのインストール

1.ドライバーの準備と送信

下のリンクより、「kcb3wl_sound_modules.zip」ファイルをダウンロードしてあらかじめPCで解凍してください。解凍すると、「audio_driver.tar.gz」、「linphone_bin.tar.gz」、「readline.tar.gz」の3つのファイルができあがります。これらをKCB-3WLに下記手順で送信します。

>> kcb3wl_sound_modules.zipをダウンロード 

TeraTermからシリアルケーブル経由で送る

  1. TeraTermとKCB-3WLをシリアルUSBアダプターで接続し、KCB-3WLを起動します。
  2. KCB-3WLにrootユーザーでログインし、/tmp/ディレクトリへ移動し、rzと入力します。KCB-3WLはファイルの受信状態になります。
    # cd /tmp
    # rz
  3. TeraTermのファイルメニューから転送>ZMODEM>送信を選ぶと、送信ファイルを選択するダイアログが表示されます。
  4. ファイルを選択してOKボタンを押すとファイルが送信されます。

注意:シリアルケーブルでデータを送るので、送信中はケーブルを触ったりしてノイズが入らないようにして下さい。

FTPで送る

FTPでファイルを送る場合は、WindowsまたはMacintoshのFTPクライアントソフトウェアを使って、ファイルをKCB-3WLに送信してください。あるいはKCB-3WL付属のUbuntu Linuxへ書き込んでから、FTPでデータを送ることも出来ます。

2.ライブラリのインストール

ファイルのインストールや設定は、必ずrootユーザーにて行ってください。ファイルをtarコマンドで解凍する前に、かならず「/」ディレクトリへ移動してください。解凍する場所を間違えると動作しません。また、コマンドの先頭の「#」はプロンプトです。入力する必要はありません。

オーディオドライバーのインストール

  1. audio_driver.tar.gzファイルをKCB-3WLの/tmpディレクトリへ送ります。
  2. いったんルートディレクトリへ移動してからファイルを解凍します。次のコマンドを実行してください。圧縮されたデバイスドライバーファイルが/lib/modules/ディレクトリへ展開されます。
    # cd /
    # tar zxvf /tmp/audio_driver.tar.gz
  3. audio_driver.tar.gzは不要なので削除します(ディスク領域を圧迫するため必ず削除してください)。
    # rm /tmp/audio_driver.tar.gz

readlineライブラリのインストール

readlineライブラリは後述のlinphoneソフトウェアで使用します。

  1. readline.tar.gzファイルをKCB-3WLの/tmpディレクトリに送ります。
  2. 次のコマンドでファイルを解凍します。解凍すると/usr/libディレクトリにreadlineライブラリが展開されます。
    # cd /
    # tar zxvf /tmp/readline.tar.gz
  3. readline.tar.gzは不要なので削除します(ディスク領域を圧迫するため必ず削除してください)。
    # rm /tmp/readline.tar.gz

linphoneサーバーソフトウェアのインストール

  1. linphone_bin.tar.gzファイルをKCB-3WLへ送ります。
  2. 次のコマンドでファイルを解凍します。解凍するとlinphoneソフトウェアその他のファイルが展開されます。
    # cd /
    # tar zxvf /tmp/linphone_bin.tar.gz
  3. linphone_bin.tar.gzは不要なので削除します(ディスク領域を圧迫するため必ず削除してください)。
    # rm /tmp/linphone_bin.tar.gz

ライブラリの設定

ライブラリはコピーしただけでは使えないので、シンボリックリンクを作成します。シンボリックリンクとはWindowsではショートカット、Macintoshではエイリアスのようなものです。

  1. /libディレクトリへ移動します。
    # cd /lib
  2. シンボリックリンクを作成します。
    # ln -s libreadline.so.5.2 libreadline.so.5
    # ln -s libncurses.so.5.6 libncurses.so.5

設定ファイルを修正

linphone_bin.tar.gzを解凍すると、/rootディレクトリに「linphonerc」というlinphone設定ファイルができあがります。このファイルの一部を修正します。ファイルの編集にはviエディタを使います。

  1. /rootディレクトリへ移動します。
    # cd /root
  2. viエディタでlinphonercファイルを開きます。
    # vi linphonerc
  3. 9行目「contact=sip:KCB3@192.168.0.224」を修正します。「contact=sip:KCB3」部分はそのままで、「192.168.0.224」の部分をお使いのKCB-3WLのIPアドレスに修正してください。
    例: contact=sip:KCB3@192.168.1.100
  4. ESCキーを押して、「:」「w」「q」を連続で入力し、ENTERキーを押すとファイルを保存してviエディタは終了します。

簡易マニュアルを用意しましたので、詳しい使い方はこちらを参照してください。

>> vi簡易マニュアル(ここをクリック

3.メモリー領域を広げる

KCB-3WLではRAMをディスク代わりに使用していますが、音声データと画像データを同時に使う場合はRAMエリアを広げる必要があります。ここではviエディタでスタートアップファイル「/etc/init.d/rcS」を修正することで、メモリー領域を広げます。

  1. /etc/init.dディレクトリへ移動し、viエディタでmtabファイルを開く
    # cd /etc/init.d
    # vi rcS
  2. 122行目「mount -t tmpfs -o size=8M tmpfs /tmp」の行は/tmpディレクトリとしてRAMを8MB使用する設定ですので、これを4MBに減らします。
    mount -t tmpfs -o size=4M tmpfs /tmp (8Mを4Mに変更しディスク領域を減らす)
  3. 変更を有効にするため、いったん再起動してください。
    # reboot
  4. freeコマンドを使うと現在のメモリー状況を確認することが出来ます。

    # free

                     total         used         free       shared      buffers
         Mem:        14072         6216         7856            0            0
        Swap:            0            0            0
       Total:        14072         6216         7856

4.linphoneソフトウェアを使う

KCB-3WLで音声データ通信をするには、KCB-3WLで音声デバイスを認識させてから、linphoneサーバーを起動します。サーバーを起動する前にクライアントソフトウェアを準備をします。下の設定はWindows用のものです。

クライアントソフトウェアの準備

  1. linphoneソフトウェアをインストールします。
  2. linphoneソフトウェアを起動し、Linphoneメニューから「設定」を選び次の設定をします。
  3. Multimediaタブで、Playback device(音声再生デバイス)、Ring device(ベルが鳴るデバイス)、Capture device(マイク)をシステムに合わせて設定します。Skypeフォンを持っている場合はSkypeフォンで使用しているデバイスを設定します(画面はWindows XP)。


     

  4. 同じタブの「Enable echo cancellation」にチェックを入れておきます。
  5. codecsタブを開き、「PCMU 8000」以外のcodecを全て使用しないようにセットします。

デバイスドライバーの設定

KCB-3WLでWEBカメラのマイクを認識するように設定します。

  1. KCB-3WLを起動し、rootユーザーでログインします。
  2. マイク付WEBカメラをUSBコネクタへ接続します。起動前に接続していてもかまいません。
  3. 次のコマンドでカーネルモジュールのデバイス依存ファイルを再設定します(最初の一回だけ)。
    # depmod
  4. modprobeコマンドで、WEBカメラのマイクを認識させます(KCB-3WLを起動するごとに実行)。
    # modprobe snd-usb-audio
    # modprobe snd-pcm-oss
  5. デバイスファイルを作成します。デバイスファイルとはハードウェアのアクセスをファイルの読み書きに置き換えるものです。マイク付WEBカメラを取り付けた状態で、(4)の実行後に次のコマンドを入力してください(最初の一回だけ)。
    # mdev -s

    下記のファイルができあがります。
        /dev/mixer        (c 14 0)
       /dev/dsp     (c 14 3)
       /dev/audio        (c 14 4)
       /dev/pcmC0D0c     (c 116 24)
       /dev/pcmC0D0p     (c 116 16)

次回起動時からは(4)だけを行ってください。/etc/init.d/rcWに書き込むと起動時に自動実行します。

linphoneサーバーの起動

  1. KCB-3WLを起動し、マイク付WEBカメラを取り付け、modprobeコマンドでカーネルモジュールをカーネルに取り付けます(上の「デバイスドライバーの設定」の(4))
  2. 次のコマンドでlinphoneサーバーを起動します
    # cd /root
    # ./linphonec -c linphonerc -a
    (-aオプションを付けると着信時に自動接続する)
  3. linphoneクライアントソフトウェアを起動します。
  4. SIPアドレス欄に、「2. ライブラリのインストール>5) 設定ファイルを修正する>(c)」で設定したSIPアドレス(下記例ではKCB3@192.168.1.100)を入力します(画面はWindows XP)。


     

  5. linphoneソフトウェアの「Start Call」ボタン(左上の緑の吹き出しに受話器のマーク)を押すとKCB-3WLとつながり、音声での通話が可能になります。接続に成功すると、KCB-3WLでは次のようなメッセージが表示されます。

    ————–
    ~ # ./linphonec -c linphonerc -a
    NLS disabled.
    Ready
    Warning: video is disabled in linphonec. Run with -V option to enable it.
    linphonec> <sip:toto@192.168.1.6> is contacting you.
    ——-auto answering to call——-
    Connected.
    ————–

 

応用

今回はWEBカメラのマイク機能だけを使いましたが、KCB-3WLにUSBスピーカーを接続すると通話ができます。マイクとスピーカーをセットで使う場合はハウリングなどがおきる恐れがありますので、注意してください。また、通話にはPC側にもマイクが必要となります。

WEBカメラ+USBスピーカーなど2つ以上の音声デバイスを使用する場合は、USBハブが必要です。また、追加でデバイスを使用する際は、再度「mdev -s」コマンドを実行し、デバイスを使用するために必要なデバイスファイルを作成してください。複数の音声デバイスを使う場合は、KCB-3WLではデバイスがはじめに見つかった方が優先されます。先に付けた(認識された)デバイスが「/dev/dsp」、後び付けた(認識された)デバイスが「/dev/dsp1」とデバイスファイルに割り当てられます。例えば、USBスピーカー(playback_dev)を先に取り付け、WEBカメラのマイク(capture_dev)を後から取り付けた場合は、linphonercファイルを下のように書き換えてください。

playback_dev_id=OSS: /dev/dsp
ringer_dev_id=OSS: /dev/dsp
capture_dev_id=OSS: /dev/dsp1

カメラの画像も一緒に送りたい場合は、いつものようにuvc_streamコマンドを使います。linphoneを起動する前に、バックグラウンドで起動しておいてください。ただし今回はデータ量が多いため、解像度は320×240、フレーム数は5フレームくらいにする必要があります。このあたりはネットワークトラフィック次第ですので、ご利用状況に合わせて修正をしてください。

Android携帯(Sony Xperia)やiPhoneを使う場合は、アンドロイドマーケットやiTune Appsなどからlinphoneソフトウェアをダウンロードしてください。linphoneソフトウェアの設定はPCでの設定と全く同です。

今回確認したデバイス

CREATIVE

Logicool

Buffalo

アクロス

 

謝辞 

今回の記事作成には神奈川工科大学 ロボット・メカトロニクス学科兵頭和人教授のご協力いただきました。どうもありがとうございました。

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

■ICS3.5 解説

関連カテゴリー:ICS, サポート

ICS(Interactive Communication System)は、モジュール・コントロールボード間の双方向データ通信規格です。コントロールボードでのサーボの制御時の通信や、PCなどを使用してのサーボモーターの設定変更などが可能です。コマンドリファレンスが公開されていますので、自作ボードでの制御にも対応します。

<”シリアル” ⇔ ”PWM”の切り替えが可能>
【ICS3.5】では、【ICS3.0】のシリアル制御機能はそのままに、PWM信号での制御が可能になりました。

■ICS3.5シリアル通信の主な特徴

  • 最大1.25Mbpsの高速通信が可能
  • 「スピード」や「ストレッチ」のほか、「温度制限」や「電流制限」などサーボモーターの様々な特性を動作中に任意に変更可能
  • モジュールを接続するマルチドロップ接続では最大32個接続可能(モジュール、コントロールボードの能力によって最大数が変わります)
     

【機能一覧】

  • スピード
    サーボの最大出力(デューティー比)を設定します。軸の回転速度が変化します。
  • ストレッチ
    軸の保持特性を設定します
  • パンチ
    サーボの初動を調整します
  • デッドバンド
    サーボのニュートラル帯域(不感帯)を調整します
  • プロテクション
    サーボがロックしたときに脱力するまでの時間を設定
  • リミッタ
    正転・逆転の移動範囲を制限します
  • 温度制限
    設定した温度を超えるとサーボが脱力状態になります
  • 電流制限
    設定した電流を超えるとサーボが脱力状態になります
  • リバース
    サーボが指定した方向とは逆方向に移動します
  • スレーブ
    サーボが返事を返さなくなります。
  • 回転モード
    サーボの軸が指定の方向に回転します
     

(新機能)

  • レスポンス
    出力軸の動作開始時の立ち上がり特性を設定します。
  • ダンピング
    出力軸の動作停止時のブレーキ特性を設定します。
  • ユーザーオフセット
    出力軸の初期位置をユーザーが任意に設定できます。
  • シリアル専用
    選択するとシリアル信号での制御専用のモジュールになります。
     

■PWM制御での主な特徴

  • RCB-1HV、RCB-3JなどPWM専用のコントロールボードに対応しています。
  • PWM信号によるサーボの脱力、教示機能が使用可能。
  • キャラクタリスティックチェンジ機能でサーボに保存されているストレッチのパラメーターを3段階で切り換え可能
     

▼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


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

■ICS3.5 マネージャーソフトウエアR1.0.0.2

関連カテゴリー:ICS, ソフトウェア

ISC3.5マネージャーソフトウエア アップデート版を公開します。
ICS3.5対応のKRS-403xシリーズに使用してサーボの各種設定を行っていただくことが出来ます。

同時に配布のマニュアルは以前のバージョンと同じで記載がありませんが、
【2011年2月16日更新】最新版にマニュアルを入れ替えております。
なお、最新版マニュアル単体は、こちらでダウンロードしていただけます。
Windows7 64ビット版でもご使用していただけます。

ICS3.5 マネージャーソフトウエア   

※ファイルは圧縮ファイルで提供されています。解凍すると
 PDFファイルのマニュアルと、Ics35Managerフォルダが出来ますので
 フォルダを適当な場所にコピーしてご使用ください。
 なお、古いバージョンをお使いの場合には、あらかじめ前のバージョンのファイルを削除して下さい。
※使用するためには別途ICS-USB アダプターHS を用意して頂く必要があります。

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

■ICS3.0対応 シリアルマネージャーVer1.51

関連カテゴリー:ICS, ソフトウェア

KRS-6003HVが対応するISC3.0用のサーボマネージャー最新版です。
(以前は ICS3.0シリアルマネージャー B の名称で公開)

シリアルマネージャーV1.51  

 

※使用するには、インターフェースとしてICS−USBアダプターまたはICS-USBアダプターHSが必要です。
ファイルは圧縮ファイルで提供されており、シリアルマネージャーのソフトウエアとマニュアルが含まれます。

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

■KO_DRIVER_2011の公開(不具合修正版)

関連カテゴリー:ICS, サポート, ソフトウェア

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

 

ファイルを解凍すると、ドライバファイルのあるフォルダとインストールマニュアルができます。インストールマニュアルを参考にしてドライバーのインストールを行ってください。

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

■HeartToHeart4 Ver.1.3 Rev.20100830の公開

関連カテゴリー:KHR-3HV, RCB+HeartToHeart, サポート

HeartToHeart4 Ver.1.3.16を公開いたします。主な変更点は下記の通りです。

<SingleServoコントロール>

  • ROMに書き込んだときに正常に動作するよう修正
  • Sync状態で通信エラーが出たときにコマンドがきちんと生成されないバグを修正
  • サーボモーター一覧はプロジェクトで使用可能になっているものだけを表示するよう変更した

<Remixコントロール>

  • サーボモーター一覧はプロジェクトで使用可能になっているものだけを表示するよう変更した
  • バッテリーを設定しても反映されないエラーを修正した
  • ミキシングアドレスの調整

<Freeコントロール>

  • サーボモーターの選択をチェックボックスに変更
  • 名称変更済みのサーボモーターを探せないバグを修正
  • サーボモーター一覧はプロジェクトで使用可能になっているものだけを表示するよう変更した

<Holdコントロール>

  • サーボモーターの選択をチェックボックスに変更
  • 名称変更済みのサーボモーターを探せないバグを修正
  • サーボモーター一覧はプロジェクトで使用可能になっているものだけを表示するよう変更した

<モーション編集画面>

  • 変換機能でリストにアイテムがセットされていない状態でフレーム数だけセットしたファイルを保存したとき、フレーム数が正しく保存されない不具合を修正した

 

ファイルは下記URLよりダウンロードしてください。ZIP圧縮ファイルを解凍すると、「setup.exe」と「HTH4_V130.msi」ができあがりますので、「setup.exe」をダブルクリックしてインストールをしてください。

インストール時には以前のバージョンのHeartToHeart4は自動的にアンインストールされます。マイドキュメントフォルダにある「HeartToHeart4」フォルダは削除されません。

 

ダウンロードはこちら> HTH4_V130.ZIP

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

■KRI-3 Manager Ver.1.1公開

関連カテゴリー:KHR-3HV, オプション, サポート, ソフトウェア

いつも弊社製品をご利用いただき、誠にありがとうございます。この度KRI-3 Managerで通信がうまくいかない不具合がありましたので、修正いたしました。以前のバージョン(Ver.1.0.0)で通信がうまくいかない場合はこちらをご利用ください。

KRI-3 Manager Ver.1.1.0 Rev.20101007と簡易マニュアルをZIPフォーマットで圧縮しています。下記リンクよりダウンロードしてご利用ください。

 

ダウンロードはこちらから KRI3ManagerV110R20101007.zip 

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

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

注意

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

 

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

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