読まなくていい前置き。
お久しぶりです。めっちゃ期間空きましたね、、、、
この時期、大学生は期末試験に追われるんです。私も理系の大学生の一人ですので、追われていたんです。しかも、期末試験対策を使用とするときに限ってYouTubeやらTwitterやらで忙しくなるんですよね、、、
まぁ、この話は置いておいてね。本題入りますね。
あ、大学生も結構長く(というか半分以上終わった)なって、きりも良いので、そのうち某理系大学のことについて書こうと思います。おそらくどこの大学、学科、まで特定されるとは思いますが、まぁいいや。
はじめに
今まで、XIAOESP32C6の記事を書いてきたんですが、気づいたら追加購入していました。ので、これでサーボモータを制御したお話です。まぁ、C6というかESP32全般で使えるコードですね。
無事届いた!危ない危ない。 pic.twitter.com/WCmZSuvEly
— wellS (@Well5SS) 2026年1月10日
さて、サーボモータのライブラリ、、、???
Arduinoでは基本的に、
#include <Servo.h>
という有名なサーボモータを使うためのライブラリがあるんですけど、ESP32ではそのライブラリが使えません。
ですが、代わりに、PWMを出せるLEDC関数というのがあるので、それを使います。
その中でも今回は以下の二種類のみです。
ledcAttach(pin, freq, resolution); ledcWrite(pin, duty);
ledcAttachについて、第一引数ではピン番号、第二引数では周波数(Hz)、第三引数では分解能(bit)となっています。 ledWriteについて、第一引数ではピン番号、第二引数はDuty比となっています。
そこまで複雑ではないですね!!
配線について
表で示します。とりあえず、4つのサーボモータを動かします。
| Esp32 | SG90 |
|---|---|
| D0、D1、D2、D3 | Signal |
| GND | GND |
ただし、サーボの電源は外部から取りました。今回は9V型ボックス電池から取りました(SG90の定格が3.3~6Vなので、DCDCで降圧しています)。
コードについて
そのままコピペ~~~ 動きとしては、4つのサーボモータが0→90→180度に回転するのを繰り返すものです。
const int SERVOMAX = 65536*2.4/20;
const int SERVOMIN = 65536*0.5/20;
int center = (SERVOMAX-SERVOMIN)/2;
void servoMove(int pin, int angle){
ledcAttach(pin, 50, 16);
angle = map(angle, 0, 180, SERVOMIN+5, SERVOMAX-5);
ledcWrite(pin, angle);
}
void reset(){
servoMove(D0, 90);
servoMove(D1, 90);
servoMove(D2, 90);
servoMove(D3, 90);
}
void setup(){
reset();
delay(3000);
}
void loop(){
servoMove(D0, 0);
servoMove(D1, 0);
servoMove(D2, 0);
servoMove(D3, 0);
delay(1000);
servoMove(D0, 90);
servoMove(D1, 90);
servoMove(D2, 90);
servoMove(D3, 90);
delay(1000);
servoMove(D0, 180);
servoMove(D1, 180);
servoMove(D2, 180);
servoMove(D3, 180);
delay(1000);
}
少し解説。
const int SERVOMAX = 65536*2.4/20; const int SERVOMIN = 65536*0.5/20;
これは、2の16乗(ledcAttachの第三引数の分解能に等しい)に対し、サーボモータの可動域の最小、最大値に変換するためです。詳細は下のデータシートにあります。今回、SG90を使うため、この値となりますが、他のサーボモータの場合は適宜変更してください。
実際の動き
前述した通り、DCDCで降圧してる都合で色々載ってますが、こんなかんじで制御できました!!
おわりに
かなり雑な記事ですが、要するに、ESP32でもサーボモータを簡単に制御できるよ、C6でも問題ないよ、というお話でした。
こんな小さいのにすごいねぇ。。。