現時点の情報です。最新情報は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では専用のバッテリーを搭載しています。
まとめ
サーボを使えるようになると、動きを表現することができるようになります。モーターは他にもいろいろな種類がありますが、一番扱いやすいのがサーボだと思います。
コメント