■KCB-1でKHR-1を動かす方法(2)
前回の続きです。
このプログラムでは2バイトコントロールコード再生のプログラムを、RCB-1対応に変更をしています。2バイトコントロールコード再生は、KCB-1からKRCと同じ再生コマンドをRCB-1へ送信し、モーションを再生する方法です。モーションを再生するには、モーションを各ボタンに割り付ける必要があります。
なお、コントロールコード再生を行う際は、更新プログラム「KCB1Update20080510.exe」をダウンロードする必要があります。詳しくは「KCB-1 SDK更新(Rev.20080510)」をご覧ください。
・ プログラム
#include <ad.h>
#include <rcb3.h>
#include <led.h>
// プログラム中で実行するモーションをHTHで割付してください
#define FORWARD BTN2B_LU // 前進
#define LEFTSTEP BTN2B_LL // 左サイドステップ
#define RIGHTSTEP BTN2B_LR // 右サイドステップ
#define LEFTTURN BTN2B_LL | BTN2B_LD // 左ターン
#define RIGHTTURN BTN2B_LR | BTN2B_LD // 右ターン
#define BOW BTN2B_RU // あいさつ
#define NP_WA 1200000 //停止後の待機時間(前に再生したモーションとかぶらないために余裕を持って設定する)
void khr_2Bmotion(int cc) //2BYTEcodeモーション再生関数
{
rcb3_put_2Bcode (cc); //2BYTEcodeでモーション再生
while (ad_read(1) > 500) {} //モーションが終了するまで待つ
rcb3_put_2Bcode (BTN2B_NP); //モーション終了後ニュートラルを送信
wait (NP_WA); //少しだけ待つ
}
void main(void)
{
cpu_init (); // CPUの初期設定を行う
ad_oneshotmode (); // ADはワンショットモードで読み込む
ledgrn_on (); // 起動確認用LEDを点灯する
rcb3_rx_open (); // RCBのRXポートを接続します
wait (5000000); // RCBの起動が安定するまで待ちます
ledred_on(); // 赤LED点灯後、モーション再生可能
while(1){
rcb3_put_2Bcode (BTN2B_NP); //何もしていないときはニュートラルを送信
if (ad_read(2) > 500) { //もしスイッチが押されたら
khr_2Bmotion(BOW); //モーション再生
khr_2Bmotion(FORWARD);
khr_2Bmotion(RIGHTSTEP);
}
}
}
・解説
▼変更点①
通常の2バイトコントロールコード再生のプログラムと違うところは、モーションを再生していないときに、常にニュートラル信号を送信していることです。これは、通常、KRCの電源を入れて何も操作していない場合に、KRCからはニュートラル信号が送信されているためです。
▼変更点②
1)コントロールコード再生
2)再生終了待ち
3)ニュートラル送信
4)ニュートラル状態に戻るまで待つ
以上の④項目を今回はkhr_2Bmotionという関数にまとめました。
■KCB-1でKHR-1を動かす方法(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シリーズのフロントカウルをかぶせることをお勧めします。例はテープで固定しました。

(画像 クリックで拡大)
②へ続く
■RCB3のモーション再生(コマンド再生)(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が最初のモーション再生命令を送信する前にスタートアップモーションが終了していなくてはなりません。