XIAO ESP32C3を使ってみる その2(analogWrite関数、サーボモーター)

はじめに

 今回はXIAO ESP32C3で、analogWrite関数とサーボモーターの制御を試してみました。

 サーボモーターについては、既存のライブラリが使えませんでした。そこで今回はデータシートを見ながらパルスで制御しています。

▼こちらでも議論されていましたが、提案されていたライブラリだとエラーが出ました。

https://forum.arduino.cc/t/xiao-esp32-c3-pwm-servo-control/1087850

▼販売ページはこちら。ピン配置なども掲載されています。

▼以前の記事はこちら

XIAO ESP32C3を使ってみる その1(バッテリー、Bluetooth)

はじめに  前回の記事はMaker Faire Kyoto 2023での展示のお話でした。今回は展示品に使っていたマイコンであるXIAO ESP32C3のお話です。MakerではiPhoneと無線通信をし…

ピンの注意点

 調べているときに見つけたのですが、XIAO ESP32C3のピンには内部回路で繋がっているところがあります。D6、D8、D9ピンは要注意です。

▼詳しくはこちらに書かれています。

Seeed Studio XIAO ESP32C3のI/O割り付けに注意 - Seeed K.K. エンジニアブログ

Seeed K.K.の松岡です。 最近、Seeed Studio XIAO ESP32C3を使った某プロジェクトの回路を設計しました。基板を作って動かしてみると、なにもしていないのにLEDが点灯する…

▼こちらにどのモードになるかが書かれています。

https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/#strapping-pins

PWM制御を行う

 Arduino系ではPWM出力を行うときにanalogWrite関数を使うのですが、ESP系には無いのでledcWrite関数を使っていました。しかし、XIAO ESP32C3ではanalogWrite関数を使うことができるみたいです。

▼こちらで言及されていました。

https://qiita.com/ginger/items/476012a24c6b30121606

 実際にLEDの明るさを調整するFadeプログラムを試してみました。

▼プログラムもArduinoのFadeをそのまま使いました。ちゃんと動作しています。

Fade | Arduino

サーボモーターを制御する

 今回はSG90を制御します。まずはデータシートを見てみましょう。

▼データシートはこちら

https://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf

 HIGHとLOWの時間間隔で制御しているようです。

  • 0.5msで-90°の位置
  • 1.45msで0°の位置
  • 2.4msで90°の位置
  • 周期は20ms

 digitalWrite()とdelay()あたりの関数で制御できそうですね。実際にプログラムを書いて動かしてみましょう。

delayの注意点

▼パルスで制御するにあたって、以下の記事を参考にしました。

 普段は時間を空けるのにdelay()を使います。単位はmsです。 

 delay()について公式リファレンスを見てみると、引数はunsigned long型になっています。0から4,294,967,295の整数値を取るので、小数が使えません。しかしデータシートを見たときは0.5ms~2.4msでの制御になっていました。

 そこで、msではなくμsの時間間隔で制御するために、delay()ではなくdelayMicroseconds()を使います。

▼delay()に関するページはこちら

https://www.arduino.cc/reference/en/language/functions/time/delay/

▼unsigned long型に関するページはこちら

https://www.arduino.cc/reference/en/language/variables/data-types/unsignedlong/

▼delayMicroseconds()に関するページはこちら

https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/

Arduino Nanoで検証する

 SG90のデータシートを見ていると、Power and Signalが4.8~5Vと書かれていたのですが、ESP32系のピンの電圧は3.3Vです。念のため、5V系のArduino Nanoで動作を確認しておくことにしました。

▼Arduino Nanoであればライブラリも使えます。Servoライブラリのサンプルにある、Sweepでの動作はこんな感じ。

Sweep | Arduino

▼ライブラリを使わない、パルスでの制御プログラムはこちら。for文を使って、Sweepと同じような制御にしています。

▼実際に動かしたときの様子はこちら

XIAO ESP32C3で検証する

 Arduino Nanoで検証したときと違って、シリアルモニタを開くまで回転が遅いということがありました。こちらではシリアル通信の部分を省いています。

 また、動画では9番のピンを使っていたのですが、先述したように内部で繋がっているところがあります。プログラムは10番にしていますが、ちゃんと動作しました。

▼XIAO ESP32C3の場合のプログラムはこちら

▼実際に動かしたときの様子はこちら

▼ちなみに、SG90よりも少しトルクが大きいSG92Rでも同様に制御できました。

最後に

 ライブラリを使わずにサーボモーターを制御することができました。Arduinoでは標準的な関数しか使っていないので、他のボードでも使えそうです。

 Arduino Nanoの場合と比べて、XIAO ESP32C3の場合は回転が遅いのが気になっています。Signalの電圧は、やはり4.8~5Vのほうがいいのかもしれません。

 analogWrite関数が使えるのは個人的に意外でした。ledcWrite関数よりも慣れていますし、シンプルで使いやすいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です