2023年5月号の「インターフェース」誌には、Rust特集が掲載されています。 その特集の1部2章では、Rusty Keysを使った入門記事が掲載されており、面白そうなので実践してみることにしました。
特に開発環境構築からHello Worldするまでは、紙面にはない依存パッケージや設定が必要だったりしたのでログを残しておこうと思います。
なぜ組込みRustか
自分の考えでは、C/C++はアセンブリに高級言語文法をあてたものと捉えています。 これはつまり、マシン制御を直接的に行いつつも、ヒューマンフレンドリーな文法を提供するものです。
そのため抽象度の高い言語のように使おうとすると使いにくい側面もあります。 近年ではマシンパワーが向上し、アプリケーション開発においてC/C++でなくてはならない状況は限定的になってきたように感じます。 そのため、可能な場面では積極的にモダンな言語や環境を採用すべきだと考えています。
しかし一方で、例えばIoTや組み込み系など、マシン制御を細かく行いたい需要はまだまだ存在します。 RustはC/C++の代替として注目されており、こうした分野の開発において非常に有望だと感じています。
RustKeys
なお、本誌にも掲載されているようにRustyKeysは元々以下に公開されている 組込みRust入門のためにキーボードファームウェアを作ってみる というプロジェクトです。
なので、上記サイトの内容を実施するのと基本は同じになります。 本誌ではこれをベースにCとの比較をしているので、気になる方は本誌を参照されるとよいかと思います。
また、以降のHello Worldまでのステップも動画で解説されている通りです。 動画では他にも色々詳しく説明されていますので、時間がある方はぜひ動画を視聴されるとよいかと思います。
ホスト環境
ここでは、先日SSD化したRaspberry Pi 5を開発環境(ホスト)として利用しています。 以下の記事ではRaspberry OSでしたが、実際はUbuntu 23.10を使っています。
実際使ってみるとArm環境は homebrew
が非対応だったり、バイナリ配信がないパッケージがあったりなど、案外がサポートされていないことが多いことがわかりました。
しかし開発環境として劣るということはないと思っていますし、今のところ不可避な問題には出会っていません。
環境構築
ハードウェア環境
キーボード用とデバッグアダプタ用にRaspberry Pi Picoが2つ必要です。
また、デバッグアダプタ用PicoのGPIOとキーボード用PicoのデバッグI/Oを繋ぐので接続できるコネクタを考慮しておくといいです。
自分の環境ではPico HとPicoを使っていますが、Hの方はデバッグI/Oにソケットがついているので、 キーボード用に使う場合はデバッグアダプタPicoのGIPOと接続する線が必要です。
なお、RustyKeysの本家サイトでは開発用のプリント基板を含めたキーボードキットが販売されています。 現在は遊舎工房さんの方で委託販売されているようですが、2024/4月現在は売り切れのようです。
Rustクロスコンパイル環境
まずRust環境をインストールします。
|
|
次に今回の開発ターゲットになるRaspberry Pi Picoのマイコン向けコンパイラを追加します。
|
|
デバッグアダプタのファームウェアビルドと書き込み
まず、 elf2uf2-rs
と probe-rs
に必要な依存パッケージをインストールします。
動画では触れられていましたが、 pkg-config
が必要なので、元々インストールされていない場合は入れておく必要があります。
|
|
次にデバッグアダプタのファームウェアをPicoのブートローダであるUF2形式に変換するためのツールをインストールします。
|
|
ここまでインストールできたら、後はファームウェアをビルドして焼くだけです。 PicoのBOOTSELボタンを押しながらホストに接続します。今回はDesktop Ubuntuを使っているのでマウントは自動でされるため省略します。
|
|
ここでは xiao_rp2040
を使っていますが、rust-dapプロジェクト以下には rp_pico
も用意されていました。
実際にはPicoを使っているので rp_pico
を使っても動作します。 rp_pico
を使う場合はGPIOが異なるので注意してください。
RustyKeys Hello Worldプロジェクト
デバッグアダプタまで用意できたので、いよいよRustyKeysのプロジェクト環境を用意していきます。
必要なツールの用意
cargo-generate
に必要な依存パッケージを追加します。
|
|
そして必要なツールをインストールしていきます。
|
|
本誌の方では probe-run
が紹介されていますが、こちらは2024/4月現在 probe-rs
にリプレイスされています。
また動画では触れられているのですが、Linux環境ではデバッグアダプタへのアクセス権がルートのみになっています。
そのためudev ruleを更新してこれを変更する必要があります。
これについては probe-rs
の公式サイトにも記載されており、必要なudev ruleの配布もされています。
For linux, udev rules are required for non admin access.
(中略)
By default, the debug probes are only accessible by users with root privileges on Linux based systems. It is recommend to use appropriate udev rules to allow users without root privileges access to the debug probes as well.
- Download the rules file and place it in /etc/udev/rules.d.
- Run udevadm control –reload to ensure the new rules are used.
- Run udevadm trigger to ensure the new rules are applied to already added devices.
ビルドと実行
ハードウェアの接続をします。デバッグアダプタ、キーボード用Picoの順にUSBに接続します。
接続の確認のために、 probe-rs list
を実行してみます。
|
|
このように表示されればOKです。
あとは、RustyKeysをビルドして実行するだけです。
|
|
まとめ
動画が非常に丁寧で、そのおかげで詰まるポイントはほとんどありませんでした。
ただし、インターフェース誌にはudev rulesについて触れられていないなど、動画を見ないで進めると情報が古かったり、省略されている箇所があることに注意が必要です。
特にudev rulesは probe-rs
のドキュメントを参照すれば解決できますが、紙面だけだとハマる可能性があります。
Rustのクレートの構成説明が非常にわかりやすかったため、この後のGPIOを監視してUSD Deviceクレートを通じてキーコードを送出する実装も簡単にできました。 せっかくなので、ちゃんと基板まで作って左手キーボードとかにしてもいいかもしれません。
組込みRustはまだまだ入門ですが、なかなか面白いです。 本誌にはまだまだ他にもやってみたい記事が色々掲載されているので、引き続き探求していきたいと思います。