fusnail

ロボットやAI技術

Hiwonder製シリアルサーボモータLX-16AをArduinoから動かす

前回の記事の続きからです。今回はArduinoからLX-16Aを動かしていきます。

まずはHiwonderのシリアルサーボを動かすための制御コマンドについての解説です。

 

Hiwonderシリアルサーボプロトコル仕様

Hiwonderのシリアルサーボの通信プロトコルの仕様は下記になります。

drive.google.com

すべての機種について調べたわけではないですが、いくつかのサーボの型式について制御プロトコルの仕様を調べたところ、上記のプロトコル仕様のpdfが添付されていたのでおそらく現時点(2023年11月時点)ではすべてのシリアルサーボが上記プロトコルで制御されているのではと思います。

 

Hiwonderのシリアルサーボの制御プロトコルの仕様は上記ドキュメントを読めば理解できますが、基本的なフォーマットは下記のようになっています。

0x55を2回送信します。

ID number

前回記事の、サーボの設定で行ったサーボのIDです。0x00~0xFDまでとなります。また、0xFEはブロードキャスト用の番号のようです。

Data Length

送信データ長です。基本的に後述のサーボを制御するコマンドの表に記載されているLengthの値を入れれば大丈夫だと思います。

Command

サーボを制御するためのコマンドです。下記表がコマンド一覧です。

pdfのページの都合で途切れていますが、1~36までのコマンドに応じた番号があります。

今回は、サーボモータの駆動のためCommand Valueの値が1であるSERVO_MOVE_TIME_WRITE、サーボの現在角度の読出しのためCommand Valueが28のSERVO_POS_READを使用しています。

 

Parameter

Commandに応じたパラメータを設定します。下記はSERVO_MOVE_TIME_WRITEの場合のパラメータの説明です。

1、2番目のパラメータには目標角度0~240度を0~1000に換算した値を上位、下位の1バイトずつに分割して入れます。

3、4番目のパラメータはおそらく上記の目標角度に到達するための目標時間になります。数字を少なくすると早く目標角度に到達するような指示となるためモータの速度が速くなります。

 

Checksum

チェックサムの計算値です。下記計算に基づき算出します。

 

Arduinoソフトウェア

Hiwonder公式のArduino用のサンプルプロジェクトは下記になります。

drive.google.com

 

ほかのディレクトリにもいくつかArduino用のプロジェクトが存在しているようですが今回はこちらのサンプルコードを使用しました。

 

サンプルコードの中にはサーボの駆動開始や停止、IDの書き換え処理などが含まれていました。今回はサーボの駆動と現在角度の読出を使用しました。

 

サーボの駆動
void LobotSerialServoMove(HardwareSerial &SerialX, uint8_t id, int16_t position, uint16_t time)
{
  byte buf[10];
  if(position < 0)
    position = 0;
  if(position > 1000)
    position = 1000;
  buf[0] = buf[1] = LOBOT_SERVO_FRAME_HEADER;
  buf[2] = id;
  buf[3] = 7;
  buf[4] = LOBOT_SERVO_MOVE_TIME_WRITE;
  buf[5] = GET_LOW_BYTE(position);
  buf[6] = GET_HIGH_BYTE(position);
  buf[7] = GET_LOW_BYTE(time);
  buf[8] = GET_HIGH_BYTE(time);
  buf[9] = LobotCheckSum(buf);
  SerialX.write(buf, 10);
}

 

