Skip to content

SmalrubotS1のファームウェア書き込み機能の実装 #52

@takaokouji

Description

@takaokouji

概要

SmalrubotS1(Arduino互換マイコンボード)のファームウェアを、スモウルビーのブラウザから直接書き込めるようにします。

背景

現在の状況

SmalrubotS1を使うには、事前に専用ファームウェア(HEXファイル)を書き込む必要があります。現在はavrdudeを使って書き込んでいますが、以下の課題があります:

  • avrdudeの知識が必要
  • 開発環境のセットアップが必要
  • 初心者にとってハードルが高い

解決策

WebSerial APIを使用して、ブラウザから直接ファームウェアを書き込めるようにします。これにより:

  • ✅ 追加ツール不要(ブラウザだけで完結)
  • ✅ 簡単な操作(ポート選択→自動書き込み)
  • ✅ 初心者でも安心

ユーザー体験(想定操作フロー)

フェーズ1: 手動書き込み(まずはここを実現)

  1. smalrubot_s1拡張機能を有効にする
  2. 「SmalrubotS1」メニューが表示される(meshV2と同様の仕組み)
  3. サブメニュー「ファームウェアを書き込む...」を選択
  4. WebSerialのシリアルポート選択ダイアログが表示される
  5. ポートを選択すると自動的に書き込みが開始される
  6. 書き込み完了

フェーズ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

現在の接続フロー:

  1. WebSerial APIでポート選択
  2. シリアルポート接続(baudRate: 19200)
  3. ハンドシェイク: reset_v2コマンドで 'S1' レスポンスを確認
  4. 各種ポート初期化

接続失敗時の動作:

  • 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に統合します。

実装場所

  1. scratch-vm拡張

    • packages/scratch-vm/src/extensions/scratch3_smalrubot_s1/index.js
    • uploadFirmware()メソッドを追加
  2. GUIメニュー

    • packages/scratch-gui/src/components/menu-bar/smalrubot-s1-menu.jsx(新規)
    • meshV2と同様の仕組みでメニュー追加
  3. 接続モーダル(将来)

    • 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

参考実装

  • micro:bit用ファームウェア転送機能
    • packages/scratch-gui/src/lib/microbit-update.js

技術ドキュメント

受け入れ基準

フェーズ1

  • 「SmalrubotS1」メニューが表示される
  • 「ファームウェアを書き込む...」サブメニューが動作する
  • シリアルポート選択ダイアログが表示される
  • ファームウェア書き込みが正常に完了する
  • 書き込み中の進捗が表示される
  • エラー発生時に適切なメッセージが表示される

フェーズ2(将来)

  • 接続失敗時にファームウェア書き込み確認ダイアログが表示される
  • 書き込み後に自動的に再接続が試行される

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions