KCBサポート » ソフトウエア »


■KCB-1でKHR-1を動かす方法(1)

関連カテゴリー:RCB-1, サポート, シリアル通信, ソフトウエア

今回は、KCB-1のコントロールコード再生でKHR-1(RCB-1)を動かす方法を紹介します。

(※RCB-1とKCB-1では、コマンド再生、7バイトコントロールコード再生はできません。また、RCB-1に接続された6VバッテリーでKCB-1を動かすため、シリアルサーボはお使いになれません)

①ではKCB-1の実装やケーブルの配線などの準備、②ではプログラムの紹介をします。

 

・ 通信の準備

RCB-1をKRCで操作できるように設定し、再生するモーションをKRCの各ボタンに割り付けてください。RCB-1のKRRに接続するポートとKCB-1のCOMポートを接続ケーブルでつなぎます。

電源は空いているRCB-1のサーボ接続端子とKCB-1の空いているシリアルポートを接続します。その際、白線は外してください。

 

・ モーション終了を知るための準備

モーション終了後、RCB-1を1度ニュートラルに戻す必要があります。モーション終了をwaitでタイミングを取ることもできますが、モーションごとに調整が必要になり、不便です。そこで、RCB-1の空いているサーボ端子をモーション中は「H」、モーション終了後は「L」に設定し、その信号をKCB-1のADポートで受け取ります。②で紹介するプログラムでは、RCB-1のCH4とKCB-1のAD1を接続し、モーションの終了を受け取っています。これは以前紹介した「コントロールコード再生 モーション終了を知る方法」と同じ方法です。

なお、モーション再生を手動でスタートさせるため、AD2の信号ラインと電源ラインにスイッチを接続してください。

 

KCB-1との接続は、全てRCB-1のID0に行います。

 

(画像 クリックで拡大)

・ KHR-1へのKCB-1実装

KHR-1では腹部にネジ止めをします。このとき、ボード裏とボディーが接触するとショートする恐れがあるので、6mm程度のスペーサーをはさみます。また、ボードがむき出しのままだと転倒したときに破損する可能性があるため、KHR-HVシリーズのフロントカウルをかぶせることをお勧めします。例はテープで固定しました。

 

(画像 クリックで拡大)

 ②へ続く

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

■センサーで目標を探す(KRS788使用)④

関連カテゴリー:KHR4thアニバーサリー, サポート, シリアル通信, ソフトウエア, 自律ロボット

前回からの続きです。

4) ロボットを物体の方向に歩かせる

前回までで、目標の位置を特定することができました。今回は、ロボットが見つけた目標に向かって歩くためのモーションの分岐方法を紹介します。

・switch文でモーションを分岐

 上記は、モーション分岐のプログラムです。読み取ったアナログ値の最大値の位置の番号は、前回説明したバブルソートによってadk[0]に代入されています。このadk[0]を元にどのモーション再生するか決めます。

 switch (adk[0]){
       case 0:
       case 1:
       case 2:
       rcb3_motion_play(9);     //左旋回2回
       rcb3_motion_play(9);
       break;

       case 3:
       ・・・(中略)
       case 8
       rcb3_motion_play(9);     //左旋回1回
       break;

       case 9:
       rcb3_motion_play(3);     //左サイドステップ
       break;

       case 10:
       ・・・(中略)
       case 14:
       rcb3_motion_play(1);     //前進
       break;
       ・・・(中略)
}
 

画像は、それぞれにモーション割り当てを図式化したものです。0~24までの数字は、adk[ ]に代入したモーションを読み取った位置の番号で、Left turnなどは再生するモーションの名前です。

(画像 クリックで拡大)

 上記のプログラムと画像を見て、adk[0]が「3」だった場合を考えてみます。「3」は左側の緑のエリアの番号です。目標に向かうためには、記述のLeft turn(左旋回)を1回再生すれば、ロボットは目標へ向くことになります。

 

 以上で「センサーで目標を探す(KRS788使用)」の説明を終わります。この方法を応用すれば、いろいろ自律ロボットを作ることができると思います。お試しください!

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