現在角度読出し
int LobotSerialServoReadPosition(HardwareSerial &SerialX, uint8_t id)
{
  int count = 10000;
  int ret;
  byte buf[6];

  buf[0] = buf[1] = LOBOT_SERVO_FRAME_HEADER;
  buf[2] = id;
  buf[3] = 3;
  buf[4] = LOBOT_SERVO_POS_READ;
  buf[5] = LobotCheckSum(buf);

#ifdef LOBOT_DEBUG
  Serial.println("LOBOT SERVO Pos READ");
  int debug_value_i = 0;
  for (debug_value_i = 0; debug_value_i < buf[3] + 3; debug_value_i++)
  {
    Serial.print(buf[debug_value_i], HEX);
    Serial.print(":");
  }
  Serial.println(" ");
#endif

  while (SerialX.available())
    SerialX.read();

  SerialX.write(buf, 6);
  delay(2);   // 追記部分

  while (!SerialX.available()) {
    count -= 1;
    if (count < 0)
      return -2048;
  }

  if (LobotSerialServoReceiveHandle(SerialX, buf) > 0)
    ret = (int16_t)BYTE_TO_HW(buf[2], buf[1]);
  else
    ret = -2048;

#ifdef LOBOT_DEBUG
  Serial.println(ret);
#endif
  return ret;
}

コメントで追記部分と書いてある部分のみ追加で記述しました。マイコンの処理速度にもよりますが、シリアルを送ってから即受信待ちを行っても通信の相手方(今回だとシリアルサーボモータ内のマイコン)の返信処理が終わらないとそもそもマイコン側の受信バッファにデータが送られてこないので、受信待ちのループの前に待ち時間として多少のディレイを入れています。こちらは環境に合わせて調整の必要があります。

 

Arduinoマイコンに上記ソフトを実装し、サーボが動いて現在角度が取得できているところまで動作確認できています。

 

なお、現在逆関節ロボの上半身用に小型のHX-06Lを購入し届くのを待っているので、到着して動かしたらまた記事にしようと思います。

 

Hiwonder製シリアルサーボモータLX-16Aの使い方

この記事ではサーボモータのLX-16Aについて解説していきます。

 

サーボの仕様など

このサーボはHiwonderという、おそらく中国のメーカーが出しているコマンド式シリアルサーボです。

www.hiwonder.com

このサーボを購入したのは確か2020年ごろだったと思います。当時はこのLX-16AとLX-15Dの二種類がリリースされており、両方購入して試しに動かしてみました。

Hiwonder LX-16A Full Metal Gear Serial Bus Servo with Real-Time Feedback Function for RC Robot( Control Angle 240)www.hiwonder.com

Hiwonder LX-15D Intelligent Serial Bus Servo with RGB Indicator for Displaying Robot Statuswww.hiwonder.com

 

今はシリアルサーボもかなり種類が増えているようです。

Bus Servowww.hiwonder.com

 

webページからの引用ですがスペックは下記のとおりです。

 

値段はAliexpressで2000円ぐらいと、この出力トルクでシリアルサーボとしてはかなり安いのではと思います。

(値段なりの理由は色々ありますが…)

最近はスイッチサイエンスでも取り扱いが始まったみたいです。

www.switch-science.com

 

 

サーボの動かし方(ハードウェア準備)

こちらの記事に、M5StickCからHiwonderのシリアルサーボを動かす方法が記載されています。

mag.switch-science.com

 

コマンド式のシリアルサーボは、PWMサーボと違い上位の制御システムからサーボを動かしたりサーボの現在値を読み取るコマンドを送受信する必要があります。

接続は三線TTLで、電源、GND、通信線を接続します。

 

サーボからのデータを読み取る必要がない場合、ArduinoなどのマイコンのシリアルのTX端子をサーボの三線内の通信ライン(下の図のSIG端子)に接続することでサーボを動かすことができるようです。

現在角度の読み取りなどのサーボからのデータの受信も必要な場合、データ線は1本しか接続されておらず、半二重通信を行わなければなりません。

そのため、下記のような回路を別途用意する必要があります。

ロジックICなどの電子部品を買い揃えて自前で回路を組んでも良いのですが、面倒な場合は下記のような開発用のインターフェース基板を購入することで手間を省くことも可能です。

HiWonder シリアルバスサーボコントローラ/テスターwww.switch-science.com

Hiwonder TTL / USB Debugging Boardwww.hiwonder.com

 

LX-16A購入の際にTTL/USB Debugging Boardも購入し、動作確認を行いました。

基本的には、上にリンクを張ったこちらの記事通りにやれば最低限動かすことができます。

 

サーボの動かし方(ソフトウェア設定・動作確認)

