知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

サーボモーターとESP32の話

最近、ホビー向けのサーボモーターで一番有名だと思われるTowerProのSG-90がどこも在庫切れで入手困難な状況となっているみたいなんです。

 

そこで、SG-90の代替えとなるサーボモーターを秋月電子で探してみました。

FEETECHというメーカーのFS90とFT90BがSG-90より安い価格で販売されていたので、この2つを購入しました。

 

3つのサーボモーターの外観はこんな感じです。

SG-90はラベルではSG90なんですよね。

また、なぜかFS90のブランド名がFEETECHではなくFITECになっていて、しかもSG-90と似た感じのラベルになっています。

SG-90の代替えを狙っているようなこのラベル...。

 

まぁ、この3つのサーボモーターの動作を見てください。

わかりました?

SG-90の代わりに使うなら、FS90ではなくFT90Bなんです。しかも代わりというよりFT90Bの方がSG-90より安いし動作も仕様通りで完璧です。

 

サーボモーターとは

サーボモーターは制御パルスの幅で回転を制御するモーターです。

秋月電子のSG-90の製品ページを見ると、主な仕様項目に「制御パルス」が書いてあります。

「制御パルス」の具体的なイメージは、ページに添付されている「SG-90 PDFデータシート」の説明図を見るとわかります。

「Duty Cycle」と書いてある部分が「制御パルスの幅」です。

SG-90の場合は、500μs(0.5ms)の制御パルスが与えられると0度(-90度)の位置に回転し、2400μs(2.4ms)の制御パルスが与えられると180度(90度)の位置に回転する仕様となっています。

なぜ「仕様となっている」と書いているかはビデオを見ればわかりますよね?

 

なぜFS90とFT90Bの動作が違うのか

なんと、FS90とFT90Bは根本的な制御方式が「アナログ」か「デジタル」で違っていました。

 

FS90のスペックシートの抜粋

FT90Bのスペックシートの抜粋

 

ビデオでの動作の違いは、この制御方式の差が影響しているものと思われます。

他のサーボモーターでもアナログ方式のものがあるようなので要注意かも知れません。

 

動作検証用の回路とプログラム

マイコンにはESP32を搭載したATOM Liteを使いました。

サーボモーターの回路は単純に電源と制御信号ピンを繋いでいるだけです。

サーボボーターは全て5Vで動かしています。

プログラムを書き込むときは、ATOM Liteをブレッドボードから外して書き込んでいて、サーボモーターの動作時はUSB ACアダプタを電源に使用しています。

(PCのUSBポートの電流では3つのサーボモーターを動かせません)

 

サーボモータのライブラリには「ESP32Servo」を使用しました。

ソースコード

#include <ESP32Servo.h>         // サーボモーターのライブラリ

// サーボモーターのピン設定
//#define SG90_PIN    22
//#define FT90B_PIN   19
//#define FS90_PIN    23

// SG-90
#define SG90_MIN    500         // 最小パルスの仕様値(us)
//#define SG90_MIN    680         // 最小パルスの修正値(us)
#define SG90_MAX    2400        // 最大パルスの仕様値(us)

// FT90B
#define FT90B_MIN   500         // 最小パルスの仕様値(us)
#define FT90B_MAX   2500        // 最大パルスの仕様値(us)

// FT90B
#define FS90_MIN    500         // 最小パルスの仕様値(us)
#define FS90_MAX    2500        // 最大パルスの仕様値(us)
//#define FS90_MAX    2480        // 最大パルスの修正値(us)

Servo sg90;
Servo ft90b;
Servo fs90;

void setup() {
  // サーボモーターの割り当て (ピン, 最小パルス, 最大パルス)
  sg90.attach(SG90_PIN, SG90_MIN, SG90_MAX);
  ft90b.attach(FT90B_PIN, FT90B_MIN, FT90B_MAX);
  fs90.attach(FS90_PIN, FS90_MIN, FS90_MAX);
}

void loop() {
  // 0度に回転
  sg90.write(0);
  ft90b.write(0);
  fs90.write(0);
  delay(3000);

  // 90度に回転
  sg90.write(90);
  ft90b.write(90);
  fs90.write(90);
  delay(3000);

  // 180度に回転
  sg90.write(180);
  ft90b.write(180);
  fs90.write(180);
  delay(3000);
}

 

ESP32C3の注意点

最近いろんなものが値上がりしてしまって、確か当初は1,000円以下で買えたATOM Liteが1,600円もするので、1,000円以下で買えるXIAO ESP32C3がとても魅力的になっています。

 

しかし、同じESP32という名前がついているのですが、内部アーキテクチャが違っているため無印ESP32と違っている部分があります。

 

ESP32Servoライブラリでしか試していませんが、無印ESP32だとサーボモーターを16個まで制御でき、どのピンでも割り当てることができるのです。

しかし、ESP32C3ではGPIO 2, 4, 5, 21でしか使うことができず、同時に制御できる個数がたったの2つでした。

 

まぁ、個人的には問題のない制限なのですが、知っていないとかなりハマることになりかねないと思いました。