■センサーで目標を探す(KRS788使用)③

関連カテゴリー:KHR4thアニバーサリー, サポート, シリアル通信, ソフトウエア, 自律ロボット

 前回のプログラムの続きです。 

3) どの物体が一番近いのかを求める

void search(void){    // アナログ値の読み取りとバブルソート

    unsigned int i;
    int s, t, tmp;

    rcb3_motion_play(37);      // 正面から左に向くモーション再生
    wait(300000);          // サーボが動ききるまで少し待つ
    rcb3_motion_play(38, mesure_distance); // 180度旋回中にアナログ値を読む
    wait(600000);           // サーボが動ききるまで少し待つ
    rcb3_motion_play(39);        // 右から方面に向くモーション再生
    wait(300000);           // サーボが動ききるまで少し待つ

}

// ここからバブルソート開始

for(s = 0; s <= 7; s++){
    for (t = s+1; t <= 8; t++){
        if (adj[t] > adj[s]){ //adj[t]の値がadj[s]よりも大きかったら順番を入れ替える
            tmp = adj[t];
            adj[t] = adj[s];
            adj[s] = tmp;
    
            tmp = adk[t];  //adj[t] > adj[s]だったらadkも同じ処理を行う。
            adk[t] = adk[s]; //最大値のアナログ値の場所はadk[0]に代入される。
            adk[s] = tmp;
        }
    }
}

 この関数では首を旋回する一連のモーションの再生と、最大値を求めるためのバブルソートの処理を行います。

・コマンド再生の特殊な使い方

 rcb3_motion_play(38, mesure_distance) は、「モーション番号38を再生している間に関数mesure_distanceの処理を行う」という命令です。モーション番号38は頭部を180度旋回させるモーションなので、前回紹介したmesure_distanceの処理を同時に行うと、弧を描くように正面全体のアナログ値を検出することができます。

 ・バブルソートについて

 バブルソートとは、複数の数値の中でどの数値が最も大きいかを求めるための処理です。rcb3_motion_play(38, mesure_distance)で読み取ったアナログ値をバブルソートにかけて最大値を求め、どこに目標があるのかを割り出します。

 配列に代入されたアナログ値を2つずつ比べます。もし、ひとつ前の値より今の値のほうが大きかったら順番を入れ替えます。その際、そのまま大きい値を小さい値の配列番号に入れてしまうと、小さい値が消えてしまいます。そこで、小さい値は別の変数(tmp)に一時保存して、大きい値が移動した後に、大きい値がいた配列のところにもう一度小さい値を代入します。これを繰り返すと、最も大きな値が配列の先頭に来て、最も小さな値が配列の一番後ろに来ることになります。 (画像1)

 

(画像1 クリックで拡大)

アナログ値(adj[ ])が移動すると、読み取った番号(adk[ ])も同時に移動するので、adk[0]には最も高いアナログ値を読み取ったときの番号が代入されます。あとは、この番号にモーションを割り当て、分岐すれば、ロボットは目標に向かって歩き出します。

④へ続く

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

■センサーで目標を探す(KRS788使用)②

関連カテゴリー:KHR4thアニバーサリー, サポート, シリアル通信, ソフトウエア, 自律ロボット

前回の続きです。

2) 頭部が旋回している間にセンサーの値を読み取る

・プログラムの解説

void mesure_distance ( ) // アナログ値を一定間隔で読み取る関数
{
    unsigned int i;
    wait(47370);
    for(i = 0; i < 8; i++){      // 頭を一度振る間に9回アナログ値を読み取り、
   
    adj[i] = ad7_read();    // adj[i]に代入していく
        ledgrn_switch();
        wait (47370);         // アナログ値を読む間隔は47370
                      // 426330(約0.7秒) / 9 = 47370
    }
    adj[8] = ad7_read( );       // 最後の1回

    for (i = 0; i <= 8; i++) {   //読みとった場所の番号を0からadk[]に代入
        adk[i] = i;
    }
}

  この関数はアナログ値を一定の間隔で読み取る処理を行います(画像)。この処理を頭部が旋回している間に行うことによって、ロボットの正面180°のどこに物体があるのかを知ることができます。

 読み取るタイミングはwaitで調整します。正面で読み取ることを基準にして、左右がほぼ同じ角度を読み取るように調節してください。読み取ったアナログ値は配列(例ではadj[ ])に代入してください。

 同時に、アナログ値を読み取った場所を、別の配列(例ではadk[ ])に代入します。この配列は次回の③で説明するバブルソートで使います。

 

 (画像 クリックして拡大)

 