drive.google.com

こちらのgoogleドライブにHiwonderのシリアルサーボの型式一覧がありますので、使用する型式名以下のファイルを一式ダウンロードします。(ほしいファイルが決まっている場合はそれだけ選んでダウンロードしても大丈夫です。)

今回はLX-16A直下のファイルを一式ダウンロードしました。

デバッグ用のソフトは何種類かあるようですが、今回はBus Servo Terminalというソフトを使用しました。

下の図がソフトを立ち上げた画像です。

ハードウェアの配線類の接続が済んで、サーボと基板に電源を投入した状態でウィンドウ左側のCOMポートとボーレートを選択し、Open portをクリックするとデバッグ基板およびサーボとソフトウェアが接続されます。

正しく接続され、接続先のサーボIDも正しければ、上の図のようにサーボに供給されている電圧、サーボの現在位置、サーボの温度の各現在値の表示が更新されます。(上の図ではポジションは現在値を読み取れていますが実際のサーボ位置が0なので0のままです。)

ちなみにこのサーボは角度換算が必要です。サーボ出力軸の回転角度0~240度が上図のPositionの0~1000の数値になりますので換算して動かしたり角度を読む必要があります。

上記はこちらのドキュメントに記載されています。

 

Positionのスライダを動かすと自動的にサーボのトルクが入り、指示した位置にサーボが動きます。

 

ソフトウェアのタブをParametersに切り替えると下記画面になります。

こちらの画面では、サーボのIDや角度リミットなどを設定できます。数値を変更し、Applyを押すとサーボ側の設定を変更できます。このパラメータはサーボの電源を落としても保持されます。

Angleの項目では角度リミットが設定できます。上側のスライダで大きいほうの、下側のスライダで小さいほうの角度リミットを設定できます。ここでの数値も、上記の角度換算が必要ですので注意してください。(0~240度が0~1000の数値)

 

 

一通りサーボの動作確認や設定が終わったら、制御ソフトから動かします。次回はArduinoからLX-16Aを動かす方法について書こうと思います。

 

記事内で不明点などありましたらお気軽にコメントでご質問ください。

 

 

 

 

逆関節二脚ロボットの脚部構造について解説

この記事ではこの逆関節二脚ロボットの脚構造を解説していきます。


この脚構造は、片足3軸のサーボモータとリンク機構を使って歩行を実現しています。

そもそもなぜこんな機構になっているかというと、元々なるべく少ないモータ数で二足歩行するロボットを作れないか、というのをアイディアレベルで時々考えていました。

あるタイミングで本格的に設計を考え始めて絵を描いたり機構試作を行なった結果、最低限3軸サーボがあればあとはリンク機構を組み合わせることで形にできそう、と思い至り、現在の設計に落ち着きました。

 

本当は左右の脚で共通に使うモータ軸を用意することでもっとサーボモータの数を省略できそうな案もありました。

しかし、歩行中の旋回動作をさせるためなど、左右の脚の動きは独立させたかったので一旦片足の最低限の自由度となる三軸のサーボモータを使用する形に落ち着きました。

 

モータの動きと足先の動き

ここからは機能を分かりやすくするために脚の上下+前後の動き(ロボットを真横から見た時の平面の動き)と左右の重心移動の動きを分けて説明します。



上下と前後の動き

ピッチ軸(上下+前後に動く軸)はロボット横から見た場合の平面上で平行リンクを組めば作れそうだったので割とスムーズに設計が進みました。

上の図の上下二段に重ねたサーボの動きを組み合わせることで足先の上下と前後移動の動きを作り出しています。

まず下側のサーボは平行リンクの上側、大腿部の動きを制御しています。

下側のサーボを駆動すると下図のように大腿部が動きます。

 

次に上側のサーボは、リンクのつながりがちょっと複雑ですが、膝下の脛の動きを制御しています。

このとき、太腿部分が平行リンクになっているおかげで、膝部分のブロックが腰の面と足裏の面に平行に動きます。

そのため、膝に直接サーボを配置したときに比べ半分の動きで脛部分を動かすことができます。

 

