esp32でKONDOサーボを動かす
ROBO-ONEに出場するにはKONDOサーボを動かす必要があります。
esp32はSerial通信ポートを3つ持っています。UART0,UART1,UART2です。PCとマシンを接続して通信しながらKONDOサーボを動かしたい時があるかもしれないので、UART0は使わないようにします。
私の場合、11.1V系サーボ(KRS2552)と7.4Vサーボ(KRS3204)の2種類を使うので電圧が違うサーボごとにSerialを使い分けるようにしました。KONDOの公式は1つのUARTに接続できるサーボの推奨個数は9個と言っています。3kg級のマシンを作る時はサーボの数が19個を余裕で超えるため、UART0も使う必要がありそうです。四肢でSerialを分けた方が配線的には楽なので本当は4つ欲しいところ。
https://kondo-robot.com/faq/ics_board_-tutorial1
シリアルピン保護のため、ポリスイッチ↓をそれぞれ付けました。冷却されると導電性が戻って再び使用可能になります。
http://akizukidenshi.com/catalog/g/gP-11307/
11.1V系 → UART1
7.4V系 → UART2
KONDOサーボを動かす通信規格をICS(Interactive Communication System)と言い、近藤科学独自のデータ通信規格です。PWMと違って、サーボを数珠つなぎ出来るのが特徴です。KONDO公式のライブラリはTXとRXを交互に切り替えることによってサーボに指令角度を送信するのと同時にサーボの温度や電流を受信できます。
そのTXとRXを切り替えるためのモジュール(ICS変換基板)が市販されている↓のですが、場所をとるので基板に実装しました。
https://kondo-robot.com/product/03121
ICS変換基板の自作についてはPONDAさんの記事↓を参考にしました。そちらの記事に記載されている回路図とほぼ同じですが、私が引いた回路図も載せておきます。使用している部品も購入先もPONDAさんと同じです。
http://robooptions.blog.fc2.com/blog-entry-10.html
-------------------------------------------------------------------------
esp32のUART1は初期状態では内部フラッシュに接続されているため、UARTとしての使用はできません。UART1のピンアサインを変更することで使用可能になります。HardwareSerial.cppにあるTX1とRX1を定義しなおせば良いです。
Visual studio codeでプログラミングをする場合、以下のパスにHardwareSerial.cppがあります。
C:\Users\ユーザー名\.platformio\packages\framework-arduinoespressif32\cores\esp32\HardwareSerial.cpp
-------------------------------------------------------------------------
KONDOサーボは通信速度が3種類から選べます(①)。esp32に書き込むプログラムで設定したBAUDRATEと合っていないとサーボは動きません。
私はプリメイドAIから拝借したサーボを使用したのですが、箱出しの状態では通信速度が115200と1250000が混合?しているのでICSマネージャーで設定し直してください。また、ストレッチやスピード、パンチ等も初期設定とは異なる状態のものが多いので、ICS Serial Managerの「②ファイル→開く→初期値(initial value)」から一括で書き込むと便利です。
-------------------------------------------------------------------------
プログラム
KONDOのライブラリは初期状態ではUARTが1つしか動かせないので、以下のように2つで動かせるようにします。BAUDRATEとTIMEOUTの設定は1つで良いです。ライブラリの説明書19Pにも同様の記述があります。
-------------------------------------------------------------------------
HeartToHeart4やRobovie-MakerなどのGUIなソフトウェアは使わず、サーボIDや指令角度を手打ちしてモーション作成を行います。以下↓は「ID1のサーボを0度まで動かす」プログラムです。
IDは0~31、指令角度は3500~11500が有効で、ありえないIDや角度が入力してしまい実行されると、予期しない動きをする可能性があります。
サーボを壊したくないので、範囲外の数値が入力され、実行されるとサーボが脱力するようにライブラリを変更しました。更に、この関数は指令角度を3500~11500で指定する必要があり、直観的に何度なのか分かりづらいため、degreeで指定できるように変更しました。
「IcsBaseClass.h」を以下のように変更し、
「IcsBaseClass.cpp」にある「setPos(byte id, int deg)」を以下のように変更します。
※ posからdegに変換する関数がデフォルトで入っているので、その関数をsetPos()内で呼び出すという方法でも同じことは出来ます。
また、いちいちサーボのIDを調べながらモーション作成するのは時間がかかるため、IDとマシンの部位を関連付けました。
部位の名前はご自身で分かりやすく命名してください。
ご指摘&アドバイスあればお願いします!