2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Androidスマホだけで ESP32開発環境を構築する ― EC2 + Claude Code + WiFi OTA

2
Posted at

はじめに

Claude Codeでの開発、とても楽しいですよね。でもPCの無い環境では利用は難しいです。
本記事では「外出先でもESP32の開発がしたい」という動機から、Androidスマホ(Pixel 8)のみでコード編集・ビルド・書き込みまでを完結させる環境を構築してみました。もちろん作業の大半はclaudeに教えて貰い、この記事も大半はまとめて貰いました。

構成は以下の通りです。

Pixel 8 (Termux)
    ↓ SSH
AWS EC2 (Claude Code + PlatformIO)
    ↓ SCP - firmware.bin
Pixel 8 (Termux)
    ↓ WiFi OTA
AtomS3 (ESP32-S3)

PCなしで以下のワークフローを実現しています。

  • EC2上でClaude Codeを使ってコードを編集
  • PlatformIOでESP32向けにビルド
  • ビルドしたバイナリをTermuxにダウンロード
  • WiFi OTA(espota.py)でAtomS3に書き込み

必要なもの

機器・サービス 備考
Androidスマホ 本記事ではPixel 8を使用
USB-C to USB-Cケーブル OTGホストモード対応のもの
AtomS3(またはESP32-S3搭載デバイス) 初回のみPCで書き込みが必要
AWSアカウント EC2を使用
Anthropic APIキー Claude Code用

1. Termuxのセットアップ

TermuxはAndroid上で動作するLinux環境です。Google Play版は更新が停止しているため、F-Droid版を使用します。

インストール後、パッケージを更新します。

pkg update && pkg upgrade

ストレージへのアクセスを許可

ダウンロードしたバイナリをAndroidのストレージから参照するために権限を付与します。

termux-setup-storage

AWS CLIのインストール

pkg install python
pip install awscli

AWS CLIの設定

後述するIAMユーザーのアクセスキーを使って設定します。

aws configure
AWS Access Key ID: (アクセスキーIDを入力)
AWS Secret Access Key: (シークレットキーを入力)
Default region name: ap-northeast-1
Default output format: json

2. AWSのセットアップ

IAMユーザーの作成

AWSコンソールでCLI用のIAMユーザーを作成します。

  1. IAM → ユーザー → ユーザーの作成
  2. ユーザー名:任意(例:claude-dev
  3. 許可ポリシー:AmazonEC2FullAccessをアタッチ
  4. セキュリティ認証情報 → アクセスキーを作成
  5. ユースケース:「コマンドラインインターフェイス (CLI)」を選択
  6. アクセスキーIDとシークレットアクセスキーをメモ

EC2インスタンスの作成

以下のスクリプトをTermuxで実行します。

#!/bin/bash
# setup-ec2.sh

REGION="ap-northeast-1"
KEY_NAME="claude-dev-key"
SG_NAME="claude-dev-sg"
INSTANCE_TYPE="t3.small"
AMI_ID="ami-0d52744d6551d851e"  # Ubuntu 24.04 LTS (ap-northeast-1)

# キーペア作成
mkdir -p ~/.ssh
aws ec2 create-key-pair \
  --key-name $KEY_NAME \
  --query 'KeyMaterial' \
  --output text > ~/.ssh/${KEY_NAME}.pem
chmod 400 ~/.ssh/${KEY_NAME}.pem
echo "✓ キーペア作成完了"

# セキュリティグループ作成
SG_ID=$(aws ec2 create-security-group \
  --group-name $SG_NAME \
  --description "Claude Code Dev" \
  --query 'GroupId' --output text)

# SSH(22番ポート)を全開放(回線によってIPv6になったりIPが変わったりがあるため)
aws ec2 authorize-security-group-ingress \
  --group-id $SG_ID \
  --protocol tcp --port 22 \
  --cidr 0.0.0.0/0
echo "✓ セキュリティグループ作成完了"

# スポットインスタンス起動(停止・再開可能)
INSTANCE_ID=$(aws ec2 run-instances \
  --image-id $AMI_ID \
  --instance-type $INSTANCE_TYPE \
  --key-name $KEY_NAME \
  --security-group-ids $SG_ID \
  --block-device-mappings '[{"DeviceName":"/dev/sda1","Ebs":{"VolumeSize":20,"VolumeType":"gp3"}}]' \
  --instance-market-options '{"MarketType":"spot","SpotOptions":{"SpotInstanceType":"persistent","InstanceInterruptionBehavior":"stop"}}' \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=claude-dev}]' \
  --query 'Instances[0].InstanceId' --output text)

echo "✓ インスタンス起動中: $INSTANCE_ID"

aws ec2 wait instance-running --instance-ids $INSTANCE_ID
PUBLIC_IP=$(aws ec2 describe-instances \
  --instance-ids $INSTANCE_ID \
  --query 'Reservations[0].Instances[0].PublicIpAddress' --output text)

echo "✓ 起動完了"
echo "  Instance ID: $INSTANCE_ID"
echo "  Public IP:   $PUBLIC_IP"
echo "  SSH: ssh -i ~/.ssh/${KEY_NAME}.pem ubuntu@${PUBLIC_IP}"

