esp32-serial-commands について
USBシリアル経由でESP32にコマンドを送り、ボタン操作などを再現するスキルです。パラメーター付きコマンドや、ログを確認しながらの反復テストに対応します。
主な機能
- 01USBシリアル経由のコマンド送信
- 02ボタン操作やユーザー操作の再現
- 03パラメーター付きコマンド
- 04ストレステストと安定性テスト
- 05ログでデバイスの応答を確認
活用シーン
- 01ボタンコマンドの自動反復送信
- 02長時間の安定性テスト
- 03ログによるコマンド処理の検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ h1d/ agent-skills-esp32 --skill esp32-serial-commandsインストール後、Claude Code で/esp32-serial-commandsを入力して読み込まれたか確認します。
詳細
ESP32 シリアルコマンドエミュレーション
概要
シリアルポートにコマンドを直接送信して、ボタンの押下やユーザー操作をエミュレートします。USB シリアル経由で動作します。
ESP32 のセットアップ(デバイス側)
ESP-IDF フレームワーク
#include "esp_log.h"
#include <string.h>
static const char* TAG = "SerialCmd";
void serial_command_task(void* arg) {
char buf[64];
int idx = 0;
while (1) {
int c = getchar();
if (c == EOF) {
vTaskDelay(pdMS_TO_TICKS(10));
continue;
}
if (c == '\n' || c == '\r') {
buf[idx] = '\0';
if (idx > 0) {
ESP_LOGI(TAG, "Command: %s", buf);
if (strcmp(buf, "PRESS") == 0) {
button_callback();
} else if (strncmp(buf, "SCREEN:", 7) == 0) {
int screen = atoi(buf + 7);
go_to_screen(screen);
}
}
idx = 0;
} else if (idx < sizeof(buf) - 1) {
buf[idx++] = c;
}
}
}
// In app_main():
// xTaskCreate(serial_command_task, "serial_cmd", 2048, NULL, 5, NULL);
Arduino フレームワーク
void setup() {
Serial.begin(115200);
}
void loop() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
Serial.printf("Command: %s\n", cmd.c_str());
if (cmd == "PRESS") {
button_callback();
} else if (cmd.startsWith("SCREEN:")) {
int screen = cmd.substring(7).toInt();
go_to_screen(screen);
} else if (cmd == "STATUS") {
Serial.println("OK");
}
}
}
ホスト側 - コマンドの送信
# Find serial port
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* /dev/ttyACM* 2>/dev/null | head -1)
# Send a command
echo "PRESS" > "$PORT"
よく使うコマンドパターン
# Simple command
echo "PRESS" > "$PORT"
# Command with parameter
echo "PRESS:3" > "$PORT" # Press 3 times
echo "SCREEN:2" > "$PORT" # Go to screen 2
echo "MODE:debug" > "$PORT" # Set debug mode
自動テスト
ストレステスト
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* 2>/dev/null | head -1)
for i in {1..100}; do
echo "PRESS" > "$PORT"
echo "Sent press $i"
sleep 2
done
長時間安定性テスト
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* 2>/dev/null | head -1)
END=$(($(date +%s) + 3600)) # 1 hour
count=0
while [ $(date +%s) -lt $END ]; do
count=$((count + 1))
echo "PRESS" > "$PORT"
echo "[$(date +%H:%M:%S)] Press $count"
sleep 30
done
echo "Total: $count presses"
ログ監視によるテスト
ターミナル 1 - ログの監視:
tail -f /tmp/device.log
ターミナル 2 - コマンドの送信:
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* 2>/dev/null | head -1)
echo "PRESS" > "$PORT"
ヒント
- タイミング:デバイスが処理できるよう、コマンドの間に遅延を入れます
- フィードバック:コマンドが受信されたことを確認するため、シリアルログを確認します
- エラー処理:デバイスからステータス(OK/ERROR)がエコーバックされるようにします
- ロギングとの併用:テスト中は常にログを監視します
コメント
Markdown 対応