GitHub Codespaces betaでESP32(ESP-IDF)開発をする

概要

GitHubから「Welcome to Codespaces!」というメールが届き、そういえばβ版に申し込んだなと思い出しました。ちょっとだけ触ってみたので、ご紹介したいと思います。

Codespacesとは?

GitHubのファイルをブラウザ上のVisual Studio Codeで編集できるサービスです。そして開発環境自体をDockerイメージで指定することができます。つまり任意のDockerイメージの開発環境を使って、GitHubのファイルを編集できるサービスです。

使い方

上記のページからベータ版に申し込むと、そのうちメールがきて使えるようになるはずです。現在は無料で、2つまでの環境を立ち上げることができるみたいです。

使ってみる

テスト用に新しいリポジトリを作成してみました。Codeの中に「Open with Codespaces」が増えていますので、こちらを選択します。

最初は環境がないので、下にある「New codespace」で作成します。

くるくるくると環境を作り始めますのでしばし待ちます。

完成しました! VSCodeそのものですね。日本語化したかったのですが、アプリ版とちょっと設定が違うようで、できませんでした。

編集してみる

README.mdを編集してみました。左下の設定ボタンから「Command Palette…」を選択してコマンドパレットを開きます。Windows環境だとCtrl+Shift+Pなのですが、ブラウザの印刷が開いちゃいます。。。

こんな感じでプレビューも出したりできます。このへんはvscodeそのままですね。

編集をして差分ができると、一番左のメニューバーに差分ありの表示がでます。中をみてみると変更されているファイルの一覧と、クリックすると差分がわかるようになっています。

右クリックすると上記のようなメニューがでました。

ステージに追加してからコミットしてみましょう。これはGitの操作でgit add相当がステージに追加ですね。

コミットされて差分がなくなりました。この状態ではまだGitHubには反映されていません。

メニューからPUSHしてみます。

青い線が右に移動するアニメーションが動きます。思ったよりPUSHには時間がかかりました。

反映されました!

ESP-IDFの開発を行う

さて、テキストの編集であればDockerイメージなど必要なく、プレーンな環境で編集ができます。しかしコンパイラなどが必要な開発の場合にはDockerイメージを指定して、開発環境を整える必要があります。

ESP32のDockerイメージ「espressif/idf:release」を含んでいるファイルをGitHubで検索したところ、以下のリポジトリを発見しました!

おー、ズバリありますね。このリポジトリを使って開発のテストをしてみたいと思います。

早速開いてみます。書き込み権限がないので、フォークすると言われていますね。本当はフォークするか、テンプレートとして新規作成からのほうが正式な気がします。

くるくる作成がまわりはじめました。今回はBuild ContainerがあってDockerイメージまわりの処理がはしっていますね。さっきより時間がかかると思います。

立ち上がりました。デフォルトはLチカのBlink Exampleがはいっています。

一番したのメニューにある、設定ボタンを押します。

Menuconfigが立ち上がりました。ESP-IDF4.1とEspressif IDFの拡張が入っていますので、グラフィカルなきれいな画面ですね。

M5StickCで動かしたいのでGPIOを10に変更してみます。この状態で同じようにビルドボタンを押してビルドしてみます。

ターミナルのタスクをみるとビルドが進んでいるのがわかると思います。しかし結構重いです、、、ESP-IDFは初回コンパイルは重いので仕方ないですね。

無事終わりました。さて、この状態から端末にファームウエアを転送したいのですが、ブラウザ経由なのでシリアルケーブルで通信することはできません。

そこでここからはかなり面倒な方法になります。。。

serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB1: [Errno 2] No such file or directory: '/dev/ttyUSB1'
The terminal process "sh '-c', '/opt/esp/python_env/idf4.1_py3.6_env/bin/python /opt/esp/idf/components/esptool_py/esptool/esptool.py -p /dev/ttyUSB1 -b 115200 --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x8000 partition_table/partition-table.bin 0x1000 bootloader/bootloader.bin 0x10000 blink.bin'" terminated with exit code: 1.

ビルドの隣にあるFlashボタンを押すと書き込みが走ります。シリアルが見つからないとエラーが発生します。

esptool.py -p /dev/ttyUSB1 -b 115200 --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x8000 partition_table/partition-table.bin 0x1000 bootloader/bootloader.bin 0x10000 blink.bin'

転送に必要なコマンドとファイルを抜き出します。

  • partition-table.bin
  • bootloader.bin
  • blink.bin

の3ファイルが必要そうですね。

ファイル一覧から探して、右クリックからダウンロードします。

C:\Users\%username%\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\2.6.1\esptool.exe -p COM3 -b 1500000 --after hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size detect 0x8000 partition-table.bin 0x1000 bootloader.bin 0x10000 blink.bin

Windows上で転送するコマンドに変更します。

転送できました。M5StickCのLEDがチカチカすれば成功です!

課題

シリアル転送がどうしてもできないので、そこは工夫する必要があります。OTAなどを組合わえないと、このままだとちょっと厳しそうです。

たぶん別サーバーにバイナリを転送して、そのファイルをOTAでダウンロードかな? ESP32から他のESP32にシリアル経由で書き込むESP-IDF実装例があるので、それを使えばファイルをダウンロードして、他のESP32に書き込むツールなどが作れる気もします。

仕組み確認

このファイルが肝みたいです。

{
    "$schema": "https://raw.githubusercontent.com/microsoft/vscode/master/extensions/configuration-editing/schemas/devContainer.schema.json",
    "name": "ESP-IDF project",
    "image": "espressif/idf:release-v4.1",
    "extensions": [
        "espressif.esp-idf-extension"
    ],
    "containerEnv": {
        "IDF_CCACHE_ENABLE": "1",
    },
    "settings": {
        "idf.espIdfPath": "/opt/esp/idf",
        "idf.toolsPath": "/opt/esp",
        "idf.pythonBinPath": "/opt/esp/python_env/idf4.1_py3.6_env/bin/python",
        "idf.customExtraPaths": "/opt/esp/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin:/opt/esp/tools/xtensa-esp32s2-elf/esp-2020r3-8.4.0/xtensa-esp32s2-elf/bin:/opt/esp/tools/esp32ulp-elf/2.28.51-esp-20191205/esp32ulp-elf-binutils/bin:/opt/esp/tools/esp32s2ulp-elf/2.28.51-esp-20191205/esp32s2ulp-elf-binutils/bin:/opt/esp/tools/cmake/3.13.4/bin:/opt/esp/tools/openocd-esp32/v0.10.0-esp32-20191114/openocd-esp32/bin:/opt/esp/python_env/idf4.1_py3.6_env/bin:/opt/esp/idf/tools",
        "idf.customExtraVars": "{\"OPENOCD_SCRIPTS\":\"/opt/esp/tools/openocd-esp32/v0.10.0-esp32-20191114/openocd-esp32/share/openocd/scripts\"}",
        "idf.saveScope": 2,
    }
}

このファイルで開発環境の設定をしています。imageでDockerイメージを指定して、extensionsでデフォルトで入る拡張を指定していますね。あとはPathまわりの処理かな?

まとめ

結構便利そうな機能ですね。とはいえ、組み込み系機材で使うのには最後の転送がネックです。。。もう少ししたらいろいろ選択肢がでてくるかもしれませんね。

あとCodespacesは現在無料ですが、有料化した場合にはちょっと手が出ないかもな、、、無料枠があれば使うかもしれません!

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。