#raspberry-pi #pololu #maestro #hardware-interface #6-channel #servo-controller

raestro

为 Pololu Micro-Maestro(6通道)伺服控制器板提供的 Rust 风格 API 接口。为 Raspberry Pi 开发。

4 个版本 (重大更新)

0.5.0 2022年12月4日
0.4.1 2022年11月27日
0.3.0 2021年5月6日
0.2.0 2021年4月14日
0.1.0 2021年2月13日

#694 in 硬件支持

MIT 许可证

44KB
490

raestro - Pololu Micro-Maestro(6通道)伺服控制器板的 Rust 风格 API 接口

build_status docs MIT licensed

raestro 提供了一个易于使用的接口,用于与 6 通道 Maestro 进行通信。它由位于加拿大温哥华不列颠哥伦比亚大学的 UBC Bionics, Ltd. 设计团队开发和维护。

目录

序言

在继续之前,请注意以下要点

  • 此库专门为 Raspberry Pi 开发。
  • 请小心地将 Pololu Micro Maestro 连接到 Raspberry Pi。错误的连接可能会导致硬件永久损坏。

文档

所有公共导出都已使用示例进行了适当的文档记录,以说明关键 API 的用法。完整文档可以在此处找到。以下是一个使用 raestro 设置环境和构建项目的最小示例。

入门

硬件设置

  1. 将 Raspberry Pi 的电源和地线连接到 Maestro。
  2. 将 Raspberry Pi 的 TX 和 RX 引脚分别连接到 Maestro 的 RX 和 TX 引脚。请注意连接引脚的顺序(Pi 的 TX 连接到 Maestro 的 RX,Pi 的 RX 连接到 Maestro 的 TX)。
  3. 连接伺服电机的电源线。有关哪些线路是哪些的说明,可以轻松在线找到。
  4. 将最多 6 个伺服电机连接到可用的引脚三组之一(板的背面有关于每种引脚类型的更多信息)。

软件设置

Rust 包 rppal 为 PWM、I2C 和 UART 等协议提供用户级 API。为了为 Raspberry Pi 配置 UART,请执行以下操作

  1. /boot/cmdline.txt 中删除 console=serial0,11520
  2. 通过以下操作禁用蓝牙
    • 将以下代码添加到 /boot/config.txt 中:dtoverlay=pi3-disable-bt
      • 对于 RPi4 型号,请改为添加 dtoverlay=disable-bt
      • 重启 Pi(通过关闭电源再重新打开)
    • 运行以下命令:sudo systemctl disable hciuart

故障排除

如果遇到权限拒绝错误,请检查您的用户权限。具体来说,您的用户必须被添加到 dialout 组。

如果由于 rppal 依赖,导致 cargo buildcargo 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