下側のサーボの出力軸部分は、二つのリンクが重なってついています。

このうち一つはサーボモータの出力を取り出すためサーボホーンに繋がっている軸です。

もう一つの軸は、平行リンクを形成するために軸の位置だけを保持している軸で、下図のように軸位置を支える部品がついていますが、サーボの出力軸とは繋がっていません。

イメージはヘリコプターの二重反転ロータの機構のような感じかと思います。

 

左右の動き

ロール軸(左右に傾く軸)の設計は、紆余曲折ありました。

モータ自体は股関節に配置され、股関節を軸に脚全体を左右に動かします。

そしてロボットとして歩行するためには、股関節の回転に合わせて、足裏を腰の平面に対して平行に動かす必要があります。

そのため、足首部分にももう一つ関節軸が必要になります。

この足首の回転の動きを股関節のサーボモータからどのように伝達するかについて、かなり検討しました。

何が難しいかというと、前述したピッチ軸の動きはあくまで平面上の動きなので平行リンクをうまく使えば良いのですが、股関節と足首の左右の動きに関しては、脚全体が前後と上下に動くため、平面的な平行リンクの機構では股関節の回転の動きを足首に伝達できません。

最終的に、写真のように立体的なリンクを組むことで対応しました。

このリンクは写真の金色の回転部分がボールジョイントになっているため、膝が曲がって脚全体の姿勢が変わっても股関節の回転の動きを足首に伝達することができます。

このリンク機構の部分は、市販の部品(タミヤのラジコンの部品)を使用しています。

RCカーのステアリング部分などに使用される部品の流用です。

RCカーのステアリングもサーボモータで動かしますが、動かす対象のタイヤのナックル部分はサスペンションの先についているため、車体フレームに固定されているサーボモータとは走行中のタイヤの位置によって(障害物に乗り上げたときなど)立体的に変化します。

そのため、サーボモータの動きはボールジョイントを使用して立体的に変化しても伝達できるような機構になっています。

この機構を応用したのが今回の左右の動きの部分になります。

サーボモータの直交軸配置

股関節のピッチ用サーボモータと直交軸配置とするため、ロール軸のサーボモータは図のような配置になっています。

部品の収まり具合の都合で45度傾けた配置になっています。

また、サーボモータの出力軸は図のような形で脚側と接続しています。

この部分は、股関節のロール軸であり自重負荷が大きくかかる部分なので接続する機構もなるべく剛性が出せるような設計にしています。

しかしパーツ自体が3Dプリンタの出力品でありABS樹脂なので、接続部分の軸が若干弾性変形しています。

ここは軸を金属に置き換えるか、最低でも軸の芯にネジなどを締め込んでさらに剛性を上げる必要がありそうです。

 

逆関節の理由

個人的に逆関節が好き…というのも理由の一つですが、上記のロール軸のリンク機構を採用したことが大きな理由です。

上のロール軸リンクの写真のように、リンク構造とサーボモータを含んだロール軸の機構は結構大掛かりな構造物になります。人間のような膝の構造にするには、ロールの機構を収めるのに

・膝の前面にロール軸機構を置く

・膝裏にロール軸機構を置く

のどちらかの選択になります。

膝の前面にロール軸機構を置く場合、ロボットの見た目的にかなり目立つのと、サーボモータが大きく出っ張ってしまいます。

一方で膝裏に機構を置く場合は、このロール軸機構が邪魔をして膝関節が大きく曲げられなくなってしまいます。上記二つの課題を解決する案として、逆関節構造を採用しました。

逆関節構造とすることで、サーボモータ含め目立ちやすいロール軸機構は目立ちにくいロボット後ろ側へ実装でき、さらに膝の曲げに対しても邪魔をしない構造となります。

 

足先の回転について

ピッチ軸、ロール軸ともに平行リンクで組んでいるため、足裏平面の角度は腰部分の平面と平行になるように動きます。

そのため、段差や傾斜のある地面を歩行させるのは難しいと思います。

