ESP32-S3(ATOMS3)でUSBデバイスでマウスとキーボード実験

概要

USBホストの実験はしていましたが、USBデバイスはあまり触ったことがないので触ってみました。非常にシンプルに利用が可能できそうです。

USBデバイスとは?

パソコンからみたときにUSBキーボードなどに見えるデバイスになります。ESP32-S3はUSBシリアル、USBキーボード、USBゲームパット、USBマウス、USBマスストレージなどになることができます。

USBモード

上記のUSBモードですが、USB-OTG(TinyUSB)にする必要があります。一番上のUSBシリアルを有効化するかはどちらでも構いません。

注意事項としてUSB-OTG(TinyUSB)の場合には書き込み後に自動リセットがかかりません。安全面のためだとは思いますが、リセットボタンを押して新しいファームウエアで動くようにする必要があります。

また、動作確認が終わって新しいファームウエアを転送する場合には、ATOMS3の場合にはリセットボタンを2秒以上押してダウンロードモードに戻す必要があります。

シリアルポートなども書き込んだ場合やリセットをしたことによりどんどん変わっていきます。そのためArduino IDEの自動判定などが悪さをして、指定していたシリアルポート番号が解除されていたりします。結構面倒です。。。そのため書き込みのUSBと、OTG用のUSBポートが別にある機材を使ったほうが開発は楽だとは思います。

USBキーボード

#include "USB.h"
#include "USBHIDKeyboard.h"
USBHIDKeyboard Keyboard;

const int buttonPin = 41;
int previousButtonState = HIGH;
int counter = 0;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Keyboard.begin();
  USB.begin();
}

void loop() {
  int buttonState = digitalRead(buttonPin);
  if ((buttonState != previousButtonState) && (buttonState == LOW)) {
    counter++;
    Keyboard.print("You pressed the button ");
    Keyboard.print(counter);
    Keyboard.println(" times.");
  }
  previousButtonState = buttonState;
  delay(1);
}

ATOMS3のボタンを押したときにメッセージをキーボード入力するサンプルになります。

https://github.com/espressif/arduino-esp32/blob/master/libraries/USB/examples/Keyboard/KeyboardMessage/KeyboardMessage.ino

上記のスケッチ例をATOMS3用に簡略化してあります。

USBマウス

#include "USB.h"
#include "USBHIDMouse.h"
USBHIDMouse Mouse;

const int mouseButton = 41;

void setup() {
  pinMode(mouseButton, INPUT_PULLUP);
  Mouse.begin();
  USB.begin();
}

void loop() {
  int clickState = digitalRead(mouseButton);

  if (clickState == LOW) {
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      // ボタンが押されていたらクリック
      Mouse.press(MOUSE_LEFT);
    }
  }

  // クリックを離す
  if (Mouse.isPressed(MOUSE_LEFT)) {
    Mouse.release(MOUSE_LEFT);
  }

  delay(1);
}

こちらも同じくATOMS3用に簡略化しています。ボタンを押している間にマウスクリックを連打しています。これでクッキーが高速で焼けますね。

https://github.com/espressif/arduino-esp32/blob/master/libraries/USB/examples/Mouse/ButtonMouseControl/ButtonMouseControl.ino

上記をベースにしています。

USBマスストレージ

https://github.com/espressif/arduino-esp32/blob/master/libraries/USB/examples/USBMSC/USBMSC.ino

上記のサンプルを実行すると、パソコンからUSBメモリ的なドライブが認識されます。

こんな感じで中身に「README.TXT」がありました。とはいえ、使えますがいろいろ実用的に使うたまにはまだまだ難しい気がします。

    // second entry is readme file
    'R' , 'E' , 'A' , 'D' , 'M' , 'E' , ' ' , ' ' ,//file_name[8]; padded with spaces (0x20)
    'T' , 'X' , 'T' ,     //file_extension[3]; padded with spaces (0x20)
    0x20,                 //file attributes: FILE_ATTR_ARCHIVE
    0x00,                 //ignore
    FAT_MS2B(1,980),      //creation_time_10_ms (max 199x10 = 1s 990ms)
    FAT_HMS2B(13,42,36),  //create_time_hms [5:6:5] => h:m:(s/2)
    FAT_YMD2B(2018,11,5), //create_time_ymd [7:4:5] => (y+1980):m:d
    FAT_YMD2B(2020,11,5), //last_access_ymd
    FAT_U16(0),           //extended_attributes
    FAT_HMS2B(13,44,16),  //last_modified_hms
    FAT_YMD2B(2019,11,5), //last_modified_ymd
    FAT_U16(2),           //start of file in cluster
    FAT_U32(sizeof(README_CONTENTS) - 1) //file size
  },

ファイルの一覧とかも上記の指定になります。

Windowsからみると上記のように見えます。ちょっと気軽には使えない気がしますね。とはいえ、これを使うと、ファームウエアやプログラムを保存すると自動取り込みなども可能になると思います。

まとめ

USBデバイスも整備されているものを使うのは非常にかんたんです。また、USBホストを実装するときにもデバイス側の動きと同じパラメーターが多いですので、USBデバイスも触っておくのは有効そうでした。

コメント

  1. hiro より:

    初めまして、ESP32をUSB接続で検索してこのページに来ました。
    最近、趣味でマイコンを始めたばかりなので初心者の質問で誠に申し訳無いですが
    「USBモード」にするには、ArduinoIDEとVScodeとか何の画面か解りませんでした。
    良ければ、ご享受下さい。

    • たなかまさゆき より:

      USBポートをどのように使うのかを指定するのがUSBモードになります。
      基本はUSBシリアルとJTAGになっているのですが、自由に制御することができるUSB-OTG(TinyUSB)モードがあります。

      Arduinoの場合にはメニューから変更することができて、本文にある画像の中にあるところです。

      VScode(PlatformIO)の場合には以下のような設定をplatformio.iniに書くことで指定できます。

      build_flags =
      -DARDUINO_USB_MODE=1
      -DARDUINO_USB_CDC_ON_BOOT=1

      https://lang-ship.com/blog/work/m5stack-atoms3-2

      上記でも少し解説をしています。

  2. hiro より:

    ありがとうございました。
    使い始めたソフトはどこにどんな設定が有るのか解らないので大変です(^_^;)
    ライブラリの読み込みとか四苦八苦しながらやっています。
    また、よろしくお願いします。