B3Mサーボモータを動かそう(Arduino制御編)(改訂版)

Posted on 2023.03.09 in

 

ロボットにB3Mサーボを組み込んだ場合は、マイコンボードから制御できると便利です。これまで弊社サポート記事では、PCからの制御方法をご紹介してきましたが、今回は、RS-485変換基板を経由し、Arduino Nano EveryからB3Mサーボを制御する方法をご紹介します。

 

この記事では、シリアル通信に『ICS Library for Arduino ver.2』の一部の関数を利用して通信します。下記のライブラリをダウンロードし、付属のマニュアルに従いインクルードしてください。

ICS Library for Arduino ver.2

※サーボとの通信に使用するsynchronize関数を使用するためには、Ver.2.1以降のライブラリが必要です。すでにご利用いただいている方は、バージョンのご確認をお願いします。

 

また、B3Mサーボの制御に関しては、B3Mソフトウェアマニュアルをご参照ください。下記の手順は、マニュアルのP.48~52の「6.B3Mサーボを動かしてみる」に従ってプログラムしています。

『B3Mソフトウェアマニュアル Ver.1.2.0.0』

 

※弊社では他社マインボード、及びプログラムに関するお問い合わせついて対応致しかねます。以下の内容は、仕様事例として参考にご一読ください。

 

【関連記事】

  第1回 B3Mサーボモータを動かそう(準備編(1))(改訂版)

  第2回 B3Mサーボモータを動かそう(準備編(2))

  第3回 B3Mサーボモータを動かそう(C#下準備編)

  第4回 B3Mサーボモータを動かそう(C#位置制御編)

  第6回 B3Mサーボモータを動かそう(Python編(1))(改訂版)

 

■必要な製品

Arduino Nano Every

B3Mサーボ
  この記事の内容は全機種に対応しています(2020年4月現在)

RS-485変換基板

HC-6P/XH変換ケーブル(200mm)

RS-485 USBアダプターHS

XH接続ケーブル(サーボに付属)

HV電源スイッチハーネス(弊社の電源を使用する場合)

ジャンパピン(オス-メス)

ブレッドボード

※Arduino Nano EveryとRS-485変換基板にはんだ付けが必要です。

 

■サーボ<=>ボード間の通信方法

B3MサーボとArduinoの通信には、RS-485変換基板を中継機器としてを使用します。この基板は、B3Mサーボの通信仕様であるRS485をUARTに変換する機能が備わっています。

また、B3MサーボとPCの通信はRS-485 USBアダプターHSを使用します。マネージャソフトを使用し、Arduinoに合わせて通信速度を書き換えます。

 

■通信速度の変更

Everyのシリアル通信速度は最⼤115200bpsです。B3Mサーボの通信速度は工場出荷時に1.5M(1500000)bpsで設定されていますので、115200bpsに変更する必要があります。

変更方法は、『B3Mサーボモータを動かそう(準備編(1))(改訂版)』からの手順で、『B3Mサーボモータを動かそう(準備編(2))』の「●IDの設定変更について」でIDと同じように通信速度(Baudrate)を設定してください。設定変更後、ROMに書き込み、再起動すれば完了です。

第1回 B3Mサーボモータを動かそう(準備編(1))(改訂版)

第2回 B3Mサーボモータを動かそう(準備編(2))

 

■接続方法

Arduino Nano Everyをブレッドボードに挿し、RS-485変換基板とArduino Nano Everyの各端子を接続します。

 

■プログラム

ICSライブラリ「IcsHardSerialClass」のsynchronize関数を流用し、B3Mサーボと通信します。

KRSサーボはパリティが偶数パリティ(EVEN)で、ICSライブラリもパリティをEVENで設定しています。B3Mはパリティがありませんので変更が必要です。

B3Mの設定を変更する場合はWriteコマンド、角度を指定する場合はPositionコマンドを利用します。『B3Mソフトウェアマニュアル Ver.1.2.0.0』の内容に従い、コマンドを用意し、ICSライブラリのsynchronize関数で通信するだけで、簡単にB3Mを制御することができます。

 

【動作するまでの流れ】

 1.サーボの状態をFreeモードにします。

 2.制御モードを「位置制御モード」に変更します。

 3.制御モードに応じてPIDゲインのプリセットを変更します。

 4.サーボの状態をNomalモードにします。(サーボがトルクONします)

 5.目標値のポジションを指定します。

以下の処理は、位置制御でサーボを動かすプログラムですが、同じ手順でコマンドの内容を変えるだけで位置制御のモード変更、速度制御への切り替えなどができます。詳細は『B3Mソフトウェアマニュアル』をご参照ください。

 

通信環境の設定

B3Mサーボの通信仕様は下記の表のとおりです。この仕様に従い設定していきます。

 

クラスの作成は、通常のKRSサーボと同じように行います。ここは、IcsClassのサンプルプログラム「KrsServo1」から流用しています。Everyと通信するシリアル端子はSerial1ですので、”&Serial”を”&Serial1”に変更してください。

 

ここで、上記で説明したパリティをB3Mサーボ用に再設定する必要があります。B3M.begin()で通信を開始した後にSerial1の通信条件を変更します。

Serial1.begin(115200, SERIAL_8N1);

”115200”は通信速度ですが、その後の”SERIAL_8N1”は通信速度以外の通信設定です。”SERIAL_8N1”を追記することでパリティをなしに設定することができます。

以上で通信するための準備は完了です。

 

Writeコマンドを作成

B3Mの設定変更はWriteコマンドにより行います。この関数の内容はとてもシンプルで、配列にコマンドを用意し、synchronize関数で送信しているだけです。

コマンドについて一つずつ解説します。

※以下の説明は、ソフトウェアマニュアルのP.20により詳細な解説が掲載されています。また、Writeコマンドについては、P.31を参照してください。

 

 

・txCmd[0] = (byte)(0x08); // SIZE

SIZEは、一連のコマンドのバイト数です。今回は8バイトありますので、0x08を格納しています。

 

・txCmd[1] = (byte)(0x04); // CMD

このコマンドが何をするための処理かを指定しています。今回は設定を変更するWriteコマンドですので0x04を指定しています。

ちなみに、txCmd[1]の数値を変更するだけで、コマンドの種類を変更することができます。コマンド体系はコマンドの種類によって若干の違いはありますが、基本的には配列に設定したい数値を入れて送信するだけです。

大まかに解説をしますと、コマンドに沿った大きさの送信用の配列と受信用の配列を準備し、送信用の配列にコマンドを入ます。synchronize関数で送信、受信用の配列を渡すと、synchronize関数内で送受信をおこなってくれます。

B3Mサーボから情報を取得したい場合は、Readコマンドを使用しますが、ここを0x03にすればこのコマンドはReadコマンドになります。設定をROMに保存したい場合は0x02(Save)、ROMの情報を読み出す場合は0x01(Load)です。

コマンドについては、ソフトウェアマニュアルのP.20をご参照ください。

 

・txCmd[2] = (byte)(0x00); // OP

オプションを指定しています。B3Mサーボの状態を返事として何を受け取るかを指定できます。もし通信や制御がうまくいかなかった場合、B3Mがどのようなトラブルを抱えているのかを取得することができます。これは、戻り値としてこの通信コマンド呼び出し元に返しますが、通信が失敗した場合は-1を返します。

オプション、ステータスについては、ソフトウェアマニュアルのP.41をご参照ください。

 

・txCmd[3] = (byte)(id); // ID

制御するサーボのID番号を指定します。

 

・txCmd[4] = (byte)(Data); // DATA

・txCmd[5] = (byte)(Address); // ADR

Writeコマンドで書き込むデータと書き込み先のアドレスを格納します。

B3Mはメモリーマップにより、各機能をアドレスで指定して変更することができます。例えば、今回の位置制御モードへの設定はアドレス0x28にあります。ここに0x02を書き込むことで位置制御モードに設定することが可能です。

他にも機能がたくさんありますので、詳細はソフトウェアマニュアルのP.60をご参照ください。

 

・txCmd[6] = (byte)(0x01); // CNT

通信するサーボの個数を指定します。0x01だと1個でシングルモードになります。2個以上はマルチモードになります。

B3Mサーボは、複数のサーボを同時に制御するためにマルチモードが実装されています。マルチモードでは、一連のコマンドに複数のサーボに対してのコマンドを連結して送信することが可能です。ただし、サーボからの返事は来なくなりますのでご注意ください。

詳細は、ソフトウェアマニュアルのP.18をご参照ください。

 

・txCmd[7] = (byte)(0x00); // 初期化

  for(int i = 0; i < 7; i++)
  {
      txCmd[7] += txCmd[i]; 
  }
  txCmd[7] = (byte)(txCmd[7]); // SUM

チェックサムを計算し、コマンドの最後に送信します。

 

これら一連のコマンドをsynchronize関数で送信し、サーボからの返事を受信することでWriteコマンドを実行することができます。

 

Positionコマンドを作成

B3Mサーボに角度を指定する場合は、Positionコマンドを使用します。基本的な構成は、前述のWriteコマンドと同じです。ここでは、Writeコマンドと異なる内容のみ解説します。また、Positionコマンドの詳細はP.37をご参照ください。

・txCmd[1] = (byte)(0x06); // CMD

Positionコマンドは、0x06により実行することができます。

 

・txCmd[4] = (byte)(Pos & 0xFF); // POS_L
 txCmd[5] = (byte)(Pos >> 8 & 0xFF); // POS_H

上記により動作角度を指定します。B3Mサーボは0x8300~0x7d00により角度を指定できますが、データの大きさが1バイトに収まりません。そこで、上記の方法で2バイトに分けて送ります。

ポジションデータについては、P.39、データの分割についてはP.24をご参照ください。

 

 txCmd[6] = (byte)(Time & 0xFF); // TIME_L
 txCmd[7] = (byte)(Time >> 8 & 0xFF); // TIME_H

指定した角度に対して、サーボがどれくらいの時間で到達するかを指定できます。時間はは0~65535msの範囲で指定できます。なお、時間の指定は起動生成タイプがNormal以外の時に有効です。Normalのときは最速で動きます。

 

B3MサーボにPositionコマンドを送った場合、返事が返ってきます(シングル限定)。返事の中にはステータスの他に現在値も含まれています。今回、B3M_setPos()はオプションデータを返しますが、現在位置を返すことも可能です。

ただし、返事で取得できる現在値は、サーボが動き出す前の位置ですので、動作中の位置、到達したかの確認は「現在位置(0x2C)」をReadコマンドで取得してください。ポジションデータは2バイトですのでご注意ください。「現在位置」については、マニュアルのP.69を参照してください。

 

サーボの初期化手順

ソフトウェアマニュアルP.48~52の「6.B3Mサーボを動かしてみる」に従って順番にコマンドを送信します。上記のコマンドは、最初に一度送信すれば以降は必要ありませんので、setup()内で実行します。

 

サーボが無事に起動できたら、Positionコマンドとして作成したB3M_setPos関数で角度と時間を指定します。

B3Mサーボが左右に動作すれば成功です。

 

 サンプルプログラム<ダウンロード>

 

以上で、基本的な使用方法の解説は終わりです。Writeコマンドで解説した通り、コマンドの各変数内に格納する数値を変更すれば、B3Mサーボの全ての機能を簡単に利用することができます。B3Mサーボは、機能が豊富で高性能なサーボです。この記事を参考にぜひご利用ください。

今回はICSライブラリのsynchronize関数を流用しましたが、独自にライブラリを作ることも可能です。synchronize関数はソースコードを公開していますので参考にして作ってみてください。

 

 

B3M-SB-1040-Aの詳細をみる B3M-SC-1040-Aの詳細をみる B3M-SC-1170-Aの詳細をみる