RCB-4変換基板の使用方法(4) M5StickCからRCB-4のモーションを再生する
【関連記事】
RCB-4変換基板の使用方法(3) Rcb4MotionPlay編
RCB-4変換基板を中継してM5Stack社のM5StickCからRCB-4miniに登録されているロボットのモーションを再生する方法をご紹介します。
M5StickCは小型軽量ですので、ロボットに搭載したときに負荷が少なく使い勝手が良いデバイスです。この記事では、二足歩行ロボットであるKXR-L2に搭載しますが、同じくRCB-4miniを搭載しているKXRシリーズの各ロボットや、RCB-4HVを搭載しているKHR-3HVや自作ロボットでも同様の方法でモーション再生が可能です。RCB-4mini、またはRCB-4HVをご利用されている方は、ぜひお試しください。
※M5StickC、及びプログラムに関連するお問い合わせについて、弊社は対応致しかねます。下記の記事は、使用事例として参考にご一読ください。
※以下の記事では、RCB-4HV、RCB-4miniを併せて”RCB-4”と記載しています。KXR-L2を使用例としているため搭載ボードはRCB-4miniになりますが、この記事の内容は両ボードに対応しています。
■M5StickCとは
M5StickCは、カラー液晶付きのマイコンボードです。Wi-FiやBluetoothを実装していますので、オプションを追加しなくてもデバイス本体のみで無線通信が可能です。M5StickCはArduinoIDEの開発環境が使用できますので、使い慣れた開発環境でプログラミングできます。今回は、RCB-4と通信するためにM5StickCのシリアル端子を利用します。RCB-4とM5StickCをつなぐために回路としてRCB-4変換基板を中継します。
ライブラリは、RCB-4 Library for Arduino ver.1.1を使用しますが、M5StickCのシリアル通信に関する独自の仕様に合わせて一部変更が必要です。変更箇所は、以下の内容で解説します。
■RCB-4変換基板とは
近藤科学のコントロールボードRCB-4(HV/mini)を市販のマイコンボードのシリアル端子(UART)に接続するための変換基板です。Tx、Rxなどの通信線や電源などの回路を用意する手間が省け、接続するだけで簡単にRCB-4の制御が可能となります。
マイコンボードからRCB-4に命令を送ることで、RCB-4に登録されたモーションを再生や各サーボへ個別に角度指定、RCB-4に接続されたセンサの情報取得など、様々な機能を使用することができます。
また、Arduino向けにRCB-4 Library for Arduino ver.1.1を公開していますので、関数を呼び出すだけで簡単に利用することができるようになります。
詳細な解説と下準備は、下記の記事をご参照ください。また、ロボット用コントロールボードRCB-4についても下記の記事で解説しています。
■必要な製品
・ZH接続ケーブル2A(200mm) ×1(RCB-4変換基板に付属)
・ZH接続ケーブルB(200mm) ×1(RCB-4変換基板に付属)
・RCB-4を搭載したロボット(KXRシリーズ、KHR-3HVなど)
※この例では、KXR-L2 Ver.2を使用しています。
※この記事のようにKXR-L2を使用する場合は、姿勢を安定させるためにジャイロセンサKRG-4を搭載してください。また、KRS-3301ではトルクが不足する可能性がありますので、KRS-3302を搭載したVer.2のセット、またはKRS-3304/3304R2の付属するアドバンスセットAがお勧めです。
以下は市販品をご利用ください。
・ユニバーサル基板(10×20程度)
・L字アングルヘッダピン(2.54ピッチ)×8ピン
・ピンヘッダ 4ピン×2セット(RCB-4変換基板に付属)
・ピンヘッダ 3ピン×1セット
・ピンソケット(2.54ピッチ) 4ピン×2セット
・ピンソケット(2.54ピッチ) 3ピン×1セット
・三端子レギュレータ(5V1A)
この記事ではTA4805Sを使用しました。
・はんだ、はんだごて
■基板を作成する
M5StickCとRCB-4変換基板をユニバーサル基板上でつなぎます。各端子をはんだ付けすればよいので非常に簡単です。G26をTX、G36をRXに設定しています。
端子の接続先は下記の通りです。
【ICS変換基板を使用する場合】
上記と同じ配線のまま、M5StickCのGPIO0をICS変換基板のEN_PINと接続することで、ICS変換基板を中継したKRSサーボと通信できるようになります。ICS変換基板とRCB-4変換基板で今回作成する基板を併用できますので、M5StickCからKRSサーボを使用する場合は、予め配線しておくことをお勧めします。
■三端子レギュレータを実装する
M5StickCは、本体内にバッテリを内蔵していますが、容量が多くありませんので動作中に電源が落ちてしまう可能性があります。そこで、ロボットに搭載しているバッテリからM5StickCに給電するように配線します。
M5StickCの”5V←”の端子が外部から電源を給電するための端子です。資料が少なく耐電圧が不明ですので、記載通り5Vを入力します。また、容量に関しましては後々にWi-Fiなど無線通信することを考慮し、余裕をもって1AのTA4805Sを使用しました。
RCB-4変換基板のVOUT端子からレギュレータに配線し、ユニバーサル基板上で電源を給電できるようにします。
※お手持ちの三端子レギュレータの仕様に合わせて配線してください。
出来上がった基板にRCB-4変換基板を接続しました。コンパクトにまとまります。
端子の向きに注意してM5StickCに接続してください。
■KXR-L2に固定、配線
M5StickCをKXR-L2の胸部に固定します。3Dプリンタで固定用の治具を出力しました。下記よりデータをダウンロードできますのでご利用ください。
RCB-4変換基板の青い端子は、シリアル通信用のCOMポートです。ZH接続ケーブルAでRCB-4miniのCOMポートに接続されているZH変換ケーブルに接続します。また、白い端子は電源を給電するための端子ですので、RCB-4miniの空いているSIO端子に接続します。
ケーブルは、KXR-L2の脇を通してバックパックに収納しました。
■切り替えスイッチ
RCB-4変換基板に実装されている「書込」「実行」の切り替えスイッチは、常に「実行」のままにしてください。
以上で準備は完了です。
■プログラム
プログラムは、RCB-4ライブラリを使用します。M5StickCは、シリアル通信の処理が独自にできていますので、ライブラリを一部変更する必要があります。M5stickCとRCB-4の通信を開始し、MotionPlay関数で、RCB-4に登録されているモーションの番号を指定すると、ロボットがモーションを再生します。
※M5StickCを利用するためには、ArduinoIDEに対してボードマネージャ、ライブラリのインストールが必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void rcb4SerialOpen() { //(通信速度、パリティ、受信端子指定、送信端子指定、論理反転指定、タイムアウト) Serial1.begin(BAUDRATE, SERIAL_8E1, RX_PIN, TX_PIN,false,TIMEOUT); //接続されているか確認します。 //データが返ってくるまで待ちます。 while(rcb4.checkAcknowledge() == false) { M5.Lcd.setCursor(0, 0); M5.Lcd.print("ChackFalse"); } delay(100); rcb4.getConfig(); //コンフィグデータを取得し、クラス内部に保存しておきます } |
変更が必要な箇所は、rcb4.open()の関数です。M5StickCのシリアル通信の初期化手順は、Arduinoの仕様と若干異なります。そのため、M5stickC用に別途rcb4SerialOpen関数を用意しました。
1 |
Serial1.begin(BAUDRATE, SERIAL_8E1, RX_PIN, TX_PIN,false,TIMEOUT); |
まず、Serial1.beginで通信設定を引数で渡し、M5StickCとRCB-4のシリアル通信を開始します。引数は、左から「通信速度」、「パリティ」、「受信端子」、「送信端子」、「論理反転」、「タイムアウトの時間指定」です。
それぞれ、グローバル変数としてプログラムの最初に以下の値を指定しています。
1 2 3 4 5 |
const long BAUDRATE = 115200; //通信速度 const int TIMEOUT = 1000; //タイムアウトまでの時間指定 const int TX_PIN = 26; //M5StickCのTXピン指定 const int RX_PIN = 36; //M5StickCのRXピン指定 |
また、RCB-4との通信はパリティを偶数に指定する必要がありますので、SERIAL_8E1を直接記入しています。論理反転は”false”を指定しています。
Serial1.begin以下の処理は、サンプルプログラムのRCB-4と同様です。通信が正常に行えるかを確認し、問題なければ次の処理に移行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <M5StickC.h> #include <Rcb4HardSerialClass.h> const long BAUDRATE = 115200; //通信速度 const int TIMEOUT = 1000; //タイムアウトまでの時間指定 const int TX_PIN = 26; //M5StickCのTXぴん指定 const int RX_PIN = 36; //M5StickCのRXピン指定 Rcb4HardSerialClass rcb4(&Serial1); //RCB4HardSerialClassの定義 void setup() { M5.begin(); //LCD設定 M5.Lcd.setRotation(3); //LCDの表示を横に設定 M5.Lcd.fillScreen(BLACK); //LCDの背景を黒に設定 M5.Lcd.setTextSize(2); //フォントサイズを2に設定 M5.Lcd.setCursor(0, 0); //カーソルを左上に指定 rcb4.configData.word = 0xffff; //ConfigDataは間違えないように0xFFFFで初期化 rcb4SerialOpen(); //RCB-4との通信を開始 //RCB-4との通信が確立したら以下の処理を続行 M5.Lcd.setCursor(0, 0); //カーソルを指定 M5.Lcd.print("COM Open OK!"); //文字を表示 delay(1000); //表示を消す M5.Lcd.setCursor(0, 0); M5.Lcd.print(" "); } |
1 2 3 |
#include <M5StickC.h> #include <Rcb4HardSerialClass.h> |
最初に、M5StickCとRCB-4のライブラリをインクルードします。
1 |
Rcb4HardSerialClass rcb4(&Serial1); //RCB4HardSerialClassの定義 |
通信速度を指定して、rcb4の名称でクラスを生成します。
1 2 3 4 5 6 7 8 |
M5.begin(); //LCD設定 M5.Lcd.setRotation(3); //LCDの表示を横に設定 M5.Lcd.fillScreen(BLACK); //LCDの背景を黒に設定 M5.Lcd.setTextSize(2); //フォントサイズを2に設定 M5.Lcd.setCursor(0, 0); //カーソルを左上に指定 M5.Lcd.print("RCB-4 MotionPlay"); //文字を表示 |
M5StickCの初期化と、実装されているLCDの表示設定です。初期状態では縦置き横書きで表示されますが、M5.Lcd.setRotation(3);とすることで横置き横書きに設定することができます。あとはコメントの通り指定しました。
1 2 3 |
rcb4.configData.word = 0xffff; //ConfigDataは間違えないように0xFFFFで初期化 rcb4SerialOpen(); //RCB-4との通信を開始 |
前述したシリアル通信を開始するための関数を記述しています。M5StickCとRCB-4の通信が問題なければ次の処理に移行します。
以降のsetup内の処理は、LCDに文字を表示したり、表示を削除するプログラムです。コメントを参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
void loop() { while (rcb4.configData.word == 0xffff); //configDataが読み取れてない場合は無限ループ M5.Lcd.setCursor(0, 0); M5.Lcd.println("Motion No.7"); if(rcb4.motionPlay(7) == true) //モーション7を再生 { M5.Lcd.print("Left Step"); delay(8000); //モーションが終了するまで待つ } else //通信失敗時 { M5.Lcd.print("Failure"); delay(1000); } //表示を消す M5.Lcd.setCursor(0, 0); M5.Lcd.println(" "); M5.Lcd.print(" "); M5.Lcd.setCursor(0, 0); M5.Lcd.println("Motion No.8"); if(rcb4.motionPlay(8) == true) //モーション8を再生 { M5.Lcd.print("Right Step"); delay(8000); //モーションが終了するまで待つ } else //通信失敗時 { M5.Lcd.print("Failure"); delay(1000); } //表示を消す M5.Lcd.setCursor(0, 0); M5.Lcd.println(" "); M5.Lcd.print(" "); } |
loop内の処理は基本的にHardSerialのサンプルプログラム「Rcb4MotionPlay」と同じです。サンプルでは、通信の状態をI/OのHigh/Lowで出力していましたが、M5StickCにはLCDがありますのでここに表示するようにしています。
MotionPlay関数の後は、モーションの途中で次の処理に進まないようにdelayで処理を止めています。
MotionPlay関数の使用方法などは下記の記事で詳細に解説しています。
『RCB-4変換基板の使用方法(3) Rcb4MotionPlay編』
サンプルプログラム:M5StickC_RCB4_MotionPlay.zip
モーションを再生するための解説は以上です。
■ジェスチャセンサでモーション指定
M5StickCでは、容易に接続できるセンサ等のモジュールが豊富に存在しています。下記にGroveのジェスチャセンサと組み合わせたプログラムを公開します。ジェスチャセンサは、指の動きを認識することができるセンサです。ジェスチャの判定にモーションを割り当てれば、「あっちむいてほい」のようにロボットに動作指示を出すことができます。
Grove - Gesture Sensor for Arduino
ジェスチャセンサの詳細や、Arduinoのライブラリなどはこちらのサイトをご参照ください。
インクルードしたスケッチ例「paj7620_9gestures」には、センサで取得した情報により条件分岐する方法が載っています。各条件分岐にrcb4.motionPlay()を組み込んでいくことで、指の動きに合わせてモーションを再生できるようになります。
ジェスチャセンサ用のフレームを公開します。KXR-L2の頭部に使用しているダミーサーボと交換することを想定して設計しました。下記からダウンロードしてご利用ください。
M5StickCに実装されているWi-FiやBluetoothを利用して、ロボットと無線通信することも可能です。小型軽量のM5StickCをロボットに搭載することで、ロボットの可能性が拡がります!RCB-4変換基板と組み合わせれば手軽に通信することができますので、ぜひこの記事を参考にお試しください。
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の詳細をみる