Zig × Arduino UnoでLチカ・シリアル通信できた件

Zig言語でArduino UNOのLチカ、シリアル通信が確認できた、という記事です。

Zig

Zigについてはこちらをどうぞ。

Home ⚡ Zig Programming Language

ベースのソースコード

こちらのソースコードで確認させていただきました。

GitHub - FireFox317/avr-arduino-zig: Arduino using Zig!

ハードウェア確認環境

Arduino UNO

ソフトウェア確認環境

こちらのmasterリリース 2021-04-20版を使いました。

Download ⚡ Zig Programming Language

ホスト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ファイルが出力されます。

f:id:gracehime:20210420224859p:plain
実行ファイル出力先

出力されたファイルを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

f:id:gracehime:20210420230656j:plain
シリアルデータ表示

起動時のシリアルメッセージ、!から~までのASCIIコード、Lチカが確認できました。

確認内容とソースコード/src/main.zigの処理内容が同じことを確認できました。

感想

Zig・Arduino UNOでもLチカ・シリアル通信を確認できました。

最近はRust学習を始めたこともありRustのコードを多くみていましたが下記が違うと思いました。

  • メモリ管理

Zigのベースソースコードはmain関数内部でグローバル変数chをインクリメントしシリアルデータとして送信しています。

Rustではグローバル変数をunsafeで括らないとビルドエラーになってしました。

ZigはRustほどメモリ管理に厳密ではないのだなぁ、と思いました。

良いのか悪いかは置いておいて、ZigはC言語経験者がそれほど違和感なく使え、学べるかもしれないと思いました。

最後まで読んでいただいてありがとうございました。