ただ、左右の傾きについては、ロール軸リンクに使用しているターンバックルの締め具合を調整することで受動的にですが傾きを調整することが可能です。

 

最後に、試作中の歩行の動画です。ゆっくりですが、足を地面から離して静歩行することができています。

youtube.com

 

以上、逆関節二脚の機構について解説しました。次はサーボについて解説しようかと思っています。

 

逆関節二脚ロボットの概要解説

 



今回は、この前の投稿で写真を載せたロボットの概要を説明します。
全体的に下記のような流れで解説していきます。

 

  1. コンセプトと下半身の機構
  2. サーボモータ
  3. 制御システム
  4. 上半身
  5. 電源
  6. 設計と製作

 

1.コンセプトと下半身の機構

この機体を作っていたのは2020年ごろ(ちょうど流行り病が広がり始めた前後ぐらい)だったと思います。

設計のコンセプトは、出来るだけ少ない関節軸数で歩行できるロボットをつくることでした。
実際、片足3軸、両足6軸のサーボモータのみで、足上げ、足の前後移動、左右の重心移動を行うことができており、メカ的には最低限歩行できる作りになっています。
また、もう一つのコンセプトとして、足先重量をなるべく減らしたいというのがあり、そのため足先にはモータは入っておらず、股関節の動きをリンク機構で伝える作りになっています。この辺のモータの配置やリンク機構の構造については別の記事で詳しく説明する予定です。

 

 

2.サーボモータ

モータにはLX-16Aというシリアルサーボを使用しています。このサーボはAliExpressで色々パーツを見ていた時にたまたま見つけたもので、購入当時はLewansoul、現在はHiwonderという中国のメーカ製のもののようです。
値段の割に出力トルクが大きいうえにシリアルサーボということだったので、カタログスペックが出るかはともかくとりあえず触ってみようということで購入したものをそのまま使いました。
シリアルサーボというのはよくラジコンやホビー用などで用いられるPWMサーボのようにPWM信号で制御するのではなく、シリアル通信で専用のコマンドを送信することで制御します。このLX-16Aというサーボについてもあまり日本語のドキュメントが見つからなかったので別の記事で詳しく解説したいと思います。

 

3.制御システム

サーボに絡んで制御システムについてです。
上記の通りLX-16Aはコマンド式のサーボであるためモータ駆動のための制御コマンドを何らかの方法で送信する必要があります。幸い、このサーボはメーカーからPCとの接続や電源管理、複数サーボのハブになる基板も一緒に提供されているのでこちら型番を使用しました。
これを使うことでPCとUSB経由でシリアル通信できるようになりますので、PC側でロボットの関節角度を指示し、シリアル通信できる環境を用意できればロボットを動かすことができます。
今回はMATLABというソフトウェアを使って上記機能を実装しました。MATLABは元々数値計算用のソフトです。(MATLABについて)ですがシリアル通信の機能など外部の機器とも連携できる機能も備えており、数値計算で出した関節角度を出力するのに比較的簡単に実装できるのではと思い使用しました。

 

4.上半身

上半身は正直なところダミーです(笑)というのは言い過ぎですが、正直なところ下半身の性能や機能を実現させるのがメインだったので、上半身はあまり本格的に作っておらず、複数軸を連動させてモーション動作させるようなところまでは電気的なハードとソフト側が実装しきれていません。関節軸の構成としては肩にピッチとロール、肘にピッチ軸が入っています。また、手先のグリッパにもサーボを入れています。
上半身はLX-16Aではなく小型のPWMサーボを使いました。フレームなどの設計も過去に設計した別のものの設計データを一部流用したりして作っています。
上半身をPWMサーボにしたのは、正直上半身は最初からおまけで考えていて、LX-16Aではオーバースペックなのですがそれより低コストで出力も低いシリアルサーボが設計時点で見つけられなかったのでその辺に転がっていたAliExpressかなんかで購入したPWMサーボをとりあえず取り付けで設計しました。
モーション的な動きはできていないですが、最低限単軸レベルでは一応動作させています。ただ、肩のサーボなんかは明らかにモータの性能不足であまり動きません。上半身は制御システムも含めてまるっと作り直そうと思っています。

 

 

