January 15, 2023

RustとSeeed XIAO RP2040でLチカ

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が交互に点滅するようになりました。

© Shun Takebayashi