はじめに
以前 AtomVM のバージョン 0.6.6 を使ってLチカをしました。その記事をはじめてね AtomVM(1) ESP32でLチカにまとめてます。
2026年5月5日の段階で安定版の最新はこの v0.6.6 ですが、アルファ版として 0.7.0-alpha.1 が出てます。これを試してみました。結論から言うとインストールから Lチカまでは同様に出来て、なおかつちょっと良いことがありました。以下は以前の記事が前提で、おおよそ差分だけ書いてます。
使った環境
母艦は Macbook Pro M1 で macOS は Tahoe 26.4.1 です。そして Erlang が ver 28 系列でも AtomVM がいごくようになりました。
% mise ls
Tool Version Source Requested
elixir 1.19.5-otp-27
elixir 1.19.5-otp-28 ~/.config/mise/config.toml latest
erlang 27.3.4.11
erlang 28.5 ~/.config/mise/config.toml latest
rebar 3.27.0 ~/.config/mise/config.toml latest
なので AtomVM 0.6.6 を使わないなら Erlang(とそれを使う Elixir)は最新バージョンで構いません。今回は Erlang28.5 を使います。あと rebar3 も最新で大丈夫です。
処理系のAtomVM本体のインストール
今回使ったのは ver 0.7 のアルファ版AtomVM v0.7.0-alpha.1で、まだ安定リリースではありません。ちなみに以前使ったのは ver 0.6.6 AtomVM v0.6.6 で、これが安定版です。そしてこれが ver 0.6 系列の最終版になりそうです。
ESP32 をきれいにする
まず、フラッシュROMをきれいにします。以下で xxx は母艦の usb デバイスに合わせて下さい。
% esptool --chip auto --port /dev/tty.usbserial-xxx --baud 115200 erase_flash
きれいにしないとどうなるかは後述します。
処理系をダウンロードして焼く
今回の ESP32 用の AtomVM イメージは
AtomVM-esp32c2-elixir-v0.7.0-alpha.1.img です。以下で焼きます。
% esptool --chip auto --port /dev/tty.usbserial-xxx --baud 115200 --before default_reset --after hard_reset write_flash -u --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 ./AtomVM-esp32-elixir-v0.7.0-alpha.1.img
これは例によって時間がかかります。
これでAtomVM処理系がESP32のフラッシュに積まれました。
アプリケーションの作成と実行
アプリケーションも v0.6.6 同様ですが、一部だけ異なります。io.formart で古い文法を使ってて警告が出ていたのが直されたりしていました。
サンプルプログラムのダウンロード
アプリケーションは v0.6.6 同様に atomvm_examples から持ってきて、これの elixir/Blinky を使います。
ライブラリを仕込まなくて良い
これ v0.6.6 のときによくわからなくてかなり時間を溶かしたプロセスです。
これをやらなくて良くなりました。該当するファイルも AtomVM v0.7.0-alpha.1 からなくなってます。処理系のイメージに合体されたと思われます。
ただし atomvmlib-rp2-pico-v0.7.0-alpha.1.uf2 と
atomvmlib-rp2-pico2-v0.7.0-alpha.1.uf2 があります。ラズパイpicoとpico2ではまだ必要かもしれません。その場合はアプリケーションのディレクトリに atom_deps ディレクトリを掘って、そこにこれを置いておくとうまくいきそうです(私は試してません)。
ソースコードから実行可能形式を作る
以下の3行を実行します。Warning がやたらと出てくるのは v0.6.6 同様です。無視って突破できました。
% cd elixir/Blinky # サンプルプログラムのディレクトリに移動
% mix deps.get
% mix compile
% mix atomvm.packbeam
ディレクトリに Blinky.avm deps.avm priv.avm が出来てるはずです。
アプリケーションを焼いて実行
上でできた .avm ファイルを ESP32 のフラッシュROMに焼きます。
% mix atomvm.esp32.flash --port /dev/tty.usbserial-xxx
焼きおわると、リセットがかかってリブートし、Lチカがはじまります。
Hello World! を出す
elixir/Blinky/lib/Blinky.ex の start/0 関数の先頭に :io.format(~c"Hello World!~n") を書くとちゃんとプログラム実行開始時に文字列が出ていました。これも前回の v0.6.6 と同様であることの確認が取れました。
ESP32のフラッシュROMをきれいにしない場合
最初にフラッシュをクリアしました。
v0.6.6 でLチカできてる状態で、クリアせずに v0.7.0-a.1 処理系を突っ込むとどうなるでしょうか。これはちゃんと動作します。AtomVM 処理系だけが差し替わって、アプリは元の場所にあり、それを新しい処理系が実行します。
.avm 形式は BEAM形式準拠なので基本的に AtomVM の処理系に依存せずに使えるということでしょう。
アプリケーションの .avm の大きさを見てみると v0.6.6 のときは以下です。
% ls -l *.avm
-rw-r--r-- 1 yu staff 356588 5月 5 02:17 Blinky.avm
-rw-r--r-- 1 yu staff 355224 5月 5 02:17 deps.avm
-rw-r--r-- 1 yu staff 40 5月 5 02:17 priv.avm
これが v0.7.0-a.1 になると 1/5 ぐらいのサイズになってます。
% ls -l *.avm
-rw-r--r-- 1 yu staff 76952 5月 5 02:42 Blinky.avm
-rw-r--r-- 1 yu staff 75584 5月 5 02:42 deps.avm
-rw-r--r-- 1 yu staff 40 5月 5 02:42 priv.avm
処理系を見ると AtomVM-esp32-elixir-v0.6.6.img の大きさが 2197764 Byte で AtomVM-esp32-elixir-v0.7.0-alpha.1.img が 2392028 Byte になってるので、標準ライブラリ扱いの atomvmlib-v.x.x.x-avm をアプリ側に持たせずに処理系に持たせるようになったものと思います。
ちなみに処理系のバージョンを上げる前にフラッシュをきれいにしておかないと、どの処理系やアプリがいごいてるのがさっぱりわからないです。なので、最初はきれにしておいた方が良いでしょう。
まとめ
まだアルファ版ですが、AtomVM v0.7.0 はトラブルなくインストールでき、Lチカが出来ました。多くの機能が追加されているようですので、それも試していきたいと思います。