ESP-IDFを使ってみる
USB OTG
ESP32-S2ではUSB OTGを使うことができます。
こ
ちらのtusb_serial_deviceのサンプルをビルドしてみました。
結線はこ
ちらのREADMEのままですが、USBコネクターのGNDを、ボードのGNDに接続する必要が有ります。
ESP32-S2のデータシートを見ると
The ESP32-S2 has a full-speed USB OTG peripheral with integrated
transceivers and is compliant with the USB 1.1 specification.
GPIO19 and GPIO20 can be used as D- and D + of USB respectively.
It is recommended to reserve series resistor and capacitor to the
ground on each line, and place them close to the chip side.
って書いてありますが、特に抵抗とコンデンサーを入れなくても動いています。
この様なMini-BのUSB基盤を使っています。

USBケーブルをWindowsマシンのUSBポートに接続し、ファームをビルドすると、いきなり新しいCOMポートが出現します。

TeraTermでこのポートをオープンし、適当な文字を打ち込んでみましたが、きちんと受信出来ています。

USB Host機能を持っているわけではないので、例えばArduinoとUSBで繋いでも、USB OTG経由で通信はできません。
USB OTGで通信できるのは、相手側がUSB Host機能を持っているWindowsマシンやLinuxマシンだけです。
ホストがこのポートに接続するとLine Statusがdtr:1, rst:1に変化するので、ホストが接続中かどうかを
esp-idf側で知ることができます。

次にこ
ちらのtusb_consoleのサンプルをビルドしてみました。
このサンプルはESP32の標準出力をUSB OTGポートに出力するものです。
ファームをビルドしてTeraTermでUSB OTGポートに接続すると、TeraTermにこのように表示されました。
サンプルのソースを見てみると、fprintf()だけでなく、ESP_LOGI()の出力もUSBポートに出すことができます。
シリアル通信を行うプログラムを作る場合、ログの出し場所に困るのですが、これで解決です。

tusb_consoleとtusb_serial_deviceはよく似ています。
メチャクチャ簡単に書くと、tusb_consoleはUSBへの出力だけ、tusb_serial_deviceはUSBの入出力が可能になり
ます。
どちらもUSBドライバーを登録した時点で有効になるので、ESP32のブートローダーが出すメッセージはUSBには出ていきません。
esp-idf v5の時点で、tusb_serial_deviceでUSBから一度に読めるのは最大64バイトです。
Windowsなどで70バイトのデータをUSBに書き込んでも、tinyusb_cdcacm_read()では一度に読めずに、64バイトと
6バイトに分割されてしまいます。
続く...