・自律ロボット実装例で頭部サーボがシリアルサーボになっている理由

 アナログ値を読み取るタイミングを作るために、PWMサーボKRS788では時計を使って旋回時間を計り、waitを調整して読み取る角度を作らなくてはいけませんでした。この方法だと、正確な角度でアナログ値を読み取るために調整を繰り返す手間があります。

 ところが、シリアルサーボは、正確に回転角を指定することができるため、角度や読み込むタイミングを調節する手間が大幅に減ります。プログラムで細かい角度を指定し、それを連続して命令するだけで物体を簡単に探すことができるようになるのです。 

③に続く 

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

■センサーで目標を探す(KRS788使用)①

関連カテゴリー:KHR4thアニバーサリー, サポート, シリアル通信, ソフトウエア, 自律ロボット

ビーチフラッグや、自律バトル競技など、自律ロボット競技に参加するためには、目標を探す処理が必要になります。今回はKRS788を頭部に使用して物体を探すプログラムを解説します。

・目標を探すには

 目標を探す方法のひとつに、頭部を旋回している間に一定のタイミングでアナログ値を読み取り、最大値を求めるという方法があります。PSDセンサーや超音波センサーは、物体が近いほど高い値を示します。ビーチフラッグや自律バトル競技の場合、フィールド上で最も近い物体が目標になる確率が高いので、読み取った値の最大値を目標と判断し、その方向へ近づくプログラムを組みます。

(画像1 クリックで拡大)

画像1はロボットが目標を探しているところを、上から見た図です。0~24の番号はアナログ値を取るタイミングと順番です。

・プログラム作成の流れ

    1) 頭部を180°旋回させるモーションをつくり、その動作時間を計る

    2) 頭部が旋回している間にセンサーの値を読み取る

    3) どの物体が一番近いのかを求める

    4) ロボットを物体の方向に歩かせる

 

・用意するもの

 

1) 頭部を180°旋回させるモーションをつくり、その動作時間を計る 

・モーション作成

まず、首を180°旋回するモーションをHeart to Heartで作成します。下記の三つのモーションを作ってください。

  • モーション①. 頭部を正面(ホームポジション)から左に向かせる
  • モーション②. 左に向いた頭部を180°旋回して右に向かせる
  • モーション③. 右に向いた頭部を正面(ホームポジション)に向かせる

モーションを3つに分けた理由は、アナログ値を読むモーション②を別にして、読み込むタイミングを正確に取るためです。

 

・モーション②の移動時間を測る

 左に向いている頭部が右へ動きだしたところから、右に向いて停止するところまでの時間を計ります。計った時間を分割してアナログ値を読む取るタイミングを取ります。

②へ続く

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

■KCB-1 SDK Ver.1.0a Rev.20080510

関連カテゴリー:アップデート, サポート

KCB-1 SDKのアップデーターVer.1.0a Rev.20080510を公開いたします。

このアップデーターを適応すると、EEPROMにフルアクセスできるようになります。ただしモデル番号が「KONDO E-135701B」でバーコードシールに「Ver.1.00」のKCB-1をお持ちのお客様は、そのままではお使いいただけませんので、KCB-1を弊社サービス部までお送り下さい(詳しくはこちらをご覧下さい)。

また、ics2.hに若干の修正を加えました。

このアップデーターはVer.1.00 Rev.20080318の更新ファイルも含んでいますので、アップデーター適応後のバージョンは「Ver.1.0a Rev.20080510」となります。最新マニュアルPDFファイルも同時にインストールされます。

