Featured image of post RustyKeysで組込みRust入門:Raspberry Pi 5ホストで開発環境構築からHello Worldまで

RustyKeysで組込みRust入門:Raspberry Pi 5ホストで開発環境構築からHello Worldまで

2023年5月号の「インターフェース」誌には、Rust特集が掲載されています。 その特集の1部2章では、Rusty Keysを使った入門記事が掲載されており、面白そうなので実践してみることにしました。

Interface(インターフェース) 2023年 05 月号 Amazonで見る

特に開発環境構築からHello Worldするまでは、紙面にはない依存パッケージや設定が必要だったりしたのでログを残しておこうと思います。

なぜ組込みRustか

自分の考えでは、C/C++はアセンブリに高級言語文法をあてたものと捉えています。 これはつまり、マシン制御を直接的に行いつつも、ヒューマンフレンドリーな文法を提供するものです。

そのため抽象度の高い言語のように使おうとすると使いにくい側面もあります。 近年ではマシンパワーが向上し、アプリケーション開発においてC/C++でなくてはならない状況は限定的になってきたように感じます。 そのため、可能な場面では積極的にモダンな言語や環境を採用すべきだと考えています。

しかし一方で、例えばIoTや組み込み系など、マシン制御を細かく行いたい需要はまだまだ存在します。 RustはC/C++の代替として注目されており、こうした分野の開発において非常に有望だと感じています。

RustKeys

なお、本誌にも掲載されているようにRustyKeysは元々以下に公開されている 組込みRust入門のためにキーボードファームウェアを作ってみる というプロジェクトです。

はじめに - RustyKeys ビルドガイド

なので、上記サイトの内容を実施するのと基本は同じになります。 本誌ではこれをベースにCとの比較をしているので、気になる方は本誌を参照されるとよいかと思います。

また、以降のHello Worldまでのステップも動画で解説されている通りです。 動画では他にも色々詳しく説明されていますので、時間がある方はぜひ動画を視聴されるとよいかと思います。

ホスト環境

ここでは、先日SSD化したRaspberry Pi 5を開発環境(ホスト)として利用しています。 以下の記事ではRaspberry OSでしたが、実際はUbuntu 23.10を使っています。

日本でもついに待望のRaspberry Pi 5が発売されました。 この最新モデルは、前作のRaspberry Pi 4のスペックを倍以上に引き上げ、20
Raspberry Pi 5をNVMe SSD起動でデスクトップPC化

実際使ってみるとArm環境は homebrew が非対応だったり、バイナリ配信がないパッケージがあったりなど、案外がサポートされていないことが多いことがわかりました。

しかし開発環境として劣るということはないと思っていますし、今のところ不可避な問題には出会っていません。

環境構築

ハードウェア環境

キーボード用とデバッグアダプタ用にRaspberry Pi Picoが2つ必要です。

また、デバッグアダプタ用PicoのGPIOとキーボード用PicoのデバッグI/Oを繋ぐので接続できるコネクタを考慮しておくといいです。

自分の環境ではPico HとPicoを使っていますが、Hの方はデバッグI/Oにソケットがついているので、 キーボード用に使う場合はデバッグアダプタPicoのGIPOと接続する線が必要です。

なお、RustyKeysの本家サイトでは開発用のプリント基板を含めたキーボードキットが販売されています。 現在は遊舎工房さんの方で委託販売されているようですが、2024/4月現在は売り切れのようです。

Rustクロスコンパイル環境

まずRust環境をインストールします。

1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

次に今回の開発ターゲットになるRaspberry Pi Picoのマイコン向けコンパイラを追加します。

1
rustup target add thumbv6m-none-eabi

デバッグアダプタのファームウェアビルドと書き込み

まず、 elf2uf2-rsprobe-rs に必要な依存パッケージをインストールします。 動画では触れられていましたが、 pkg-config が必要なので、元々インストールされていない場合は入れておく必要があります。

1
sudo apt install -y libusb-1.0-0-dev libudev-dev pkg-config

次にデバッグアダプタのファームウェアをPicoのブートローダであるUF2形式に変換するためのツールをインストールします。

1
cargo install elf2uf2-rs

ここまでインストールできたら、後はファームウェアをビルドして焼くだけです。 PicoのBOOTSELボタンを押しながらホストに接続します。今回はDesktop Ubuntuを使っているのでマウントは自動でされるため省略します。

1
2
3
git clone git@github.com:ciniml/rust-dap.git
cd rust-dap/boards/xiao_rp2040
cargo run --release

ここでは xiao_rp2040 を使っていますが、rust-dapプロジェクト以下には rp_pico も用意されていました。 実際にはPicoを使っているので rp_pico を使っても動作します。 rp_pico を使う場合はGPIOが異なるので注意してください。

RustyKeys Hello Worldプロジェクト

デバッグアダプタまで用意できたので、いよいよRustyKeysのプロジェクト環境を用意していきます。

必要なツールの用意

cargo-generate に必要な依存パッケージを追加します。

1
sudo apt install libssl-dev

そして必要なツールをインストールしていきます。

1
cargo install probe-rs flip-link cargo-generate

本誌の方では probe-run が紹介されていますが、こちらは2024/4月現在 probe-rs にリプレイスされています。

また動画では触れられているのですが、Linux環境ではデバッグアダプタへのアクセス権がルートのみになっています。 そのためudev ruleを更新してこれを変更する必要があります。 これについては probe-rs の公式サイトにも記載されており、必要なudev ruleの配布もされています。

probe-rs - Probe Setup

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.

  1. Download the rules file and place it in /etc/udev/rules.d.
  2. Run udevadm control –reload to ensure the new rules are used.
  3. Run udevadm trigger to ensure the new rules are applied to already added devices.

ビルドと実行

ハードウェアの接続をします。デバッグアダプタ、キーボード用Picoの順にUSBに接続します。

接続の確認のために、 probe-rs list を実行してみます。

1
2
The following debug probes were found:
[0]: CMSIS-DAP (VID: 6666, PID: 4444, Serial: xiao-rp2040, CmsisDap)

このように表示されればOKです。

あとは、RustyKeysをビルドして実行するだけです。

1
2
3
git clone git@github.com:KOBA789/rusty-keys.git
cd rusty-keys/firmware/hello
cargo run

まとめ

動画が非常に丁寧で、そのおかげで詰まるポイントはほとんどありませんでした。 ただし、インターフェース誌にはudev rulesについて触れられていないなど、動画を見ないで進めると情報が古かったり、省略されている箇所があることに注意が必要です。 特にudev rulesは probe-rs のドキュメントを参照すれば解決できますが、紙面だけだとハマる可能性があります。

Rustのクレートの構成説明が非常にわかりやすかったため、この後のGPIOを監視してUSD Deviceクレートを通じてキーコードを送出する実装も簡単にできました。 せっかくなので、ちゃんと基板まで作って左手キーボードとかにしてもいいかもしれません。

組込みRustはまだまだ入門ですが、なかなか面白いです。 本誌にはまだまだ他にもやってみたい記事が色々掲載されているので、引き続き探求していきたいと思います。

Built with Hugo
テーマ StackJimmy によって設計されています。