XIAO ESP32C3を使ってみる その2(analogWrite関数、サーボモーター)
はじめに
今回はXIAO ESP32C3で、analogWrite関数とサーボモーターの制御を試してみました。
サーボモーターについては、既存のライブラリが使えませんでした。そこで今回はデータシートを見ながらパルスで制御しています。
▼こちらでも議論されていましたが、提案されていたライブラリだとエラーが出ました。
https://forum.arduino.cc/t/xiao-esp32-c3-pwm-servo-control/1087850
▼販売ページはこちら。ピン配置なども掲載されています。
▼以前の記事はこちら
ピンの注意点
調べているときに見つけたのですが、XIAO ESP32C3のピンには内部回路で繋がっているところがあります。D6、D8、D9ピンは要注意です。
▼詳しくはこちらに書かれています。
▼こちらにどのモードになるかが書かれています。
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をそのまま使いました。ちゃんと動作しています。
サーボモーターを制御する
今回は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での動作はこんな感じ。
▼ライブラリを使わない、パルスでの制御プログラムはこちら。for文を使って、Sweepと同じような制御にしています。
▼実際に動かしたときの様子はこちら
XIAO ESP32C3で検証する
Arduino Nanoで検証したときと違って、シリアルモニタを開くまで回転が遅いということがありました。こちらではシリアル通信の部分を省いています。
また、動画では9番のピンを使っていたのですが、先述したように内部で繋がっているところがあります。プログラムは10番にしていますが、ちゃんと動作しました。
▼XIAO ESP32C3の場合のプログラムはこちら
▼実際に動かしたときの様子はこちら
▼ちなみに、SG90よりも少しトルクが大きいSG92Rでも同様に制御できました。
最後に
ライブラリを使わずにサーボモーターを制御することができました。Arduinoでは標準的な関数しか使っていないので、他のボードでも使えそうです。
Arduino Nanoの場合と比べて、XIAO ESP32C3の場合は回転が遅いのが気になっています。Signalの電圧は、やはり4.8~5Vのほうがいいのかもしれません。
analogWrite関数が使えるのは個人的に意外でした。ledcWrite関数よりも慣れていますし、シンプルで使いやすいです。