本アップデータからアンインストーラー対応となりました。アンインストールはスタートメニューからアンインストーラーを起動するか、コントロールパネルの「プログラムの追加と削除」から実行して下さい。アンインストールを実行するとスタートメニューに登録されたプログラムグループとレジストリ情報が削除されます。SDKファイルやサンプルフォルダなどは削除しませんので、手動にて削除して下さい。

下にあるアップデータをダウンロード後、 実行して、更新プログラムの指示に従って下さい。なおSDK更新には

 1.KCB-1 SDKに付属のCD-ROMジャケットにあるシリアル番号

 2.KCB-1 SDKがコンピューターへインストール済みであること

が必要です。また、更新プログラムの実行は管理者権限で行うようにして下さい。

  • KCB-1 SDK 更新プログラム

ZIPファイルを解凍すると、KCB1SDK_V10aR20080510.exeができあがります。
実行して、更新プログラムの指示に従って下さい。

ダウンロードKCB-1 SDK 更新プログラム

□ 更新プログラムは、KCB-1 SDKファイルを上書きしますので注意して下さい。KCB-1 SDKをすでにカスタマイズされている方は複製を保存して下さい。

 

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

■KCB-1 SDK更新(Rev.20080318)

関連カテゴリー:アップデート, サポート

KCB-1 SDK更新プログラム(Rev.20080318)ができました。 

SDK更新には、

 1.KCB-1 SDKに付属のCD-ROMジャケットにあるシリアル番号

 2.KCB-1 SDK

が必要です。また、更新プログラムの実行は管理者権限で行うようにして下さい。

この更新を適応すると、ロボットコントローラーKRC-1/3のエミュレート機能・その他が追加されます。エミュレート機能ではKRCが出力するコントロール入力値をRCB-3のRXポートへ送ることで、KCB-1がプログラム可能なロボットコントローラーになります。

なお、SDK更新に伴い、サンプルプログラムの修正・追加と、KCB-1 SDKマニュアルも更新されました。下のリンクよりダウンロードして下さい。

 ● KCB-1 SDK 更新プログラム

ZIPファイルを解凍すると、KCB1Update20080318.exeができあがります。
実行して、更新プログラムの指示に従って下さい。

ダウンロードKCB-1 SDK 更新プログラム

□ 更新プログラムでは、KCB-1 SDKファイルを確認して、更新プログラムを指定したフォルダへ書き出します。同じフォルダを指定するとファイルを上書きしますので注意して下さい。

□ KCB-1 SDKをすでにカスタマイズされている方も、上書きには注意して下さい。

 ● 追加SampleとKCB-1 SDKマニュアル

ZIPファイルを解凍すると、「Samples」フォルダの中に、「KRC_EMU」フォルダと「RCB3_MotionPlay」フォルダができますので、「KCB1\Samples\」フォルダへ上書きコピーをして下さい。

また、「KCB-1・C言語マニュアル20080319.pdf 」も作成されます。

ダウンロード追加サンプル・SDKマニュアル

コントロール入力値によるモーション再生については、ビーチフラッグ競技サンプルプログラムでも内容を確認できます。

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

■RCB3のモーション再生(コマンド再生) (3)

関連カテゴリー:RCB-3, サポート, シリアル通信, ソフトウエア, 自律ロボット

今回は、rcb3_motion_play( )の特別な機能を紹介します。

ロボットがモーションを再生している間、KCB-1はモーション再生終了の信号が来るまで次の処理に進めません。実は、モーション再生中のKCB-1は手が空いている状態で、命令を送れば別の動作が可能です。この時間を利用してKCB-1に一つ処理をさせます。

 


 

#include <led.h>
#include <rcb3.h> // モーション再生に必要
#include <ad.h>

int adv;

void get_ad(void)
{
 adv = ad_read(1);
}

