【7限目】サーボの動かし方を理解しよう

前回はモーターの動かし方について学びました。

あわせて読みたい
【6限目】モーターの動かし方を理解しよう 前回はモーターの動かし方を学びました。 https://kaneshige.org/%e3%81%93%e3%81%a9%e3%82%82%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e6%95...

今回はサーボの動かし方について学びましょう。

目次

サーボについて

サーボは、DCモーター、トルクを発生させるための減速ギアセット、センサー、制御回路基板から構成されるコンパクトなパッケージです。ほとんどのサーボは、「ホーン」を介して180度の可動範囲しかありません。サーボは、単純なDCモーター単体よりも高いトルクを出力でき、模型自動車、模型飛行機、ロボットなどの動きを制御するために広く使用されています。サーボには3本のリード線があり、通常はオスまたはメスの3ピンコネクタで終端します。2本のリード線は電力供給用で、正(2-VCC、赤線)、負(3-GND、茶線)、そして信号線(1-Signal、オレンジ線)です。これは、キットに付属のサーボと同じ構成です。

サーボを駆動するために、特定範囲のデューティ比を持つ50HzのPWM信号を使用します。 PWMの単一サイクルにおけるハイレベル状態の持続時間0.5ms~2.5msは、サーボ角度0度~180度にそれぞれ対応しています。以下に対応値の一部を示します:

ハイレベルの持続時間サーボ角度
0.5ms0度
1ms45度
1.5ms90度
2ms135度
2.5ms180度

本家freenoveのテキストでは、1.5ms、2msの箇所に誤りがあるので注意してください。

上記の通り、本来サーボを動かす時はPWMでコントロールしますが、教室で使用するキットではfreenoveさんの便利ツールで制御していきます。ソースコードを見ながら確認していきましょう。

教室で使用するキットは、顔の向きを動かすのにサーボを使用しています。

ソースコード

/**********************************************************************
  Product     : Freenove 4WD Car for ESP32
  Description : use servo.
  Auther      : www.freenove.com
  Modification: 2020/12/18
**********************************************************************/
#include "Freenove_4WD_Car_For_ESP32.h"

void setup()
{
  PCA9685_Setup();       //Initializes the chip that controls the motor
  Servo_1_Angle(90);//Set servo 1 Angle
  Servo_2_Angle(90);//Set servo 2 Angle
  delay(1000);
}

void loop()
{
  // Servo 1 motion path; 90°- 0°- 180°- 90°
  Servo_Sweep(1, 90, 0);
  Servo_Sweep(1, 0, 180);
  Servo_Sweep(1, 180, 90);

  // Servo 2 motion path; 90°- 150°- 90°
  Servo_Sweep(2, 90, 150);
  Servo_Sweep(2, 150, 90);
}

モーターの時と同じ様に、部分的にコメントアウトしながら、それぞれ動作を確認してみましょう。

9~15行目は最初の一回だけ動く部分ですね。ここに初期化処理等を書きます。
17~27行目が繰り返し処理されます。メインループと呼んだりしますが、メインの処理です。

初期化処理

setup()の中身を見ていきましょう。
11行目ではPCA9685チップの初期化をしています。ここは今はあまり難しく考える必要はないです。書いておかないといけないものと言う程度で進めましょう。(ここを攻略すると、もっと自由に制御できるようになります!)
12・13行目は顔の向きを上下左右共に正面に向くようにしています。指定している値は角度ですね。ここが本来のサーボの動かし方ではなく、freenoveさんの便利ツールを使用している箇所になります。
14行目は1秒待つ処理ですね。

メインループ

loop()の中身を見ていきましょう。
20行目では12行目の時と命令が少し変わっています。Sweepは直訳すると『掃く』といったところでしょうか。イメージ的にはワイパーのように『弧を描く』というニュアンスを含んでいる様に思います。ここでは『首振り』と捉えておくと良いかと思います。前置きが長くなりましたが、Servo_Sweep()関数では3つの値を指定しています。1つ目はサーボの番号。2つ目は首振りの初期値、3つ目は首振りの終了値です。12行目のときは指定した角度に瞬時に移動させますが、sweepの動作は初期値の角度から終了値の角度までゆっくりと動かします。その点が違いです。今の角度と初期値にずれがあると、初期値まで瞬時に移動します。
サーボ1は左右方向です。90度(正面)から0度(右向き)まで動かして、0度から180度(左向き)まで動かして、180度から90度(正面)に戻ってきます。
続いてサーボ2は上下方向です。90度(正面)から150度(上向き)まで動かして、150度から90度(正面)に戻ってきます。

応用してみよう

動作が理解できたら、今度は動作を変えてみましょう。
例えば、正面から始まって、『左を向いて、上を向いて、上下中央にもどって、右を向いて、上を向いて、上下中央に戻って、左右中央に戻る』という動作に変えてみましょう。
コードの例は以下のとおりです。

/**********************************************************************
  Product     : Freenove 4WD Car for ESP32
  Description : use servo.
  Auther      : www.freenove.com
  Modification: 2020/12/18
**********************************************************************/
#include "Freenove_4WD_Car_For_ESP32.h"

void setup()
{
  PCA9685_Setup();       //Initializes the chip that controls the motor
  Servo_1_Angle(90);//Set servo 1 Angle
  Servo_2_Angle(90);//Set servo 2 Angle
  delay(1000);
}

void loop()
{
  // Servo 1 motion path; 90°- 0°- 180°- 90°
  Servo_Sweep(1, 90, 180);
  Servo_Sweep(2, 90, 150);
  Servo_Sweep(2, 150, 90);
  Servo_Sweep(1, 180, 0);

  // Servo 2 motion path; 90°- 150°- 90°
  Servo_Sweep(2, 90, 150);
  Servo_Sweep(2, 150, 90);
   Servo_Sweep(1, 0, 90); 
}

うまく動作したでしょうか?
次回はブザーについて学びましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次