DEV Community

Cover image for Rust on a $2 dev board
Joshua Nussbaum
Joshua Nussbaum

Posted on

6

Rust on a $2 dev board

Rust is a great option for embedded computing, especially for small devices like ESP32.

There is a very inexpensive dev board, called ESP32-C3 Super Mini which sells for ~$2 on AliExpress.

The chip is RISC-based, supports Wifi & Bluetooth, and includes a built-in LED - which we'll use in this project.

Installing Rust

First you'll need Rust on your machine.

The toolchain can be installed via Rustup, or (my preferred way) using asdf.

TIP: asdf is a great way to manage multiple versions of programming language tools.

To install with asdf:

# add rust plugin
asdf plugin-add rust https://github.com/asdf-community/asdf-rust.git

# install rust
asdf install rust 1.81.0

# set default version
asdf global rust 1.81.0
Enter fullscreen mode Exit fullscreen mode

Create the project

Let's create the project folder structure.

We can start with the template:

$> cargo generate esp-rs/esp-idf-template cargo

⚠️   Favorite `esp-rs/esp-idf-template` not found in config, using it as a git repository: https://github.com/esp-rs/esp-idf-template.git
🤷   Project Name: blink
🔧   Destination: some/path/blink ...
🔧   project-name: blink ...
🔧   Generating template ...
✔ 🤷   Which MCU to target? · esp32c3
✔ 🤷   Configure advanced template options? · false
🔧   Moving generated files into: `some/path/blink`...
🔧   Initializing a fresh Git repository
✨   Done! New project created some/path/blink

Enter fullscreen mode Exit fullscreen mode

We'll need access to the HAL (hardware abstraction layer), so install the esp-idf-hal crate too:

cd blink
cargo add esp-idf-hal
Enter fullscreen mode Exit fullscreen mode

The Code

Now add this to src/main.rs to blink the LED:

use esp_idf_hal::delay::FreeRtos;
use esp_idf_hal::gpio::*;
use esp_idf_hal::peripherals::Peripherals;
use log::info;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // enable logging
    esp_idf_svc::log::EspLogger::initialize_default();

    // get peripherals
    let peripherals = Peripherals::take()?;

    // built-in LED is GPIO8
    let mut led = PinDriver::output(peripherals.pins.gpio8)?;

    // alternate between high and low, with delay of 1s
    loop {
        info!("high");
        led.set_high()?;
        FreeRtos::delay_ms(1000);

        info!("low");
        led.set_low()?;
        FreeRtos::delay_ms(1000);
    }
}
Enter fullscreen mode Exit fullscreen mode

Running the code

Connect the dev board to USB, and then flash it with:

cargo run
Enter fullscreen mode Exit fullscreen mode

The LED should now be blinking, and the message "HIGH"/"LOW" will be displayed in the terminal.

Happy hacking ✌️

P.S. Here's the source code:
https://github.com/joshnuss/esp-blink-rs

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs