こんにちは。いつもありがとうございます。
この記事は【Zig言語でArduino UNOのLチカ・シリアル通信が確認できた】という記事です。
Zig
Zigについてはこちらをどうぞ。
https://ziglang.org
ベースのソースコード
こちらのソースコードで確認させていただきました。
ハードウェア確認環境
Arduino UNO
ソフトウェア確認環境
こちらのmasterリリース 2021-04-20版を使いました。
ホストPCはMacなので【zig-macos-x86_64-0.8.0-dev.1983+e2cc02717.tar.xz】をダウンロードしました。
環境構築
ダウンロードしたZigコンパイラを解凍し、パスを追加します。
echo "export PATH=/Users/k-abe/zig-macos-x86_64-0.8.0-dev.1983+e2cc02717/zig:\$PATH" >> ~/.bash_profile
パスを読み込みます。
source ~/.bash_profile
zigのコンパイラにパスが通っているか確認します。
KojinoMacBook-2:~ k-abe$ zig version
0.8.0-dev.1983+e2cc02717
ダウンロードしたバージョンと同じバージョンが読み出せたのでパスは通りました。
ビルド
ベースソースコードのディレクトリに移動し(build.zigがある階層に移動)、ビルドします。
KojinoMacBook-2:~ k-abe$ cd /Users/k-abe/Documents/zig_work/avr-arduino-zig/
KojinoMacBook-2:avr-arduino-zig k-abe$ zig build
KojinoMacBook-2:avr-arduino-zig k-abe$ ls
LICENSE README.md build.zig src zig-cache
zig-cacheディレクトリ以下にelfファイルが出力されます。
出力されたファイルをfileコマンドで確認してみます。
うん。elfファイルですね。
KojinoMacBook-2:avr-arduino-zig k-abe$ file /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig
/Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped
書き込み
elfファイルができたのでArduino UNOに書き込み、動作を確認してみます。
Arduino UNOとPCをUSBケーブルで接続します。
書き込みの際に必要なのでデバイス名を下記のコマンドで取得します。
KojinoMacBook-2:avr-arduino-zig k-abe$ ls /dev/cu.usb*
/dev/cu.usbmodem141401
書き込みツールavrdudeで書き込みます。
KojinoMacBook-2:avr-arduino-zig k-abe$ avrdude -patmega328p -carduino -P/dev/cu.usbmodem141401 -b115200 -D -Uflash:w:/Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig:e
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "/Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig"
avrdude: writing flash (1048 bytes):
Writing | ################################################## | 100% 0.18s
avrdude: 1048 bytes of flash written
avrdude: verifying flash memory against /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig:
avrdude: load data flash data from input file /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig:
avrdude: input file /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig contains 1048 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.15s
avrdude: verifying ...
avrdude: 1048 bytes of flash verified
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.
正常に書き込めたようなので動作確認してみます。
動作確認
ベースソースコードはLチカとシリアルデータ送信をおこなっています。
シリアルターミナルでArduinoに接続します。シリアルターミナルはminicomを使いました。ビットレートは115200を指定しています。
KojinoMacBook-2:avr-arduino-zig k-abe$ minicom -D /dev/cu.usbmodem141401 -b 115200
起動時のシリアルメッセージ、!から~までのASCIIコード、Lチカが確認できました。
確認内容とソースコード/src/main.zigの処理内容が同じことを確認できました。
感想
Zig・Arduino UNOでもLチカ・シリアル通信を確認できました。
最近はRust学習を始めたこともありRustのコードを多くみていましたが下記が違うと思いました。
- メモリ管理
Zigのベースソースコードはmain関数内部でグローバル変数chをインクリメントしシリアルデータとして送信しています。
Rustではグローバル変数をunsafeで括らないとビルドエラーになってしました。
ZigはRustほどメモリ管理に厳密ではないのだなぁ、と思いました。
良いか悪いかは置いておいて、ZigはC言語経験者がそれほど違和感なく使え、学べるかもしれないと思いました。
組込み開発現場でプログラミング言語の選択肢が増え、プロジェクト・製品・開発スタイル(新規?派生?)により最適な選定が行われればなぁ、と思います。
最後まで読んでいただいてありがとうございました。