4 个版本 (重大更新)
0.5.0 | 2022年12月4日 |
---|---|
0.4.1 |
|
0.3.0 | 2021年5月6日 |
0.2.0 | 2021年4月14日 |
0.1.0 | 2021年2月13日 |
#694 in 硬件支持
44KB
490 行
raestro
- Pololu Micro-Maestro(6通道)伺服控制器板的 Rust 风格 API 接口
raestro
提供了一个易于使用的接口,用于与 6 通道 Maestro 进行通信。它由位于加拿大温哥华不列颠哥伦比亚大学的 UBC Bionics, Ltd. 设计团队开发和维护。
目录
序言
在继续之前,请注意以下要点
- 此库专门为 Raspberry Pi 开发。
- 请小心地将 Pololu Micro Maestro 连接到 Raspberry Pi。错误的连接可能会导致硬件永久损坏。
文档
所有公共导出都已使用示例进行了适当的文档记录,以说明关键 API 的用法。完整文档可以在此处找到。以下是一个使用 raestro
设置环境和构建项目的最小示例。
入门
硬件设置
- 将 Raspberry Pi 的电源和地线连接到 Maestro。
- 将 Raspberry Pi 的 TX 和 RX 引脚分别连接到 Maestro 的 RX 和 TX 引脚。请注意连接引脚的顺序(Pi 的 TX 连接到 Maestro 的 RX,Pi 的 RX 连接到 Maestro 的 TX)。
- 连接伺服电机的电源线。有关哪些线路是哪些的说明,可以轻松在线找到。
- 将最多 6 个伺服电机连接到可用的引脚三组之一(板的背面有关于每种引脚类型的更多信息)。
软件设置
Rust 包 rppal
为 PWM、I2C 和 UART 等协议提供用户级 API。为了为 Raspberry Pi 配置 UART,请执行以下操作
- 从
/boot/cmdline.txt
中删除console=serial0,11520
- 通过以下操作禁用蓝牙
- 将以下代码添加到
/boot/config.txt
中:dtoverlay=pi3-disable-bt
- 对于 RPi4 型号,请改为添加
dtoverlay=disable-bt
- 重启 Pi(通过关闭电源再重新打开)
- 对于 RPi4 型号,请改为添加
- 运行以下命令:
sudo systemctl disable hciuart
- 将以下代码添加到
故障排除
如果遇到权限拒绝错误,请检查您的用户权限。具体来说,您的用户必须被添加到 dialout
组。
如果由于 rppal
依赖,导致 cargo build
或 cargo test
无法执行,请检查 rppal
文档以了解如何设置 UART
。链接在此处:这里。
用法
将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
raestro = "0.3.0"
最后,创建一个新的 maestro
实例,并通过调用 Maestro::start
来初始化它。现在可以使用这个初始化后的结构体来执行对 Micro-Maestro 6-Channel 的读写操作。
use std::convert::TryInto;
use std::thread;
use std::time::Duration;
use raestro::maestro::builder::Builder;
use raestro::maestro::constants::Baudrate;
use raestro::maestro::constants::Channel
use raestro::maestro::constants::MAX_QTR_PWM;
use raestro::maestro::constants::MIN_QTR_PWM;
use raestro::maestro::Maestro;
fn main() -> ! {
// Create a new `Maestro` instance by configuring a `Builder`.
let mut maestro: Maestro = Builder::default()
.baudrate(Baudrate::Baudrate11520)
.block_duration(Duration::from_millis(100))
.try_into()
.expect("Failed to build a `maestro` instance.");
let channel = Channel::Channel0;
let pos_min = MIN_QTR_PWM;
let pos_max = MAX_QTR_PWM;
let sleep_duration = Duration::from_secs(1);
// Set the initial position of the servo at the specified channel to the specified location!
maestro.set_target(channel, pos_min).unwrap();
let position = maestro.get_position(channel).unwrap();
// Assert that the requested position is truly being broadcast on the requested channel.
assert_eq!(position, pos_min);
thread::sleep(sleep_duration);
// Move the servo back!
maestro.set_target(channel, pos_max).unwrap();
let position = maestro.get_position(channel).unwrap();
// Once again, assert that the requested position is truly being broadcast on the requested channel.
assert_eq!(position, pos_max);
thread::sleep(sleep_duration);
}
API 使用的更多示例可以在 examples
文件夹中找到。
依赖项
~0.7–1.2MB
~26K SLoC