5.電源

電源はリチウムポリマー電池LiPoの2セルです。モータの最大電圧的に2セルが最大許容範囲だったので選定しました。下半身のモータを静歩行させる分には問題なく動いているように見えました。ただ、厳密に電流などを各軸計測したわけではないので、ちゃんと測ったら実は電圧降下していて性能不足だったということはあるかもしれません。
また、後になって気が付いたのですが上半身に使ったPWMサーボが5V仕様だったのでバッテリ電圧がそのままでは使えず、DC-DCコンバータなどを入れて電力変換しなければならず、ちょうど良い部品が見つけられていないのも上半身の作業が止まった要因の一つでした。

 

6.設計と制作

設計はFusion360というCADソフトで行い、ほとんどの部品を3Dプリンタで出力しています。材質はABSです。樹脂部品で高トルクサーボの出力に耐えるよう比較的頑丈に設計しています。特に、腰のロール軸は大きな出力軸負荷がかかるのでサーボの出力で破損しないよう調整しましたが、徐々に遊びが発生しているように感じられるので金属部品の仕様など再度検討が必要かもしれません。また、3年近く放置していたら樹脂部品に劣化している部分が出始めていたので、オーバーホールがてら部品を出力しようと思います。

 

 

 

以上でざっと全体の構成について説明しました。今後は各要素について詳細に解説できればと思います。

 

 

初めての投稿

こんにちは、fusnailの中の人です。この度ブログを開設いたしました。
このブログではロボットや関連する技術について主に書く予定です。
また、最近話題のAIに関しても触れていければと思っています。

 

実はブログは前々から書きたいと思っていたのですが、開設の理由については下記のとおりです。
私自身は仕事として組み込みの開発に始まり、ずっと技術者として走り続けてきました。
また仕事だけでなく私事としてもソフトを書いたり電子工作をしたり…と、いろいろなことに取り組んでいます。
そんなこんなで技術者としての日々が猛(?)スピードで過ぎ去っていき、気が付けば結構な年月が経っていました。
長いようで短い人生のこのタイミングで、過去の経験や知識を備忘録として残したい、という気持ちが高まり、この度ブログ開設に至ったというのが主な理由です。

 

また、このブログは下記のような内容を書いていく予定です。

 

1.過去の経験と知識

私がこれまで公私で関与してきたプロジェクトの一部を振り返り、その中で得た知識や解決した技術的課題について共有します。
(業務上問題ない範囲に限ります。)
技術は日々進歩しており過去のものは陳腐化してしまうものも多いですが、一方で不変的な技術もありますので有用だと思うものについて記載できたらと思います。

 

2.作成したプロジェクトと技術

過去に手掛けたロボットの設計や制御システムについて詳しく紹介します。
また、それらのプロジェクトで使用した部品や技術についても説明します。
参考に、過去に手掛けたロボットの画像です。

ロボ写真

 

3.興味を持っている技術の調査と検討

ロボットは、様々な技術的要素が複雑に絡み合っています。そして新しい技術やトレンドに対する興味は、ロボット開発の世界をさらに探求する動機となっています。
これには、最新のロボティクス技術、人工知能機械学習、そしてそれらがロボット技術とどのように統合されるかについての調査が含まれます。
また、これらの技術が実際のロボット開発プロジェクトにどのように影響を与えるかを検討し、その知見を共有します。

 

4.プロジェクトの進捗と未来の計画

これまでに作成したものの改良と、新しいプロジェクトに向けた準備について定期的に更新する予定です。
今後のプロジェクトで探求したい技術や目標、そしてそれらがロボット技術全体にどのように貢献できるかについての思索も共有できたらと思います。

 

 

通じて、このブログは私の技術的な旅の記録となり、同時に読者の皆様の知見を広げたり見識を深める場ともなることを願っています。
このブログを通じて、皆さんと一緒に学び、成長し、そして新しい可能性を探求していければと思います。
フィードバックやコメントも大歓迎です。今後ともよろしくお願いいたします。