ファームウェアの実装
ruduino SDK を使えばファームウェアはシュッと書ける
https://github.com/avr-rust/ruduino
Arduino Uno は atmega328p なのでそのファイルを参照する。
https://github.com/avr-rust/ruduino/blob/master/src/cores/atmega328p.rs
Pin Mapping は以下のページにある。例えば digital pin の 5 番は PD5 なのでファイル内でそれを探せば良い。
https://www.arduino.cc/en/Hacking/PinMapping168
ビルド環境の準備
AVR-Rust というものを使う。これで cargo コマンドで AVR のビルド環境が構築できる。
https://www.avr-rust.com/
インストールは以下を参照
https://book.avr-rust.com/002.1-installing-required-third-party-tools.html
AVR 向けの tool chain は nightly にしかないので以下のようにして nightly ビルドの環境を整える必要がある。
$ rustup update
$ rustup toolchain install nightly
$ rustup component add rust-src --toolchain nightly
$ rustup override set nightly
Arduino Uno (atmega328p) はビルトインのターゲットに存在しないので avr-atmega328p.json という名前でファイルを作りカスタムターゲットを用意する。
{
"arch": "avr",
"cpu": "atmega328p",
"data-layout": "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8",
"env": "",
"executables": true,
"linker": "avr-gcc",
"linker-flavor": "gcc",
"linker-is-gnu": true,
"llvm-target": "avr-unknown-unknown",
"no-compiler-rt": true,
"os": "unknown",
"position-independent-executables": false,
"exe-suffix": ".elf",
"eh-frame-header": false,
"pre-link-args": {
"gcc": ["-mmcu=atmega328p"]
},
"late-link-args": {
"gcc": ["-lgcc", "-lc"]
},
"target-c-int-width": "16",
"target-endian": "little",
"target-pointer-width": "16",
"vendor": "unknown"
}
ここまで進めると以下のようにビルドができるようになる。 target/avr-atmega328p/release/{Cargo.toml の name}.elf
に実行ファイルが生成される。
$ export AVR_CPU_FREQUENCY_HZ=16000000
$ cargo build -Z build-std=core --target avr-atmega328p.json --release
ファームウェアの書き込みは以下のコマンドでできる。
$ sudo avrdude -p m328p -c arduino -P {Arduino が接続されているポート} -U flash:w:{実行ファイルへのパス}:e