M5StickC(ESP32)による「ELEGOO Arduino用UNO R3スターターキット」を利用したArduino入門 その7 サーボ

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

前回はチルトスイッチでしたが、今回は「Lesson 9 サーボ」のサーボモーターです。

サーボとは?

秋月さんだと上記の商品が定番です。キットにもこれの互換品が入っていますが、海外から購入すると互換品ばかりなので注意してください。

ちょっとしたテストであれば安いサーボでも問題ありませんが、長期動作を行う場合などは、正規品を購入したほうが安全です。

さて、サーボですが商品によって若干かわりますが、マイコンなどからのパルス信号で動くモーターのことです。中にギアが入っていて、任意の角度まで動かすことができます。

動く範囲は180度のものが多く、このSG90も180度までです。

上記のようなトーテーションサーボなどは360度回転することが可能です。

■主な仕様
・PWMサイクル:20mS
・制御パルス:0.5ms~2.4ms
・制御角:±約90°(180°)
・配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]
・トルク:1.8kgf・cm
・動作速度:0.1秒/60度
・動作電圧:4.8V(~5V)
・温度範囲:0℃~55℃
・外形寸法:22.2x11.8x31mm
・重量:9g

上記がサーボの仕様ですが、選ぶときに重要なのがサイズとトルクです。サイズはさておき、トルクが回転するときの力の大きさになります。トルクが大きいサーボの方が安定して回転することができますし、物を動かすときの力も強くなります。

海外の安いサーボに関しては、トルクが非常に弱かったり、すぐにお壊れやすいものが多いみたいです。

さて、動作電圧を見ると4.8Vからのサーボが多いと思います。ESP32は3.3Vで動いているので、ちょっとなりなそうです。ただ秋月さんのデータシートをみると、3.3Vから6Vで動作すると書いてありました。

制御方法

上記がデータシートの制御例です。50HzのPWMを利用し、パルスのサイズを変更することで角度を指定します。

50Hzですので、1サイクルは20ミリ秒になります。-90度の場合には0.5ミリ秒、+90度の場合には2.4ミリ秒のPWMを出力すればよいことになります。

接続方法(直結)

サーボは3本端子があります。黒はGND、赤が電源、黄色が信号線になります。今回は黒をGND、赤を5V、黄色をGPIO26に接続したいと思います。

ちなみに電源の赤を3.3Vに接続してみましたが動作しました。ただし電源電圧が低いとトルクが減ったり、動きがおかしくなる可能性があるので注意してください。

スケッチ例(ライブラリ無し)

// パラメーター
int pmin = ((0.5 / 20) * 1024) + 0.5; // (0.5ms/20ms)*1024 + 0.5(四捨五入) = 26 (-90°)
int pmax = ((2.4 / 20) * 1024) + 0.5; // (2.4ms/20ms)*1024 + 0.5(四捨五入) = 123 (+90°)
int pd = 1;
int p = pmin;
void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.printf("pmin = %d\n", pmin);
  Serial.printf("pmax = %d\n", pmax);
  // PWM0chに50Hzで10ビット(0-1024)のPWM
  ledcSetup(0, 50, 10);
  // PWM0chにGPIO26を設定
  ledcAttachPin(26, 0);
}
void loop() {
  // PWM出力
  ledcWrite(0, p);
  Serial.printf("p = %d\n", p);
  // 値変更
  p += pd;
  if (p > pmax) {
    p = pmax;
    pd = -pd;
  } else if (pmin > p) {
    p = pmin;
    pd = -pd;
  }
  // Wait
  delay(50);
}

サーボはPWMを使うことで角度の制御をすることが可能です。上記スケッチは、自分でPWMを呼び出した場合の例です。

PWMを10ビットで呼び出しているので0から1024までの1025段階で指定できます。

割合を計算すると-90度は26、+90度は123になりました。これで動かしてみると、-90度から+90度までゆっくり動くのが確認できると思います。

しかしながら、私のサーボは180度ではなく170度ぐらいの浅い角度しか動きませんでした。この手のことはよくあり、pminとpmaxを幅を少し調整して、そのサーボでピッタリ180度になるように調整が必要になる場合があります。

ただし、調整すると利用できる角度を超えて壊れたりするので、なるべく定格の範囲で利用したほうが安全です。また、安いサーボだとプルプル震えたりもしてしまいます。

スケッチ例2(ライブラリ利用)

#include <ESP32Servo.h>
Servo servo1;
int pmin = 500;
int pmax = 2400;
int p = 0;
int pd = 2;
void setup() {
  servo1.setPeriodHertz(50);  // 50Hz
  servo1.attach(26, pmin, pmax);
}
void loop() {
  // PWM出力
  servo1.write(p);
  Serial.printf("p = %d\n", p);
  // 値変更
  p += pd;
  if (p > pmax) {
    p = pmax;
    pd = -pd;
  } else if (pmin > p) {
    p = pmin;
    pd = -pd;
  }
  // Wait
  delay(10);
}

ESP32Servoというライブラリを利用した例です。データシートの数値をそのまま指定して、角度がそのまま設定可能です。

ライブラリは使っても使わなくてもどちらでもよいと思います。使いやすい方法で試してもらいたいと思います。

サーボドライバ

数個のサーボであれば本体直結もありますが、複数のサーボを使う場合には上記のようなサーボドライバを利用することが多いです。

とくにM5StickCの場合にはGPIOの数が少ないので、最大でも4個しかPWM出力が使えません。このようなドライバを使うことで2個のGPIOを接続するだけで、複数のサーボモータを制御することができるようになります。

サーボHAT

M5StickCの場合には上記のサーボHATもあります。内容的には同じ用にI2Cを使って、8個までのサーボを制御することが可能です。また、モーターを駆動するときにはバッテリー消費が激しいので、このHATでは専用のバッテリーを搭載しています。

まとめ

サーボを使えるようになると、動きを表現することができるようになります。モーターは他にもいろいろな種類がありますが、一番扱いやすいのがサーボだと思います。

続編

コメント