void main(void)
{
  cpu_init ();  // CPUの初期設定を行います
  ledgrn_on (); // 電源ON

  wait (300000); // RCB-3の電源が安定するまで待ちます

  // RCB3との通信設定を行います  // スタートアップモーションを終了するまで待ちます
  if (rcb3_open (80) == FALSE) { // RCB3とポートを接続します
    ledred_on ();                // スタートアップモーション80を再生できなかった場合
    return;                      // 赤LEDを点灯して、プログラムは終了します

  }
  // スタートアップモーション終了後にモーション14番を再生します 
  rcb3_motion_play (14, get_ad);
}

プログラムは前回のものを使用しています。

motion_play関数の第2引数に関数名を指定(引数無し、返値無し)すると、モーション再生中に指定した関数が実行されます。つまり歩きながらセンサーの値を読み込むこともできるのです。

注意すべきことは、指定する関数はモーション再生が完了し、RCB-3から返事が返ってくる前に処理を終了しなければならないことです。そうしないとRCB-3からの返事をうまく受け取れずに、モーション再生が終了したかどうか分からなくなってしまいます。 

 

センサー以外にも、PIOポートにLEDを接続して点灯パターンを関数化し、それを歩行モーション番号と一緒に書き込むことで歩行しながらイルミネーション点灯、ということも面白いと思います。お試しください。

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

■RCB3のモーション再生(コマンド再生) (2)

関連カテゴリー:サポート, シリアル通信, ソフトウエア, 自律ロボット

今回はKCB-1からRCB-3のモーションを再生するプログラムを紹介します。

以下はサンプルプログラム(RCB3_MotionPlay)から要点を抜粋したものです。


#include <led.h>
#include <rcb3.h> // モーション再生に必要

void main(void)
{
     cpu_init ();      // CPUの初期設定を行います
     ledgrn_on ();     // 電源ON

     wait (300000);    // RCB-3の電源が安定するまで待ちます

// RCB3との通信設定を行います
// スタートアップモーションを終了するまで待ちます
     if (rcb3_open (80) == FALSE) { // RCB3とポートを接続します
          ledred_on ();   // スタートアップモーション80を再生できなかった場合
          return;         // 赤LEDを点灯して、プログラムは終了します
     }
// スタートアップモーション終了後にモーション14番を再生します 
      rcb3_motion_play (14);
}


このプログラムでは、スタートアップモーション(80)の再生後に、続けてモーション番号14番を再生します。

 rcb3_openはRCB-3とのシリアル接続通信の設定を行った後に、引数に指定したモーション番号(例では80)をスタートアップモーションとして再生します。ここに0を指定すると、モーションは何も再生されず、通信設定だけを行います。

 モーション番号は、例えばM1なら1、S1は81と指定します。

 接続設定と、スタートアップモーションの再生が終わったら、rcb3_motion_play関数で好きなモーションを再生して(例では14)下さい。rcb3_motion_play関数を続けて書けば、順番にモーションが再生されます。

 

ぜひお試し下さい。

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

■RCB3のモーション再生(コマンド再生)(1)

関連カテゴリー:RCB-1, サポート, シリアル通信, ソフトウエア, 自律ロボット

今回は、rcb3_motion_play関数を使って、KCB-1からRCB-3のモーション再生を行う準備をします。

 

モーションを再生中に別のモーションを再生すると、ロボットが転んだりするなど、うまく動作できなくなるため、KCB-1ではモーションが終了したことを確認してから、次のモーションを再生するようになっています。

 そこで、まずはHeartToHeartを起動して、オプション画面で「モーション再生終了時に返事をもらう」にチェックを入れてください。これでKCB-1もモーション再生中か、そうでないかが分かるようになります。

 そしてスタートアップモーションはKCB-1から再生※しますので、「電源投入時にスタートアップモーションを再生する」の項目はOFFにしておきます。

 

ここまででRCB-3の設定は終了です。

 

 

次に、「KCB-1のKHR-HVシリーズの実装例」で紹介した、クロスケーブルを接続して下さい。これでロボットの設定は終了です。次はいよいよモーション再生プログラムの実行です。

※RCB-3でスタートアップモーションを再生することもできますが、KCB-1が最初のモーション再生命令を送信する前にスタートアップモーションが終了していなくてはなりません。

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