【SALZ製作日誌】 2020.04.25 サーボの制御
DOIT ESP32 DEVKIT V1 を用いて、サーボモータの制御を行ってみます。
これがなかなか思うように動いてくれません。
DOIT ESP32 DEVKIT V1を用いて、Aruduino IDE で サーボモータを動かす方法については、ネットの情報で、それほど問題なくたどり着けました。
方法は、下記のとおりです。
1.Arduino IDE の[ツール]-[ライブラリを管理...]を選択します。
2.「ESP32 servo」で検索しすると、「ESP32Servo」のライブラリが見つかりますので、インストールします。
3.プログラム内で、「Servo.h」を取り込み下記のプログラムを書き込みます。
#include <Servo.h>
Servo myServo;
void init() {
myServo.attach(gpioNo);
myServo.write(0);
delay(3000);
}
void loop() {
myServo.write(180);
delay(3000);
myServo.write(0);
delay(3000);
}
gpioNoのマッチングは前回のテストでようやく判明したので、スムーズに行けました。
サーボモーターに電流が流れ、動き出しました。
0度へ回転し、3秒待って、180度へ回転、3秒待ちます。
のはずなのですが、サーボモータの先につけたサーボホーンの示す角度が迷走します。
0度はきちんと指し示せていると思うのですが、180度がどうも怪しくて、位置が決まらないのか、何度か30度~180度の位置を行ったり来たりします。
[myServo.write(0);の実行結果]
[myServo.write(180);の実行結果、行き来して結局150度ぐらいの位置で止まる。]
そして、これがどうも安定していなくて、装置の電源をON/OFFしている間に、動作が安定するものの、また、しばらく置くと、迷走を始めてしまいます。
私の本業であるソフトウェアの世界でもそうですが、境界条件付近の挙動は怪しいものです。
そもそも、サーボも180度ぴったり回転する必要もないので、10度~170度の回転に書き換えました。
この書き換えによって、動作は安定しました。
#include <Servo.h>
Servo myServo;
void init() {
myServo.attach(gpioNo);
myServo.write(10);
delay(3000);
}
void loop() {
myServo.write(170);
delay(3000);
myServo.write(10);
delay(3000);
}
次に気になったのは、サーボモーターのジリジリ音です。
サーボモータに通電していると、ジリジリ音がしています。
短時間動作させるラジコンの場合は、作動中のジリジリ音は問題とならないかもしれませんが、長時間使用するSALZの場合、動作しないときは切っておきたいです。
このためプログラムは次のように書き換えました。
#include <Servo.h>
Servo myServo;
void init() {
}
void loop() {
myServo.attach(gpioNo);
myServo.write(170);
delay(3000);
myServo.detach();
delay(3000);
myServo.attach(gpioNo);
myServo.write(10);
delay(3000);
myServo.detach();
delay(3000);
}