こんにちは、ENGかぴです。
ESP32-WROOM-32Eはサーボモーターを操作する標準ライブラリが実装されていません。ESP32用のライブラリを追加しWiFi通信を使ってブラウザーからサーボモーターを操作して動作確認を行いました。ESP32-WROOM-32E開発ボード(秋月電子)を使用しArduino IDEで開発を行います。
サーボモーターはArduinoのスターターキットに付属されていたSG90を使用しています。アクセスポイントにはWZR-HP-G300NH(バッファロー:生産中止)を使用しています。
ESP32-WROOM-32Eで動作確認したことについてリンクをまとめています。
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
ライブラリを追加してサーボモーターを操作する

サーボモーターはパルス波形を与えてモータを動作させるものです。SG90のデータシートによるとPWM Period(キャリア周波数)が20ms(50Hz)の波形でデューティーサイクル(Duty Cycle)が0.5~2.4msになるように調整することで回転角が決まります。
データシートにはOperating speed(動作速度)が0.12s/60 degreeと記載されています。0度から60度回転させる場合はキャリア周波数20msでデューティーサイクルが1.13msであるパルス波形を120ms間出力する必要があります。
データシートのOperating voltage(動作電圧)は3.3V~6Vとなっています。パルス波形の例では4.8V~5Vとなっていますが3.3Vのパルスを与えても動作させることができます。
ESP32シリーズはArduino環境に対応していますがPWM波形の生成方法が異なっているため標準関数でサーボモーターを操作することができません。別途ライブラリを追加する必要があります。
以下はESP32用のサーボモーターのライブラリを追加してサーボモーターの操作を行う手順を説明します。
PR:わからないを放置せず、あなたにあった最低限のスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
ESP32用のライブラリを追加する

