RCB-4変換基板の使用方法(3) Rcb4MotionPlay編
【ここまでの関連記事】
前回の記事に続きまして、今回は『RCB-4 Library for Arduino』に付属するサンプルプログラム「RCB4MotionPlay」を利用して簡単なモーション再生を行います。
■プログラム概要
「Rcb4MotionPlay」は、RCB-4に登録されたモーションを番号を指定して再生するプログラムです。モーションの再生は、motionPlay();関数を使用します。
モーション番号は、HeartToHeart4のモーション一覧ウィンドウに表示されている番号です。この番号を()内に記入するだけで、モーションを再生することができます。下の画像の「M001」が該当します。
モーション再生方法は、motionPlay();関数の他にsetKrrButton();関数があります。こちらは、無線コントローラなどでモーションを再生する際に登録する「ボタンデータ」をもとにモーションを再生する方法です。この方法を使用すると、無線コントローラで操縦しているように連続歩行や、ボタンが押されている間は〇〇をする、などの制御ができるようになります。setKrrButton();関数に関しては、次の記事でご紹介します。
■プログラム解説
ここからArduino用のプログラム環境であるスケッチを使用します。
『RCB-4 Library for Arduino』に付属するサンプルプログラムの「Rcb4MotionPlay」の内容をポイントを絞って解説します。プログラムの詳細は、ライブラリ付属のマニュアルをご参照ください。
サンプルプログラムは、「ファイル」→「スケッチ例」→「Rcb4Class_V100」または「Rcb4SoftSerialClass_V100」から開くことができます。
「Rcb4Class_V100」は、HardwareSerialで通信するためのライブラリです。こちらを使用すると、ArduinoのSerial(UART)端子からRCB-4と通信することができます。
「Rcb4SoftSerialClass_V100」は、SoftwareSerialで通信するためのライブラリです。こちらは、デジタルI/O端子を疑似的にSerial端子として使用することができます。Arduino UNOは、Serial端子が1つしかなく、USB端子と共用ですので不便な面がありますが、SoftwareSerialでI/O端子を使用することにより、PCとの通信とRCB-4の通信を切り分けることができます。
ただし、SoftwareSerialは通信が途切れる場合がありますので安定して使用したい場合はHardwareSerialで通信することをお勧めします。
最初に記述されている下記の内容は、RCB-4と通信するための初期設定です。HardwareSerial、SoftwareSerialで初期設定の方法が異なります。
ただし、この箇所以降は、各関数を同じように使用できますので、最初の異なるポイントだけご注意ください。
この箇所の詳細は、ライブラリ付属のマニュアルをご参照ください。
●ライブラリ ver.1(HardwareSerialの場合)
1 2 3 4 5 6 7 8 9 |
#include <Rcb4HardSerialClass.h> const byte ACK_CHECK_PIN = 3; const byte CHECK_PIN = 4; const long BAUDRATE = 115200; const int TIMEOUT = 100; Rcb4HardSerialClass rcb4(&Serial,BAUDRATE,TIMEOUT); //RCB4HardSerialClassの定義 |
●ライブラリ ver.1(SoftwareSerialの場合)
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <Rcb4SoftSerialClass.h> const byte ACK_CHECK_PIN = 3; const byte CHECK_PIN = 4; const byte S_RX_PIN = 8; const byte S_TX_PIN = 9; const long BAUDRATE = 115200; const int TIMEOUT = 100; Rcb4SoftSerialClass rcb4(S_RX_PIN,S_TX_PIN,BAUDRATE,TIMEOUT); //RCB4Classの定義、softSerial版 |
下記は、RCB-4と通信を開始するためのプログラムです。この関数が記述されている場所からArduinoがRCB-4と通信を開始します。
プログラムの最初にsetup()が実行されますのでここに記述してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void setup() { pinMode(ACK_CHECK_PIN ,OUTPUT); //ACK確認を出力するピン設定 pinMode(CHECK_PIN ,OUTPUT); //確認を出力するピン設定 rcb4.configData.word = 0xffff; //ConfigDataは間違えないように0xFFFFで初期化 while(rcb4.open() == false); //Configをとれないとモーション再生が大変なので、取得できるまでループ digitalWrite(ACK_CHECK_PIN,HIGH); //OPENできていたらACKは返ってきている if(rcb4.checkAcknowledge() == true) //ACKのチェック { digitalWrite(ACK_CHECK_PIN,HIGH); } else { digitalWrite(ACK_CHECK_PIN,LOW); } } |
motionPlay関数では、RCB4内部のコンフィグデータが必ず必要となります。open()関数内でRCB4内部のコンフィグデータをクラス内で取得しますので、while(rcb4.open() == false);で通信が確立し、データを取得できるまで繰り返し返事を待ちます。
1 2 3 |
void loop() { while(rcb4.configData.word == 0xffff); //configDataが読み取れてない場合は無限ループ |
メインループの最初にRCB-4のコンフィグを確認する処理があります。この箇所でRCB-4と正常に通信できているかを確認し、次のモーション再生処理に移ります。
1 2 3 4 5 6 7 8 9 10 |
if(rcb4.motionPlay(1) == true) //モーション1を再生 { digitalWrite(CHECK_PIN,HIGH); } else //通信失敗時 { digitalWrite(CHECK_PIN,LOW); } delay(2000); |
rcb4.motionPlay(1)でモーションを再生します。
この関数は、戻り値として正常に通信ができたかを返します。正常に通信ができていればtrueですので、CHECK_PINをHIGHにします。反対に失敗していればLOWにします。このデジタルI/Oへの処理は、RCB-4との状態を確認するために使用できますが、特に必要なければrcb4.motionPlay(1);のみでもモーションを再生することは可能です。
motionPlay()関数の引数に当たる(1)は、HTH4のモーション一覧ウィンドウに表示しているM001です。例えば、M002に後進が登録されている場合は、rcb4.motionPlay(2);とすると後進モーションを再生することができます。
最後にdelay(2000);がありますが、これはここで2秒間待つという処理です。RCB-4がモーションを再生している最中に次のモーション命令を送ると、再生中のモーションをキャンセルしてしまう場合があるためdelay()でモーションが終了するまで待っています。
【morionPlay()関数を使用した連続歩行】
motionPlay()でモーションを再生した場合、無線コントローラのボタンを押した状態で連続再生するモーション(CmpButtonコントロール)は、最初の分岐までしか再生できませんので注意が必要です。この方法でArduinoから再生する場合は、次に解説するsetKrrButton()関数を使用します。
motionPlay()関数で連続歩行をする場合は、HTH4のSetCounterコントロールと、Loopコントロールを使用して、予め歩行する回数を指定しましょう。
KXR-L4TのサンプルモーションM001/002がこの方法で作成されていますので参考にしてください。
■プログラムの書き込みと実行
サンプルプログラムの「Rcb4MotionPlay」を書き込んで実行してみます。
1)RCB4変換基板上のスイッチを「書込」に切り替えます。
※SoftwareSerialで使用する場合は、「実行」のまま切り替える必要はありません。
2)ArduinoにUSBケーブルを接続します。
3)スケッチの書き込みボタンを押します。
4)書き込みが正常に完了したらArduinoのUSBケーブルを抜き、RCB-4変換基板上のスイッチを「実行」に切り替えます。
(プログラムの書き込みが完了すると、Ardionoは自動でプログラムを実行します。スイッチを「実行」に切り替えてからRCB-4にコマンドが流れますが、その際にプログラムの途中からRCB-4に命令が行くと正常に通信できない場合があります。安全のため、一度USBケーブルを抜き、ロボットの電源をいれてからプログラムを実行させましょう)
5)ロボットの電源をONにするとロボットが動きます。
【ロボットの動作】
RCB-4との通信が正常にできているか確認した後に、M001のモーションを再生し、M002のモーションを再生します。
KXR-L4Tの場合は、前に5歩進んだ後に、後ろに5歩戻ります。
モーション番号を変えるだけでモーションを指示できますので非常に手軽にロボットを動かすことができます。センサーの値をもとにswitch文で分岐すれば、簡単な自律ロボットを作成することも可能です。Arduinoの豊富なオプションラインアップと組み合わせて、ぜひご利用ください。
次回は、任意の長さで連続歩行を可能にするsetKrrButton()関数について説明します。
『RCB-4変換基板の使用方法(4) setKrrButton()編』(編集中)
KHR-3HV Ver.3.1 リフェバッテリー付きセットの詳細をみる KHR-3HV Ver.3 リフェバッテリー付きセットの詳細をみる KMR-M6 Ver.3 リフェバッテリー付きセットの詳細をみる KHR-3HV Ver.2 リフェバッテリー付きセットの詳細をみる KXR-L2 ヒューマノイド型 Ver.2の詳細をみる KXR-L4T-R カメ型・ローバー型 Ver.2(アカデミックパック)の詳細をみる KXR-A5 アーム型 Ver.2の詳細をみる KXR アドバンスセットA Ver.2の詳細をみる KXR アドバンスセットB Ver.2の詳細をみる RCB-4変換基板の詳細をみる KSBシールド2の詳細をみる KXR用オプションボード搭載セットCの詳細をみる KXR-L4T-R カメ型・ローバー型の詳細をみる KXR アドバンスセットAの詳細をみる KXR-A5 アーム型の詳細をみる KXR アドバンスセットBの詳細をみる