FREE Reverse Engineering Self-Study Course HERE
Async robot firmware for Waveshare Pico2Go (RP2350-Plus) in Embedded Rust with Embassy; leverages RP2350 for reliable motor control plus integrated IR remote support and robust capabilities.
-
Waveshare Pico2Go Mobile Robot (Amazon B0FFH15ZW4)
- Mobile robot platform based on the RP2350-Plus microcontroller, compatible with Raspberry Pi Pico series.
- Features: Self-driving, remote control, includes RP2350-Plus control board, rich Wiki resources, and expansion options.
- Ideal for embedded robotics, motor control, and IR remote experiments.
-
PAOWANG 14500 Rechargeable Battery 3.7V 2500mAh + Charger (Amazon B0CK1PWMTT)
- 4-pack of 14500 lithium-ion rechargeable batteries (button top) with charger.
- 3.7V, 2500mAh high capacity, suitable for powering the Pico2Go robot and similar embedded projects.
- Rechargeable, long life, and includes charger for convenience.
# Put your RP2350 in BOOTSEL mode (hold button while plugging USB)
cargo run --releaseThat's it! Cargo will build and flash automatically.
- Motor Control: PWM-based speed control with direction pins
- NEC IR Protocol Decoder: Async IR remote receiver
- Embassy Async Runtime: Clean async/await implementation for RP2350
- PWMA: GPIO 16
- AIN2: GPIO 17
- AIN1: GPIO 18
- BIN1: GPIO 19
- BIN2: GPIO 20
- PWMB: GPIO 21
- IR Receiver: GPIO 5
This project uses Embassy from git (main branch) since RP2350 support is very recent.
# Install the ARM Cortex-M33 target (if not already installed)
rustup target add thumbv8m.main-none-eabihf
# Build
cargo build --releaseThe project is configured to automatically flash via BOOTSEL mode:
# 1. Hold BOOTSEL button on RP2350 and plug in USB
# 2. Run cargo
cargo run --releaseThe build process will:
- Build the release binary
- Convert ELF to UF2 using picotool
- Auto-detect the mounted RP2350 drive
- Copy the UF2 and auto-reset the device
Requirements:
picotoolmust be installed:brew install picotool
If you have a debug probe connected, update .cargo/config.toml to use probe-rs:
[target.thumbv8m.main-none-eabihf]
runner = "probe-rs run --chip RP2350"Then:
cargo run --releaseThe Cargo.toml uses git dependencies for Embassy crates to get the latest RP2350 support.
Once RP2350 support is published to crates.io, you can switch to versioned dependencies.
- Async/Await: IR decoding runs asynchronously using Embassy timers
- Type Safety: Rust's type system prevents many common embedded bugs
- No Blocking Loops: Uses
embassy_time::with_timeoutfor clean timeout handling - PWM Abstraction: Higher-level PWM API from embassy-rp
0x18: Forward0x08: Left0x1C: Stop0x5A: Right0x52: Backward0x09: Reset speed to 50%0x15: Increase speed0x07: Decrease speed
Auto-stop after 800ms of no IR signal.
