やや多趣味の人のブログ

人生のアーカイブって言ったらカッコいいね!

XIAO ESP32C6でサーボモータを4つくらい制御する。

読まなくていい前置き。

 お久しぶりです。めっちゃ期間空きましたね、、、、

 この時期、大学生は期末試験に追われるんです。私も理系の大学生の一人ですので、追われていたんです。しかも、期末試験対策を使用とするときに限ってYouTubeやらTwitterやらで忙しくなるんですよね、、、

 まぁ、この話は置いておいてね。本題入りますね。

 あ、大学生も結構長く(というか半分以上終わった)なって、きりも良いので、そのうち某理系大学のことについて書こうと思います。おそらくどこの大学、学科、まで特定されるとは思いますが、まぁいいや。


はじめに

 今まで、XIAOESP32C6の記事を書いてきたんですが、気づいたら追加購入していました。ので、これでサーボモータを制御したお話です。まぁ、C6というかESP32全般で使えるコードですね。


さて、サーボモータのライブラリ、、、???

 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を使うため、この値となりますが、他のサーボモータの場合は適宜変更してください。

SG90データシート


実際の動き

 前述した通り、DCDCで降圧してる都合で色々載ってますが、こんなかんじで制御できました!!

youtu.be


おわりに

 かなり雑な記事ですが、要するに、ESP32でもサーボモータを簡単に制御できるよ、C6でも問題ないよ、というお話でした。

 こんな小さいのにすごいねぇ。。。