ESP32ServoライブラリをArduino IDEで追加します。Arduino IDEのスケッチ欄からライブラリをインクルードを選択するとライブラリを管理の項目が表示されるのでクリックしてライブラリマネージャに遷移します。
ライブラリマネージャの検索欄にesp32servo(大文字小文字の区別はない)を入力すると候補としてServoに関するライブラリが表示されます。「ESP32Servo」を選択してインストールします。
360度回転するサーボの場合は「ESPServo360」ライブラリを選択するのもありですがSG90は180度回転なのでESP32Servoライブラリを選択しています。
ライブラリの準備と初期化
#include <ESP32Servo.h>
Servo sg90; //Servoクラスの型の変数を宣言
void setup() {
sg90.attach(SERVO_PIN,510,2400); //サーボモーターの初期化
}
ライブラリを使用するためESP32Servo.hをインクルードします。サーボモーター専用のクラスの型の変数としてsg90(任意の宣言名でOK)を宣言してオブジェクトを作成します。
attach()関数でサーボモーターの初期化を行います。第1引数にサーボモーターを操作するDO出力のピンを指定します。第2引数にサーボモーターの操作の最小値(usの値)を指定します。第3引数にサーボモーターの操作の最大値(usの値)を指定します。
第2引数と第3引数を指定しない場合はそれぞれ最小値が544・最大値が2400となります。SG90のデータシートではデューティーサイクルが0.5ms~2.4msとなっているので例では第2引数に510・第3引数に2400を指定しています。
PR:スキマ時間で自己啓発!スマホで学べる人気のオンライン資格講座【スタディング】まずは気になる講座を無料で体験しよう!
ライブラリの使用例
#define WAIT_TIM 50 //500msウェイト
void loop() {
switch (move){
case 0: //回転指令
if(timcount == TIME_UP ){
sg90.write(60); //回転角を指定
timcount = WAIT_TIM; //回転角を指定するまでの待機時間
move = 1;
}
break;
case 1:
if(timcount == TIME_UP ){
sg90.write(120); //回転角を指定
timcount = WAIT_TIM;
move = 2;
}
break;
}
サーボモーターの回転角の指定をモード管理で行います。回転角の指定の待機を管理するタイマ(timcount)がタイムアップすると回転角の指定を行いtimcountにウェイトさせる時間を指定します。これを1つのセットとして回転パターンを追加します。
サーボモーターの回転角をwrite()関数で指定します。例では60度(モード0)・120度(モード1)を指定しています。
回転角を指定した後はtimcountにウェイト時間をセットしモードを1に遷移させてタイムアップまで待機します。以降は追加したパターン分同様の処理を行います。
SG90のデータシートによるとOperating speed(動作速度)が0.12s/60 degreeなので60度回転させる場合は120ms以上のウェイトを置く必要があります。例では500msのタイマを置いています。
回転角を指定した後に500ms毎にウェイトを置きましたが、サーボモーターが回転角に達するまでの時間以上であれば任意で調整することができます。
Webサーバーを使用する
#include <WebServer.h>
void setup() {
Wserver.on("/", HTTP_GET, HtmlSet); //URLを指定して処理する関数を指定
Wserver.on("/", HTTP_POST, HtmlPost); //URLを指定して処理する関数を指定
Wserver.onNotFound(handleNotFound); //URLが存在しない場合の関数を指定
Wserver.begin(); //Webサーバーの開始
}
void loop(){
Wserver.handleClient();
}
Webサーバーライブラリの使い方は下記記事まとめています。ここでは要点のみまとめています。
ESP32-WROOM-32EでWebServerを実装する
WebServerライブラリを使用するためWebServer.hをインクルードします。on()関数を使用するとブラウザーで指定したURLで表示するページを分岐させることができます。
on()関数は第1引数にURLアドレスの階層を示す文字、第2引数にHTTPの種類を指定、第3引数に接続要求の処理を行う関数を指定します。
onNotFound()関数はURLが存在しない時に表示する処理を行う関数を指定します。
handleClient()関数でクライアントからのリクエストを常時監視します。クライアントからリクエストがあれば登録したURLに対応する処理が呼び出されます。
void HtmlPost(void){
selRatio = Wserver.arg("selRatio"); //selRatioの値を取得
sel = selRatio.toInt(); //整数に変換
if( sel == 0 ){
rnd1_s = Wserver.arg("rnd1_s");
rnd1 = rnd1_s.toInt();
}
else{
ptn_s = Wserver.arg("ptn_s");
ptn = ptn_s.toInt();
}
}
HtmlPost()は表示したページからデータを取得すると遷移します。Webサーバーからデータを取得するためにarg()関数を使用します。arg()関数の引数はHTMLデータから取得する要素の名前を指定します。
例ではselRatioを取得しています。selRatioはHTMLで設置しているラジオボタンの任意のグループ名でありブラウザー上で変更するとvalue値が更新されます。arg()関数でvalueの値を取得しています。
arg()関数で取得した値はHTMLデータであるため文字列になります。文字列の数値をtoInt()関数で整数値に変換してパターンの切り替えや回転角の指定に使用します。
PR:スキマ時間で自己啓発!スマホで学べる人気のオンライン資格講座【スタディング】まずは気になる講座を無料で体験しよう!
動作確認

サーボモーターの電源は外部の電源からDC5Vを供給しています。サーボモーターのようにモータ系の負荷になると消費電流が大きいためマイコンのDO出力では過負荷になります。外部電源とArduinoのGNDは同一系統にするため接続します。
WiFi通信を使ってブラウザー上でSG90を操作します。スマホなどのブラウザーからWiFiのアクセスポイントに接続します。IPはアクセスポイントとESP32-WROOM-32Eと同じ系列に設定します。
例えばアクセスポイントのIPを「192.168.11.1」に設定した場合はESP32-WROOM-32EのIPを「192.168.11.20」などに固定します。
ESP32-WROOM-32EのIP設定をDHCPによる自動割り付けにしている場合は接続後に自分のIPを把握する必要があるためシリアルモニタに表示するなど工夫が必要です。今回はIPを固定しているので指定したIPで接続するとブラウザー上で表示できます。

項目の任意を選択して回転1~回転3まで任意の回転角を指定することができます。モード選択ではモード1~モード3までのパターンを選択することができます。
モード1は0度(-90度)→90度(0度)→180度(90度)を繰り返します。モード2は45度(-45度)→90度(0度)→135度(45度)を繰り返します。モード3は60度(-20度)→120度(30度)→60度(-20度)を繰り返します。
「通信開始」を押すとパターンを反映してSG90の動作のパターンが変更できます。
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
WiFiのアクセスポイントのSSIDとパスワードは使用しているアクセスポイントに置き換えて下さい。
関連リンク
Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
PR:企業で求められる即戦力技術を身に付ける テックキャンプエンジニア転職
最後まで、読んでいただきありがとうございました。