M5Stack ATOMS3を購入 その2

概要

前回かんたんに利用してみましたが、もう少し突っ込んで動作確認してみました。

シリアルについて

ESP32-S3ではハードウエアのUARTが3系統、USBシリアルが1系統を利用可能です。しかしATOMS3はUART0のデフォルトであるGPIO43と44が外部からアクセスできません。そのためブートログを表示するためにはUSBシリアルを利用する必要があります。

利用するモードによって、シリアルの動きが変わりますので注意してください。

USB CDC on Boot

USB CDCはシリアル通信などのデータ連携をするためのプロトコルです。MIDIなどもCDCとなりますが、設定であるCDCはUSBシリアルを利用するかとぼほ同義となります。

この設定はデフォルトはDisabledなのですが、Enabledに設定するとSerialクラスはUSBシリアルになります。ATOMS3で通常利用であれば常にEnabledに設定するのがよいと思います。ただし次に説明するUSB Modeによって動きがことなります。

USB Mode

USB端子をUSBシリアルとして利用するか、USB-OTGとして利用するかを選択します。USB-OTGとはUSB同士を接続する機能となります。

標準のUSBシリアル以外にTinyUSBライブラリを利用してUSBデバイスやUSBホスト機能を利用したい場合にUSB-OTGを選択します。

また、USB-OTGモードを利用すると設定によりそのままだと書き込みができないモードになりますので、次回書き込むときにはリセットボタンを2秒以上押して書き込みモードにする必要があります。

通常のESP32-S3はUART0に別途USBシリアルを接続し、USB端子はOTG専用にしていることが多いので、デフォルトはUSB-OTGになっています。しかしATOMS3はUSB端子からしか書き込みができないで通常はUSBシリアルとして利用するHardware CDC and JTAGに設定するのがおすすめです。

状態のまとめ

USB CDC On Boot
Disabled
USB CDC On Boot
Enabled
USB Mode
Hardware CDC and JTAG
HardwareSerial Serial;
HWCDC USBSerial;
※ATOMS3通常利用時推奨
HWCDC Serial;
HardwareSerial Serial0;
USB Mode
USB-OTG(TinyUSB)
※Arduino IDEデフォルト
HardwareSerial Serial;
HWCDC Serial; ※別ポート
HardwareSerial Serial0;

上記の対応になります。ちょっとわかりにくいのですが、設定によりSerialのクラスが変わります。「USB CDC On Boot」をEnabledにするとUSBシリアル側のHWCDCが使われています。

左下の「USB CDC On Boot」がDisabledで「USB Mode」が「USB-OTG(TinyUSB)」がデフォルトですが、ATOMS3の場合にはHardwareSerialのGPIO43と44が外部に出ていないので利用できません。

右上の「USB CDC On Boot」をEnabledにして、「USB Mode」は「Hardware CDC and JTAG」にするとSerialクラスに出力したものがUSBシリアル経由で表示できます。USBホストを利用しない場合のはこの設定を個人的に推奨します。

右下の状態は注意が必要なのですが、Serialクラスに出力したものがUSBシリアル経由で表示できますが、いつもと違うシリアルポート番号で認識されており、デフォルトの設定では書き込みには利用できませんでした。

上記でUpload ModeをUSB-OTGにするか、書き込み時には2秒以上リセットボタンを押して書き込みモードにする必要があります。

左上はUSBSerialが宣言されまして、こちらは通信も書き込みも両方大丈夫でしたが、ATOMS3では積極的に利用する必要はないと思います。

Arduino IDEdefine
USB CDC On Boot=Disabled
USB CDC On Boot=EnabledARDUINO_USB_CDC_ON_BOOT
USB Mode=Hardware CDC and JTAGARDUINO_USB_MODE
USB Mode=USB-OTG(TinyUSB)

プログラムで設定状態を確認する場合やPIOで宣言する場合には上記のdefineになります。USB ModeがデフォルトだとUSB-OTGになっていますのでご注意ください。

HardwareSerial Serial1;
HardwareSerial Serial2;

また、どの設定でも上記2つも定義されており、任意のPINに設定可能です。

Serialの使い分け

#if ARDUINO_USB_CDC_ON_BOOT
  #define S3USBSerial Serial
#else
  #if ARDUINO_USB_MODE
    #define S3USBSerial USBSerial
  #else
    #error "Please, board settings -> USB CDC On Boot=Enabled"
  #endif
#endif

void setup() {
  S3USBSerial.begin(115200);
}

void loop() {
  static int cnt = 0;
  cnt++;
  S3USBSerial.printf("cnt = %d\n", cnt);
  delay(100);
}

上記のような感じでどの状態でも共通コードにすることができます。個人的には#errorはやりすぎで、#warningがいいと思うが、警告読まない人がいるからな。。。

電源入力について

端子電圧
3V33.3V
5V5V
Grove5V5V
USB5V

電源は4箇所あり、すべての端子で入出力のどちらも可能でした。ESP32-S3-DevKitCなどの通常の開発ボードの場合にはUSB端子は入力専用になっており、外部に電圧を出力していません。複数の電源が接続されているときに、電圧が低い端子に逆流することがあり、それを防ぐためと思われます。

ちなみに3.3Vを入力するときには3V3より5Vから入力したときのほうが消費電力は若干低かったです。

USB端子について

ATOMS3のUSB端子はUSBデバイスとしても、USBホストとしても利用可能です。

USBデバイス

USBデバイスとはUSBシリアルなどで、パソコンに接続して利用できる機能になります。パソコンにESP32-S3を接続すると、パソコンからは以下の装置として見えます。

  • USBシリアル(CDC)
  • MIDIデバイス(CDC)
  • USBキーボード(HID)
  • USBマウス(HID)
  • ゲームパット(HID)
  • ストレージ(MSC)

代表的な機能として上記のようなものを実装可能です。比較的かんたんに使えてスケッチ例もあるので利用しやすいです。

USBホスト

外部のUSBキーボードなどをESP32-S3単体で利用するための機能となります。

  • USBホストキーボード(HID)
  • USBホストMIDI(CDC)
  • USBホストプリンタ(CDC)

上記以外にもいろいろ使えるはずえすが、USBデバイスのドライバを自分で書く必要があります。またATOMS3はUSB端子が1つしかありませんので、パソコンからファームウエアを転送して、USBキーボードに差し替えるなどの手間がかかります。

ESP32-S3-DevKitCを使うと書き込み用のUSBシリアルと、USBホスト用のUSB端子が別なので差し替えの必要はありません。ただしESP32-S3-DevKitCはUSBホスト用端子に5V出力がでていませんので、特殊なケーブルを利用する必要があります。

私は自作開発ボードを作りましたので、5V電源出力付きのUSBホスト用の端子を増設した状態でUSBホストの検証ができます。ATOMS3のみでUSBホストの開発をするのは非常に面倒なので、ある程度動く状態までは他のボードを使ったほうがいいと思います。

まとめ

USBまわりの検証だけで結構たいへんでした。USBホストについては現在EspUsbHostというライブラリを作成中ですので、別の記事にて使い方を紹介したいと思います。

コメント