-
Notifications
You must be signed in to change notification settings - Fork 1
Description
概要
SmalrubotS1(Arduino互換マイコンボード)のファームウェアを、スモウルビーのブラウザから直接書き込めるようにします。
背景
現在の状況
SmalrubotS1を使うには、事前に専用ファームウェア(HEXファイル)を書き込む必要があります。現在はavrdudeを使って書き込んでいますが、以下の課題があります:
- avrdudeの知識が必要
- 開発環境のセットアップが必要
- 初心者にとってハードルが高い
解決策
WebSerial APIを使用して、ブラウザから直接ファームウェアを書き込めるようにします。これにより:
- ✅ 追加ツール不要(ブラウザだけで完結)
- ✅ 簡単な操作(ポート選択→自動書き込み)
- ✅ 初心者でも安心
ユーザー体験(想定操作フロー)
フェーズ1: 手動書き込み(まずはここを実現)
- smalrubot_s1拡張機能を有効にする
- 「SmalrubotS1」メニューが表示される(meshV2と同様の仕組み)
- サブメニュー「ファームウェアを書き込む...」を選択
- WebSerialのシリアルポート選択ダイアログが表示される
- ポートを選択すると自動的に書き込みが開始される
- 書き込み完了
フェーズ2: 自動促進(将来実装)
接続時のハンドシェイクに失敗した場合、接続モーダルでファームウェア書き込みを促します。
参考実装: MeshV2のネットワークフィルタリングエラー処理
packages/scratch-gui/src/components/connection-modal/mesh-v2-network-filtered-step.jsx
ポリシー: 「まずはやってみる。だめだったらそのときに対策する」というユーザー体験を提供。
技術情報
SmalrubotS1 ハードウェア仕様
- ベース: Arduino互換マイコンボード
- MCU: ATmega168PA
- Flashメモリ: 16KB
- ブートローダー: Optibootプリインストール
- シリアルチップ: Prolific製(USB Vendor ID: 0x067b, Product ID: 0x2303)
ファームウェアファイル
- 場所:
notes/sr_studu.ino.hex - フォーマット: Intel HEX
STK500v1プロトコル
Optibootは STK500v1 プロトコルを使用してファームウェアを転送します。
主要コマンド:
STK_GET_SYNC(0x30) - 同期確立STK_SET_DEVICE(0x42) - デバイスパラメータ設定STK_SET_DEVICE_EXT(0x45) - 拡張パラメータ設定STK_ENTER_PROGMODE(0x50) - プログラミングモード開始STK_LOAD_ADDRESS(0x55) - アドレス設定STK_PROG_PAGE(0x64) - ページプログラム(最大128バイト)STK_LEAVE_PROGMODE(0x51) - プログラミングモード終了
参考ドキュメント:
提供された実装ファイル
WebSerialでファームウェア書き込みを実現している企業から提供された情報:
1. notes/stk500.js
STK500v1プロトコルのJavaScript実装。主要な機能:
class STK500 {
transfer(sketch, reset_cb, transfer_cb, transfering_cb)
checkSync(command)
get_sync(data)
set_parameter(data)
set_extended_parameter(data)
enter_programmode(data)
load_address(data)
paged_write(data)
leave_programmode(data)
}特徴:
- WebSerial API対応
- Intel HEXフォーマットのパース機能
- プログレス通知機能
2. notes/sketch_testmode.js
ファームウェア(sr_studu.ino.hex)をJavaScriptから扱えるようにしたもの。
Dummy = '\
:100000000C9465000C948D000C948D000C948D0064\n\
:100010000C948D000C948D000C948D000C9485181C\n\
...用途: ファームウェアデータをあらかじめこの形式に変換しておく必要がある。
既存の参考実装
Node.js実装(検証済み)
これまでの調査で、Node.jsでファームウェア書き込みに成功しています。
- 使用ライブラリ:
avrgirl - 結果: ✅ 成功
WebSerial実装(未検証)
- 結果: ❌ まだ成功していない
- 状況: シリアル通信自体は正常に動作するが、ファームウェア書き込みは失敗
現在のsmalrubot_s1拡張機能
実装場所: packages/scratch-vm/src/extensions/scratch3_smalrubot_s1/index.js
現在の接続フロー:
- WebSerial APIでポート選択
- シリアルポート接続(baudRate: 19200)
- ハンドシェイク:
reset_v2コマンドで 'S1' レスポンスを確認 - 各種ポート初期化
接続失敗時の動作:
PERIPHERAL_REQUEST_ERRORイベントを発行- 接続モーダルでエラー表示
実装アプローチ
ステップ1: 実験フェーズ(必須)
提供されたstk500.jsを使って、まずは書き込みが成功するかを確認します。
(1) Node.js でコマンドライン実験
# notes/stk500.js を使ってファームウェアを書き込む
node experiment-upload.js成功条件: Node.jsでstk500.jsを使った書き込みが成功すること
(2) WebSerial でブラウザ実験
<!-- シンプルなHTML/JSでWebSerial経由の書き込みテスト -->
<script src="notes/stk500.js"></script>
<script src="notes/sketch_testmode.js"></script>成功条件: WebSerialでstk500.jsを使った書き込みが成功すること
ステップ2: 統合実装フェーズ(実験成功後)
実験で書き込みが成功したら、smalruby3-editorに統合します。
実装場所
-
scratch-vm拡張
packages/scratch-vm/src/extensions/scratch3_smalrubot_s1/index.jsuploadFirmware()メソッドを追加
-
GUIメニュー
packages/scratch-gui/src/components/menu-bar/smalrubot-s1-menu.jsx(新規)- meshV2と同様の仕組みでメニュー追加
-
接続モーダル(将来)
packages/scratch-gui/src/components/connection-modal/smalrubot-s1-firmware-upload-step.jsx(新規)- 接続失敗時のファームウェア書き込みステップ
タスク
🔬 実験フェーズ
- Node.jsでstk500.jsを使った書き込みテスト
- WebSerialでstk500.jsを使った書き込みテスト
- 実験結果のドキュメント化
🛠️ 実装フェーズ(実験成功後)
- stk500.jsのscratch-vmへの統合
- SmalrubotS1Blocksに
uploadFirmware()メソッド追加 - 進捗イベントの実装
- エラーハンドリングの実装
- GUIメニューの追加(「ファームウェアを書き込む...」)
- ファームウェアデータの管理(sketch_testmode.js形式)
✅ テストフェーズ
- 書き込み機能の動作確認
- エラーケースのテスト
- ユーザビリティテスト
参考情報
関連Issue
- smalruby3-gui#407: Smalrubot S1用ファームウェア転送機能の実装
- Smalrubot S1用ファームウェア転送機能の実装 smalruby3-gui#407
- より詳細な技術情報が記載されています
参考実装
- micro:bit用ファームウェア転送機能
packages/scratch-gui/src/lib/microbit-update.js
技術ドキュメント
- STK500プロトコル: https://arduino.stackexchange.com/questions/15936/what-happens-when-code-is-uploaded-using-the-bootloader
- WebSerial API: https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API
受け入れ基準
フェーズ1
- 「SmalrubotS1」メニューが表示される
- 「ファームウェアを書き込む...」サブメニューが動作する
- シリアルポート選択ダイアログが表示される
- ファームウェア書き込みが正常に完了する
- 書き込み中の進捗が表示される
- エラー発生時に適切なメッセージが表示される
フェーズ2(将来)
- 接続失敗時にファームウェア書き込み確認ダイアログが表示される
- 書き込み後に自動的に再接続が試行される
🤖 Generated with Claude Code