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

2021/04/21に公開

こんにちは。いつもありがとうございます。
この記事は【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コンパイラを解凍し、パスを追加します。

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

20210420224859.png

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

Arduinoとシリアル接続できると下図の表示になります。

IMG_3428.JPG

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

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

感想

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

  • メモリ管理

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

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

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

Discussion