見出し画像

【SALZ製作日誌】 2020.04.25 サーボの制御


DOIT ESP32 DEVKIT V1 を用いて、サーボモータの制御を行ってみます。

これがなかなか思うように動いてくれません。

DOIT ESP32 DEVKIT V1を用いて、Aruduino IDE で サーボモータを動かす方法については、ネットの情報で、それほど問題なくたどり着けました。

方法は、下記のとおりです。

1.Arduino IDE の[ツール]-[ライブラリを管理...]を選択します。

画像1

2.「ESP32 servo」で検索しすると、「ESP32Servo」のライブラリが見つかりますので、インストールします。

画像2

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度の位置を行ったり来たりします。

画像3

[myServo.write(0);の実行結果]

画像4

[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);
}

いいなと思ったら応援しよう!