概要
ESP32系ボードでロボット用サーボKRSシリーズをPWMで動かします。
公式リファレンスの26ページに詳細が載っていますが、接続やプログラムの細かいところでハマったので備忘録です。
ICS3.5/3.6ソフトウェアマニュアル:
前提
近藤化学株式会社が販売するロボット用サーボ「KRSシリーズ」では、「ICS」と呼ばれる独自の通信方法でサーボを制御することができます。
サーボの数が多い場合はICSが便利ですが、サーボが1つ2つなどの場合はマイコンから直接繋げたくなったりします。
KRSはPWM入力で制御できる機能も提供してくれていますので、それを使ってみます。
製品ページ :
環境
エディタ | VSCode + PlatformIO |
ボード | ESP32 Dev Module |
サーボ | KRS3301 |
下記はplatformio.iniです。
ESP32でPWMサーボを扱うため、ESP32Servoライブラリを使用します。
platform = espressif32 @ ~4.2.0
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_ldf_mode = deep+
upload_speed = 1500000
lib_deps =
madhephaestus/ESP32Servo@^0.12.0
コード
#include <Arduino.h>
#include <ESP32Servo.h>
// サーボモータのインスタンスを作成
Servo servo1;
// サーボモータのピン設定
const int servoPin1 = 18;
void setup() {
// ピン設定
pinMode(servoPin1, OUTPUT);
// KRSサーボをPWMモードにするための処理
// 各サーボモータにLOWを入力する
digitalWrite(servoPin1, LOW);
// 500ms間待機
delay(500);
// サーボ設定
servo1.setPeriodHertz(240);
servo1.attach(servoPin1, 700, 2300);
servo1.writeMicroseconds(1500);
}
void loop() {
// 1秒ごとに角度を変更する
servo1.writeMicroseconds(1500);
delay(1000);
servo1.writeMicroseconds(2000);
delay(1000);
}
コード解説
#include <Arduino.h>
#include <ESP32Servo.h>
ESP32Servoを使用します。
// ピン設定
pinMode(servoPin1, OUTPUT);
// KRSサーボをPWMモードにするための処理
// 各サーボモータにLOWを入力する
digitalWrite(servoPin1, LOW);
// 500ms間待機
delay(500);
KRSサーボをPWMで使用する場合、電源投入後500ms間は信号線をLOWレベルにする必要があります。
// サーボ設定
servo1.setPeriodHertz(240);
PWMの周波数を240Hzにします。
通常は50Hzにすると思いますが、うまく動きませんでした。
(無限回転モードで1500usにしても停止しない)
servo1.attach(servoPin1, 700, 2300);
servo1.writeMicroseconds(1500);
PWMのパルス幅が700us ~ 2300usと定義されているので、attach関数で指定しておきます。
その後、サーボの初期角度を指定しています。
以上のコードをESP32に書き込んで、出力ピンをサーボの信号線に接続し、プログラムを実行します。
いかがでしたか?
動きましたか?
自分はここでなかなか動かなかったので試したことを載せます。
setup()関数にプルダウン処理を入れる
void setup() {
pinMode(servoPin1, INPUT_PULLDOWN);
delay(1000);
}
起動直後にKRSサーボがPWMモードになっていない気がしたので、setup()関数の頭に出力ピンがプルダウン状態になるような設定を入れてみました。この処理の後にサーボ用の出力ピン設定をしています。
これを入れた後に動きましたが、動いた後はこの記述を消しても動き続けました。
ESP32のピン設定がプルダウンモードになってくれたのでしょうか?
気持ち悪いですが「よくわからんけど動いた」状態ではありますが試したこととして挙げます。
また、電源投入時にサーボ側から信号線がHIGHになるようです。ESP32のsetup()関数の実行よりも早いタイミングで起こっているようなので、サーボの信号線自体をプルダウンさせることも有効かもしれません。
配線を確認
信号線が出力ピンを繋がっているか、正しい配線ができているか確認しましょう。
PWM周波数を変更
servo1.setPeriodHertz(240);
50Hzよりも高速なほうがよく動いてくれました。
デジタルサーボは240Hzが多いらしいのでこの値にしましたが、
上手く動かない場合はこの値を変更してみても良いかもしれません。
適切な電源に接続
KRSサーボはロボット用のサーボですので、7.4Vもしくは11.1Vが動作する適正電圧になっています。
USB電源やマイコン用電源ではうまく動かない場合がありますので、サーボ用の電源を用意して接続してみてください。
おわり
高トルクなサーボモータをPWMで扱えるようになります。
デイジーチェーンや通信速度が必要ない場合はこの方が手軽かもしれませんね。