1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtomS3 liteでShiftキーをつくる(ディスプレイ復帰用)

1
Posted at

はじめに

Mac のディスプレイがスリープしたとき、キーボードに手を伸ばさずにボタン一つで画面を起こしたい、という用途のために、M5Stack AtomS3 Lite を「Shift キーだけの USB キーボード」にしてみました。

AtomS3 Lite に載っている ESP32-S3 は USB デバイス機能(USB-OTG)を内蔵しているので、ケーブル1本で挿すだけで Mac からは普通の USB キーボードとして認識されます。ドライバは不要です。

前面ボタンを押すと Shift を1回だけ送ります。Shift は単独では文字入力も操作も起こさないので、作業中に誤って押しても無害です。

環境

  • M5Stack AtomS3 Lite(ESP32-S3、8MB フラッシュ内蔵)
  • データ通信対応の USB Type-C ケーブル
  • macOS(IntelでもApple SiliconでもOK)
  • Arduino IDE 2.x
  • ボードパッケージ: esp32 by Espressif Systems 3.3.12

「充電専用」の USB ケーブルはデータ線がないため認識されません。

スケッチ

使うピンは前面ボタンの GPIO41 だけで、入力(プルアップ)として読みます。出力に設定するピンはありません。Wi-Fi / Bluetooth / LED も使いません。

  • 押した瞬間(HIGH→LOW)に1回だけ Shift を送り、すぐ離す
  • チャタリング除去あり
  • 押しっぱなし・連打でも 0.5 秒に1回まで
  • ループに待ち時間を入れて空回りさせない
atoms3_shift_wake.ino
// AtomS3 Lite: 前面ボタンを押すと Shift を1回だけ送る USB キーボード
// 使うピンは GPIO41(ボタン入力)だけ。出力ピンは一切設定しない。
// Wi-Fi / Bluetooth / LED は使わない(初期化しない)。

#include "USB.h"
#include "USBHIDKeyboard.h"

USBHIDKeyboard Keyboard;

const int BUTTON_PIN = 41;                  // 前面ボタン(押すと LOW)
const unsigned long DEBOUNCE_MS = 30;       // チャタリング除去
const unsigned long MIN_INTERVAL_MS = 500;  // 押しっぱなし・連打でも 0.5 秒に 1 回まで

int lastRead = HIGH;
int lastStable = HIGH;
unsigned long lastChange = 0;
unsigned long lastSent = 0;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // 入力のみ
  Keyboard.begin();
  USB.begin();
}

void loop() {
  int r = digitalRead(BUTTON_PIN);
  unsigned long now = millis();

  if (r != lastRead) {
    lastRead = r;
    lastChange = now;
  }

  if (now - lastChange > DEBOUNCE_MS && r != lastStable) {
    lastStable = r;
    // 押した瞬間(HIGH→LOW)だけ送る。押しっぱなしでは繰り返さない
    if (lastStable == LOW && now - lastSent > MIN_INTERVAL_MS) {
      Keyboard.press(KEY_LEFT_SHIFT);
      delay(30);
      Keyboard.releaseAll();  // 必ず離す
      lastSent = now;
    }
  }

  delay(5);  // ループを空回りさせない
}

書き込み手順

1. ボードパッケージのインストール

Tools → Board → Boards Manager… で esp32 を検索し、「esp32 by Espressif Systems」をインストールします。

2. ボードと書き込み設定

Tools メニューで次のように設定します。

項目 設定値
Board ESP32S3 Dev Module
USB Mode USB-OTG (TinyUSB)
USB CDC On Boot Enabled
Flash Size 8MB (64Mb)
Port /dev/cu.usbmodem…

ここが最大のハマりどころです。

  • Board が「ESP32 Dev Module」(無印 ESP32 用)や「ESP32S3 Dev Module Octal (WROOM2)」になっていると正しく動きません。
  • USB Mode が初期値の「Hardware CDC and JTAG」のままだと、書き込みは成功しても USB キーボードとして動きません。
  • USB Mode / USB CDC On Boot の項目が Tools メニューに見当たらない場合は、Board が ESP32S3 Dev Module になっていません。
  • Board を変更すると Flash Size や Port が戻ることがあるので、最後にもう一度確認します。

AtomS3 Lite 専用のボード定義を使わず汎用の ESP32S3 Dev Module を選んでいるのは、USB Mode の設定項目が確実に出るためです。今回は GPIO41 を番号で直接読むだけなので、ボード固有の定義は必要ありません。

3. 書き込み

Upload ボタンを押します。出力欄に Hard resetting via RTS pin... と出れば書き込み完了です。

4. USB を抜き差しする

書き込み直後のソフトウェアリセットでは、書き込みモードから抜けきらないことがあります。一度 USB ケーブルを抜いて挿し直してください。

5. 認識の確認

ioreg -p IOUSB -w0 -l | grep -E '"USB Product Name"|"USB Vendor Name"'

次のように出ていれば USB キーボードとして動いています。

"USB Product Name" = "ESP32S3_DEV"
"USB Vendor Name" = "Espressif Systems"

"USB JTAG_serial debug unit" のままの場合は、まだ書き込みモードです。手順4をやり直してください。

初回接続時に「Keyboard Setup Assistant」が出たら、閉じて構いません。

6. 動作テスト

pmset displaysleepnow

画面が消えたら数秒待ち、AtomS3 Lite の前面ボタンを押します。画面が点けば完成です。

書き直したいとき

USB キーボードとして動いている間は、Arduino IDE からそのまま書き込めないことがあります。その場合は、側面のリセットボタンを緑 LED が点くまで約2秒長押しして書き込みモードにしてから Upload します。書き込み後は、手順4と同じく抜き差しが必要です。

「壊れたかも?」と思ったとき

USB キーボード化したスケッチを書き込むとシリアルポートの見え方が変わるため、「認識しない=壊れた」と勘違いしやすいです。esptool でチップの生存確認ができます。

pip3 install esptool
python3 -m esptool --chip esp32s3 --port /dev/cu.usbmodemXXXX chip-id

Connected to ESP32-S3 と表示され、MAC アドレスが出ればチップは生きています。中身を全消去したい場合は次を実行します。

python3 -m esptool --chip esp32s3 --port /dev/cu.usbmodemXXXX erase-flash
  • esptool 5.x ではサブコマンドがハイフン区切り(chip-id、erase-flash)です。
  • MacPorts や Homebrew の Python で esptool.py / esptool が見つからない場合は、python3 -m esptool で起動できます。
  • 接続できない場合は、上記の方法で書き込みモードにしてから実行してください。

おわりに

コード自体は短いですが、ESP32-S3 で USB キーボードを作るときは Board と USB Mode の設定 と 書き込み後の抜き差し が肝心でした。一度作ってしまえばドライバ不要で、ほかの Mac に挿し替えてもそのまま使えます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?