rust操作单片机系列

第一章操作28BYJ48步进电机



前言

次文章就是一个简单的示例,初学者可以跟着步骤一步一步做。
配置说明:
系统: ubuntu
板子:STM32F103C8T6
电机驱动板:ULN2003
烧录工具:ST_LINK
步进电机:28BYJ48
杜邦线:母对母:4根;公对母6根
面包板:1块
面包板供电板:1块


第一步创建项目

环境安装

首先安装core 库(标准库剪裁版)

执行以下命令

rustup target add thumbv7m-none-eabi

在这里插入图片描述

安装打包工具

执行以下命令

cargo install cargo-binstall

在这里插入图片描述

安装二进制工具

执行以下命令

cargo install cargo-binutils

在这里插入图片描述

安装调试工具

执行以下命令

cargo binstall probe-rs-tools

在这里插入图片描述

环境变量配置

由于我这里是用的ubuntu的系统用ST-Link的时候需要配置udev 规则文件
在 /etc/udev/rules.d 文件夹里创建 probe-rs.rules文件
在这里插入图片描述
在文件中添加以下内容

# ST-LINK
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="3748", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="374b", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="374a", MODE="0666"

# CMSIS-DAP
SUBSYSTEM=="usb", ATTR{idVendor}=="c251", ATTR{idProduct}=="f001", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}==="0d28", ATTR{idProduct}=="0204", MODE="0666"

# J-Link
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0101", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0102", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0103", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0104", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0105", MODE="0666"

# FTDI
SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6010", MODE="0666"

在这里插入图片描述
添加完成之后重新加载规则

sudo udevadm control --reload-rules
sudo udevadm trigger

当刷新之后,stm32板子蓝色信号灯闪动就会停止,这就说明计算机已经连接上板子了。

搭建框架

这里可以参照github的一个示例项目创建,后续我也会把我建好的模板放在上面供大家下载参考
项目结构如下图
在这里插入图片描述
首先,命令行执行cargo new命令创建项目。
创建项目之后需要创建一个文件build.rs
之后再创建一个文件夹.cargo ,在这个文件夹里再创建一个config.toml文件

各个文件里的内容

builder.rs

fn main() {
    println!("cargo:rustc-link-arg-bins=--nmagic");
    println!("cargo:rustc-link-arg-bins=-Tlink.x");
    println!("cargo:rustc-link-arg-bins=-Tdefmt.x");
}

Cargo.toml

[package]
name = "moter28BYJ48"
version = "0.1.0"
edition = "2024"
[[bin]]
name = "moter28BYJ48"
test=false
banch=false
[dependencies]
# Change stm32f103c8 to your chip name, if necessary.
embassy-stm32 = { version = "0.4.0", features = [ "defmt", "stm32f103c8", "unstable-pac", "memory-x", "time-driver-any" ]  }
embassy-sync = { version = "0.7.2", features = ["defmt"] }
embassy-executor = { version = "0.9.0", features = ["arch-cortex-m", "executor-thread", "defmt"] }
embassy-time = { version = "0.5.0", features = ["defmt", "defmt-timestamp-uptime", "tick-hz-32_768"] }
embassy-usb = { version = "0.5.1", features = ["defmt"] }
embassy-futures = { version = "0.1.2"}

defmt = "1.0.1"
defmt-rtt = "1.0.0"

cortex-m = { version = "0.7.6", features = ["inline-asm", "critical-section-single-core"] }
cortex-m-rt = "0.7.0"
embedded-hal = "0.2.6"
panic-probe = { version = "1.0.0", features = ["print-defmt"] }
heapless = { version = "0.8", default-features = false }
nb = "1.0.0"
static_cell = "2.0.0"

[profile.dev]
opt-level = "s"

[profile.release]
debug = 2

[package.metadata.embassy]
build = [
  { target = "thumbv7m-none-eabi", artifact-dir = "out/examples/stm32f1" }
]

.cargo->config.toml

[target.'cfg(all(target_arch = "arm", target_os = "none"))']
# replace STM32F103C8 with your chip as listed in `probe-rs chip list`
runner = "probe-rs run --chip STM32F103C8"

[build]
target = "thumbv7m-none-eabi"

[env]
DEFMT_LOG = "trace"

main.rs

#![no_std]
#![no_main]

use defmt::*;
use embassy_executor::Spawner;
use embassy_stm32::gpio::{Level, Output, Speed};
use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _};

#[embassy_executor::main]
async fn main(_spawner: Spawner) {
    let p = embassy_stm32::init(Default::default());
    info!("Hello World!");

    let mut led = Output::new(p.PC13, Level::High, Speed::Low);

    loop {
        info!("high");
        led.set_high();
        Timer::after_millis(300).await;

        info!("low");
        led.set_low();
        Timer::after_millis(300).await;
    }
}

二、接线教程

下面我会把接线图展示出来,可以根据杜邦线的颜色查看怎么接线

1.stlink接stm32

接线描述如下

ST_LINK上的swclk接stm32上的swclk
ST_LINK上的swdio接stm32上的swio
ST_LINK上的gdn接stm32上的gdn
ST_LINK上的3.3V接stm32上的3V3

ST_LINK接线

如下图
在这里插入图片描述

stm32接线图

在这里插入图片描述

2.stm32与电机驱动板(ULN2003)

接线描述如下

stm32板A0接驱动板IN1
stm32板A1接驱动板IN2
stm32板A2接驱动板IN3
stm32板A3接驱动板IN4

stm32接线图

如下图
在这里插入图片描述

电机驱动板接线

在这里插入图片描述

3.电机驱动板与电机

接线如下图
在这里插入图片描述

4.电机驱动板与供电板接线

这里就直接正极接正极,负极接入负极就可以了
这里需要注意把供电板调到5V。

面包板

在这里插入图片描述

驱动板

在这里插入图片描述


运行效果

在这里插入图片描述

运行效果视频在绑定的资源里面,完整代码可直接下载,下载请点击:原码下载传送门

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