XIAO ESP32C3を使ってみて
はじめに
XIAO ESP32C3を使ってみて、資料が少ないので記載しておきます。 (英語資料を参照していますが....)
資料
Getting Started with Seeed Studio XIAO ESP32C3のページ下部まで行くとWiKiや回路図のリンクがあります。
- Getting Started with Seeed Studio XIAO ESP32C3, https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/#hardware-overview
- WiKi, https://sigmdel.ca/michel/ha/xiao/xiao_esp32c3_intro_en.html
- 回路図, https://files.seeedstudio.com/wiki/XIAO_WiFi/Resources/Seeeduino-XIAO-ESP32C3-SCH.pdf
How to
ブートローダーモードへ移行
XIAO ESP32C3を利用していると頻繁に書き込みできなくなります。その場合は下記の方法でブートローダーモードへ移行します。
ボタンを使う場合
- リセットボタンを押し続けます。
- 起動ボタンを押したままにします。
- リセットボタンを離します。
- 起動ボタンを離します。
USBケーブルで起動する場合
- 通常は USB ケーブルを外して、ボードの電源を切ります。
- 起動ボタンを押したままにします。
- 通常は USB ケーブルを接続して、ボードに電源を供給します。
- 起動ボタンを離します。
上記一連の手順により、PlatformIOやArduinoIDEのシリアルポート接続が解除されている場合があるので、その場合はシリアルの再接続が必要になります。
回路
回路図はこちら https://files.seeedstudio.com/wiki/XIAO_WiFi/Resources/Seeeduino-XIAO-ESP32C3-SCH.pdf にあります。
上部に電源回路とリチウム電池充電回路があります。
LDO XC6210
https://www.torexsemi.com/file/xc6210/XC6210.pdf
注意点
Seeed K.K.の松岡さんの記事が参考になります。 Seeed Studio XIAO ESP32C3のI/O割り付けに注意 - Seeed K.K. エンジニアブログ 結論として、
- D9はスイッチ入力に使う
- D6ピンは極力使わない
- D8はプルアップする
になります。
D8からは1.3V程度が常時かかっているようでした。ブザーを繋ぐと勝手に音が流れて困っていました。
応用
小型ソーラー電源とリチウム電池の併用
結論から言うと、小型ソーラー電源とリチウム電池からXIAO ESP32C3への同時電源供給は出来なさそうです。 送信時の5V 50mA程度の小型ソーラー電源とリチウム電池を組み合わせて利用する場合を想定しています。 理由は、VbatとVusbの切り替えにP-MOSFETを使っており、Vusbから電圧が来ている場合(GS間に+電位が掛かっている場合)、Vbatから電流が流れない(DS間に電流が流れない)ためです。
※ ソーラー電源だけで起動させようとした場合、WiFi受信時は平均50mA@5V消費し、送信時の電流200~300mAを考慮すると60mAのソーラーパネルでは電流が不足しました。コンデンサ100uFで電流不足を補うとしたが出来ませんでした。そのため、ソーラー発電時は充電のみ行うためにESP32C3をDeepsleepまたはWiFi OFFし、リチウム電池から起動させる場合は外部スイッチでソーラー発電をOFFする必要があります。Vusb(ソーラー電源)とVbat(リチウムイオン電池)はXIAO内部のP-MOSFETでスイッチする構成になっています。WiFi受信だけではソーラー電源で足りていたとしても、送信時にソーラー電源不足で電圧降下し、リチウム電源からの供給となるため、VCC_3V3にある程度の充電コンデンサ(1F程度?)が無いと厳しそうです。そもそも屋外環境ではソーラー電源に0V以上ある事が定常でありスイッチが発生しないので、ソフトウェアで意図的にソーラー電源をOFFする仕組みが必要になります。 (2023/3/22 進行中)
当初Deepsleepからのwakeupで起動しようとしていましたが、バッテリー容量が減ってXIAO ESP32C3が電源OFFになると起動できません。 電源OFFから起動するためにはリセットする必要がありますが、ジャンパワイヤで確認したところ背面のRST端子は繋がっていないようなため使えません。全く好ましくないですが、強制的にリセットするためにMOSFETで3VとGNDをショートさせる事でリセットするようにしました。MOSFETの種類にもよりますが、3V-GND間に流れる電流は60mA程度です。 (2023/3/29 追記)
ジャンパワイヤでMOSFETで3VとGNDをショートさせるとリセットできますが、ベタアースにした場合はリセットがかかりませんでした。 瞬間的に大電流流れる必要があると想定します。 この方式はそもそも好ましくないので、リチウムイオン電池とVusbの間にPch-MOSFETを挟み、外部スイッチでリセットできるようにします。 と思った矢先に、再度回路を見てみるとENが端子が基盤の腹に出ていた....のでこれを使いましょう。 (2023/5/9 追記)
キャリアセンスのON/OFF
esp_err_t esp_ieee802154_transmit(const uint8_t frame, bool cca); //CAMA/CAのONOFFができる。
void esp_ieee802154_set_cca_threshold(int8_t cca_threshold); //CAMA/CAのthresholdをsetできる。
void esp_ieee802154_set_cca_mode(esp_ieee802154_cca_mode_t cca_mode); //CSMA/CAのmodeをsetできる。
modeは下記。CarrierはWiFi Channelを意味しているだろうか。
typedef enum {
ESP_IEEE802154_CCA_MODE_CARRIER, /!< Carrier only /
ESP_IEEE802154_CCA_MODE_ED, /!< Energy Detect only /
ESP_IEEE802154_CCA_MODE_CARRIER_OR_ED, /!< Carrier or Energy Detect /
ESP_IEEE802154_CCA_MODE_CARRIER_AND_ED, /!< Carrier and Energy Detect */
} esp_ieee802154_cca_mode_t;
arduino-esp32/esp_ieee802154_types.h at 00214d5c2a1c2b1904f2caf6f0d5ddfe952331ff · espressif/arduino-esp32 · GitHub
arduino-esp32/esp_ieee802154.h at 00214d5c2a1c2b1904f2caf6f0d5ddfe952331ff · espressif/arduino-esp32 · GitHub
WiFi/BLE同時運用
WiFiとBLEの共用は出来るが、時分割となる。 併用可能な組み合わせは、 docs.espressif.com に詳しい。