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

こんにちは。いつもありがとうございます。
この記事は【Zig言語でArduino UNOのLチカ・シリアル通信が確認できた】という記事です。

### Zig
Zigについてはこちらをどうぞ。
https://ziglang.org


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

https://github.com/FireFox317/avr-arduino-zig


### ハードウェア確認環境
Arduino UNO

### ソフトウェア確認環境
こちらのmasterリリース 2021-04-20版を使いました。

https://ziglang.org/download/

ホストPCはMacなので【zig-macos-x86_64-0.8.0-dev.1983+e2cc02717.tar.xz】をダウンロードしました。


### 環境構築
ダウンロードしたZigコンパイラを解凍し、パスを追加します。

<pre><code>echo "export PATH=/Users/k-abe/zig-macos-x86_64-0.8.0-dev.1983+e2cc02717/zig:\$PATH" >> ~/.bash_profile</pre></code>

パスを読み込みます。

<pre><code>source ~/.bash_profile</pre></code>

zigのコンパイラにパスが通っているか確認します。

<pre><code>KojinoMacBook-2:~ k-abe$ zig version
0.8.0-dev.1983+e2cc02717
</pre></code>

ダウンロードしたバージョンと同じバージョンが読み出せたのでパスは通りました。

### ビルド
ベースソースコードのディレクトリに移動し(build.zigがある階層に移動)、ビルドします。

<pre><code>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
</pre></code>

zig-cacheディレクトリ以下にelfファイルが出力されます。

![20210420224859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/6d03cd1a-2b60-9fd0-fc33-f79dbc5235da.png)

出力されたファイルをfileコマンドで確認してみます。

うん。elfファイルですね。

<pre><code>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
</pre></code>


### 書き込み
elfファイルができたのでArduino UNOに書き込み、動作を確認してみます。

Arduino UNOとPCをUSBケーブルで接続します。

書き込みの際に必要なのでデバイス名を下記のコマンドで取得します。

<pre><code>KojinoMacBook-2:avr-arduino-zig k-abe$ ls /dev/cu.usb*
/dev/cu.usbmodem141401
</pre></code>

書き込みツールavrdudeで書き込みます。
<pre><code>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.
</pre></code>

正常に書き込めたようなので動作確認してみます。


### 動作確認
ベースソースコードはLチカとシリアルデータ送信をおこなっています。

シリアルターミナルでArduinoに接続します。シリアルターミナルはminicomを使いました。ビットレートは115200を指定しています。

<pre><code>KojinoMacBook-2:avr-arduino-zig k-abe$ minicom -D /dev/cu.usbmodem141401 -b 115200</pre></code>

![IMG_3428.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/ec952276-6205-d3bd-80f5-c13632523ed5.jpeg)

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

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


### 感想
Zig・Arduino UNOでもLチカ・シリアル通信を確認できました。
最近はRust学習を始めたこともありRustのコードを多くみていましたが下記が違うと思いました。

* メモリ管理

Zigのベースソースコードはmain関数内部でグローバル変数chをインクリメントしシリアルデータとして送信しています。
Rustではグローバル変数をunsafeで括らないとビルドエラーになってしました。
ZigはRustほどメモリ管理に厳密ではないのだなぁ、と思いました。
良いか悪いかは置いておいて、ZigはC言語経験者がそれほど違和感なく使え、学べるかもしれないと思いました。

組込み開発現場でプログラミング言語の選択肢が増え、プロジェクト・製品・開発スタイル(新規?派生?)により最適な選定が行われればなぁ、と思います。

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