はじめに
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ユーザーを作成します。
- IAM → ユーザー → ユーザーの作成
- ユーザー名:任意(例:
claude-dev) - 許可ポリシー:
AmazonEC2FullAccessをアタッチ - セキュリティ認証情報 → アクセスキーを作成
- ユースケース:「コマンドラインインターフェイス (CLI)」を選択
- アクセスキー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開発環境が整います。スポットインスタンスを活用することでコストも抑えられ、使わない時は停止しておけば課金も最小限です。
外出先での開発や、荷物を減らしたい場面での選択肢として参考にしていただければ幸いです。