スポットインスタンスについて:t3.smallのスポット料金は約$0.01/時間程度で、オンデマンドより安くなります。またスクリプトで開始停止を行えるようにしています。
スポットインスタンスでは突然停止するリスクはありますが、開発用途では許容範囲です。停止中のEBSストレージ(20GB gp3)は約$1.6/月の課金があります。


3. EC2の日常操作スクリプト

毎日の起動・停止・接続をワンコマンドで行うスクリプトです。INSTANCE_IDは上記で取得した値を設定してください。

#!/bin/bash
# ec2.sh

INSTANCE_ID="i-xxxxxxxxxxxxxxxxx"  # 取得したIDを記入
KEY="$HOME/.ssh/claude-dev-key.pem"
REMOTE_BIN="/home/ubuntu/platformio/<プロジェクト名>/.pio/build/<ボード名>/firmware.bin"
LOCAL_BIN="$HOME/firmware.bin"

get_ip() {
  EC2IP=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID \
    --query 'Reservations[0].Instances[0].PublicIpAddress' --output text)
  export EC2IP
  echo "EC2IP: $EC2IP"
}

case $1 in
  start)
    aws ec2 start-instances --instance-ids $INSTANCE_ID
    aws ec2 wait instance-running --instance-ids $INSTANCE_ID
    get_ip
    echo "起動完了: $EC2IP"
    ;;
  stop)
    aws ec2 stop-instances --instance-ids $INSTANCE_ID
    echo "停止しました"
    ;;
  status)
    aws ec2 describe-instances --instance-ids $INSTANCE_ID \
      --query 'Reservations[0].Instances[0].{State:State.Name,IP:PublicIpAddress}' \
      --output table
    ;;
  ssh)
    get_ip
    ssh -i $KEY ubuntu@$EC2IP
    ;;
  scp)
    get_ip
    scp -i $KEY ubuntu@$EC2IP:$REMOTE_BIN $LOCAL_BIN
    echo "ダウンロード完了: $LOCAL_BIN"
    ;;
  ota)
    python3 ~/espota.py -i $OTAIP -p 3232 -f $LOCAL_BIN
    ;;
  *)
    echo "使い方: ec2.sh [start|stop|status|ssh|scp|ota]"
    ;;
esac
chmod +x ~/ec2.sh

使い方

./ec2.sh start    # EC2を起動
./ec2.sh ssh      # SSH接続
./ec2.sh stop     # EC2を停止
./ec2.sh status   # 状態確認
./ec2.sh scp      # firmware.binをダウンロード
./ec2.sh ota      # WiFi OTAで書き込み

4. EC2上の開発環境セットアップ

EC2にSSH接続後、以下を順番に実行します。

システムの更新

sudo apt update && sudo apt upgrade -y

Node.jsのインストール(nvm使用)

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install --lts
node -v
npm -v

Claude Codeのインストール

npm install -g @anthropic-ai/claude-code
claude --version

PlatformIOのインストール

sudo apt install -y python3-pip python3-venv
curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py -o get-platformio.py
python3 get-platformio.py
echo 'export PATH="$HOME/.platformio/penv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
pio --version

ESP32ツールチェーンのインストール

pio platform install espressif32

初回は時間がかかります(5〜10分程度)。


5. WiFi OTA書き込みのセットアップ

espota.pyの取得

curl -o ~/espota.py https://raw.githubusercontent.com/esp8266/Arduino/master/tools/espota.py

AtomS3側のOTAコード

初回だけPCからUSBでOTA対応ファームウェアを書き込んでおきます。

#include <WiFi.h>
#include <ArduinoOTA.h>

const char* ssid = "テザリングのSSID";
const char* password = "テザリングのパスワード";

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) delay(1000);
  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle();
}

OTA書き込みの実行

AtomS3をPixel 8のテザリングに接続した状態でIPアドレスを確認します。

pkg install nmap
nmap -sn 192.168.43.0/24

IPアドレスを環境変数に設定してOTA書き込みを実行します。

export OTAIP=192.168.43.xxx
./ec2.sh ota

6. 開発ワークフロー

実際の開発時の流れは以下の通りです。

# 1. EC2を起動
./ec2.sh start

# 2. EC2にSSH接続してClaude Codeで開発・ビルド
./ec2.sh ssh
# EC2上で
cd ~/platformio/<プロジェクト名>
claude  # Claude Codeを起動してコード編集
pio run # ビルド

# 3. バイナリをTermuxにダウンロード
./ec2.sh scp

# 4. WiFi OTAで書き込み
export OTAIP=192.168.43.xxx
./ec2.sh ota

# 5. 作業終了後にEC2を停止
./ec2.sh stop

まとめ

作業 環境
コード編集・AIアシスト EC2上のClaude Code(SSH経由)
ビルド EC2上のPlatformIO
バイナリ転送 SCP(EC2 → Termux)
ESP32書き込み WiFi OTA(espota.py)

PCがなくてもAndroidスマホだけで本格的なESP32開発環境が整います。スポットインスタンスを活用することでコストも抑えられ、使わない時は停止しておけば課金も最小限です。

外出先での開発や、荷物を減らしたい場面での選択肢として参考にしていただければ幸いです。


参考

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?