Raspberry Pi Picoと同じチップ(RP2040)を載せたSeed XIAO RP2040というマイコンボードで、Rustを使ってLチカしてみます。
組み込みRustは初めてなので、まずはあらかじめ用意されたテンプレートをもとに動かしていきます。
rp2040-project-template
rp-rsというRPシリーズのマイコン(RP2040しかないですが)をRustで扱えるようにするコミュニティがrp2040-project-templateというテンプレートを公開しているので、今回はこれを利用します。
下記を実行するとblinkyディレクトリの中に雛形が生成されます。
% cargo generate --git https://github.com/rp-rs/rp2040-project-template --branch main --name blinky
まずは、cargo build
して無事にビルドできることを確認します。手元の環境ではうまくビルドすることができました。
XIAO RP2040への書き込み
Seeed社の日本法人のブログ記事によると、XIAO RP2040はUSB接続時にBOOTボタンとRESETボタンを同時押しすることでストレージデバイスとして認識できるようになり、そこにUF2ファイルを書き込むことでファームウェアの書き込みを行うことができるようです。
今回使ったテンプレートではデフォルトではUF2書き込みを行うようになっていないので、.cargo/config.toml
を編集してUF2書き込みを行うようにします。
--- a/blinky/.cargo/config.toml
+++ b/blinky/.cargo/config.toml
@@ -4,9 +4,9 @@
# - cargo embed offers flashing, rtt, defmt and a gdb server via a hardware debugger
# it is configured via the Embed.toml in the root of this project
# - elf2uf2-rs loads firmware over USB when the rp2040 is in boot mode
-runner = "probe-run --chip RP2040"
+# runner = "probe-run --chip RP2040"
# runner = "cargo embed"
-# runner = "elf2uf2-rs -d"
+runner = "elf2uf2-rs -d"
rustflags = [
"-C", "linker=flip-link",
これで、cargo run
するとXIAO RP2040への書き込みが行われ、青いLEDが点滅するようになりました。
LED操作の編集
main.rs
の中の下記の部分でLED操作を行なっています。rp-pico内でGPIO 25にledという名前が付けられているため、このような記述でGPIO 25に繋がっている青色LEDを操作しています(ちなみにXIAOではhigh時に消灯、low時に点灯するため下記のログ記述は逆です)。
let mut led_pin = pins.led.into_push_pull_output();
loop {
info!("on!");
led_pin.set_high().unwrap();
delay.delay_ms(500);
info!("off!");
led_pin.set_low().unwrap();
delay.delay_ms(500);
}
XIAOのLEDは青の他にも緑(16)と赤(17)があります。せっかくなので緑も一緒に操作してみます。
--- a/blinky/src/main.rs
+++ b/blinky/src/main.rs
@@ -55,12 +55,16 @@ fn main() -> ! {
let mut led_pin = pins.led.into_push_pull_output();
+ let mut green_led_pin = pins.gpio16.into_push_pull_output();
+
loop {
info!("on!");
led_pin.set_high().unwrap();
+ green_led_pin.set_low().unwrap();
delay.delay_ms(500);
info!("off!");
led_pin.set_low().unwrap();
+ green_led_pin.set_high().unwrap();
delay.delay_ms(500);
}
}
青の時と違ってpins.led
のような洒落た名前はないのでpins.gpio16
でアクセスしています。
これをビルドして書き込むことで、青と緑のLEDが交互に点滅するようになりました。