17个稳定版本
2.0.6 | 2022年10月2日 |
---|---|
2.0.5 | 2021年4月1日 |
2.0.4 | 2020年10月27日 |
2.0.2 | 2020年7月7日 |
1.2.2 | 2020年7月5日 |
在嵌入式开发中排名66
每月下载量39次
64KB
756 行
通用TM1637 GPIO驱动器
适用于TM1637微控制器的通用GPIO驱动器,主要用于教育目的。例如,AZ-Delivery内建的4位7段显示器中的TM1637 (链接)。通用意味着它不依赖于特定的GPIO接口。你可以自己选择GPIO接口/库。
TL;DR:最小配置
Cargo.toml
[dependencies]
tm1637-gpio-driver = "<insert latest version>"
# or if you need no_std
tm1637-gpio-driver = { version = "<insert latest version>", default-features = false }
代码
use std::thread::sleep;
use std::time::Duration;
use tm1637_gpio_driver::gpio_api::setup_gpio_cdev;
use tm1637_gpio_driver::TM1637Adapter;
// example that definitely works on Raspberry Pi
fn main() {
// use any GPIO pin you want. This is the number of the pin on the board.
let (clk_pin, dio_pin) = (18, 23);
let bit_delay_fn = Box::from(|| sleep(Duration::from_micros(10)));
let tm1637display = setup_gpio_cdev(clk_pin, dio_pin, bit_delay_fn, "/dev/gpiochip0");
// display "1 2 3 4"
let data: [u8; 4] = [
TM1637Adapter::encode_digit(1),
TM1637Adapter::encode_digit(2),
TM1637Adapter::encode_digit(3),
TM1637Adapter::encode_digit(4),
];
tm1637display.write_segments_raw(&data, 0);
}
无std
此crate使用extern crate alloc
(核心库),因此在嵌入式系统中需要分配器。在#![no_std]
中,您必须禁用Cargo.toml
中的默认功能。
如果其他显示器使用与数据表中指定的相同I2C-like串行总线协议的TM1637微控制器,则此驱动器也可以与这些显示器一起使用。
我创建这个库/驱动器是为了娱乐和学习新事物!
看看我用树莓派和我用普通GPIO引脚制作的这个演示(GIF)
移动文本
带闪烁的双点时间
这是如何工作的?我该如何为这个设备编写驱动程序?
这是我第一次编写(超级简单基本)类型的设备驱动程序。到目前为止,我对微控制器的经验并不多。经过一段时间,我通过查看数据表了解了它的工作原理。也请查看我的代码!我尽量做了尽可能多的注释。
我该如何使用它?
你可以在github仓库中找到代码示例!
我的驱动/库不依赖于特定的GPIO接口。您可以使用crates.io: wiringpi或crates.io: gpio等示例。我强烈推荐crates.io: gpio_cdev。我在我的Raspberry Pi上测试过它们。我的TM1637Adapter
需要作为参数的函数/闭包。这些函数是写入所需引脚高/低的包装器。
在模块fourdigit7segdis
中,还有针对4位7段显示屏的实用函数。您可以使用它们,从中学习,或者仅在上层驱动程序之上编写自己的函数。
要将此驱动程序添加到您的项目中,只需将crate添加到您的Rust项目中。
支持的GPIO接口/libs/crates
正如我之前所说的,这个crate与访问GPIO的特定策略无关。但我提供了以下列出的不同策略的几个设置函数(所有这些都需要标准库)。要使用它们,请在Cargo.toml中激活一个功能
gpio-api-gpio_cdev
- 提供了一个设置函数,用于TM1637Adapter,它使用"gpio_cdev"-crate作为GPIO接口
tm1637_gpio_driver::gpio_cdev::setup_gpio_cdev()
- 这使用Linux内核中的基于字符设备驱动程序的api/interface
- 这是推荐的,现代的方式!Sysfs已被弃用
gpio-api-gpio
- 提供了一个设置函数,用于TM1637Adapter,它使用"gpio"-crate作为GPIO接口
tm1637_gpio_driver::gpio_api::setup_gpio()
- 这使用"sysfs"-接口,在执行时可能需要root/sudo
gpio-api-sysfs_gpio
- 提供了一个设置函数,用于TM1637Adapter,它使用"sysfs_gpio"-crate作为GPIO接口
tm1637_gpio_driver::sysfs_gpio::setup_sysfs_gpio()
- 这使用"sysfs"-接口,在执行时可能需要root/sudo
- 这使用"sysfs"-接口,在执行时可能需要root/sudo
gpio-api-wiringpi
- 提供了一个设置函数,用于TM1637Adapter,它使用"wiringpi"-crate作为GPIO接口
tm1637_gpio_driver::sysfs_gpio::setup_wiringpi()
- 确保在您的Pi上安装了"wiringpi"
这只能在Raspberry Pi上工作吗?
可能不是!尽管我无法测试它,因为我没有Arduino或其他类似设备。这应该在您可以为它编写Rust程序的所有设备上工作。由于这个库不使用标准库,因此它应该在嵌入式设备上工作。如果您使用它,请告诉我您构建了什么!
但是的,到目前为止,它仅使用运行Rasbperry Pi OS的Raspberry Pi上的常规GPIO引脚进行测试。
我是谁?
我是Philipp :) 欢迎在Github上贡献或通过Twitter(https://twitter.com/phip1611)给我留言!
特别感谢
特别感谢Arduino驱动程序的创建者driver for the Arduino。他的/她的(不知道)Arduino平台上的驱动程序帮助我了解TM1637微控制器的工作原理。通过这项工作和我对数据表的了解,我能够制作这个驱动程序。我还从关于串行数据传输和TM1637使用的类似I2C的串行总线协议中学到了很多。
我没有使用任何代码。这仅仅给了我一些灵感。
故障排除
- 显示屏上数据未正确显示
- 要么您的设备坏了(我订购了3个,其中有1个坏了),要么您可能频率太高。确保
TM1637Adapter::new
的位延迟不要太短。在Raspberry Pi上100µs应该完全没问题(但1µs对我来说也有效) - 检查电缆和GPIO引脚(clk,dio)
- 要么您的设备坏了(我订购了3个,其中有1个坏了),要么您可能频率太高。确保
- Raspberry Pi / Raspberry Pi OS
- “权限拒绝”
- 确保您的用户是“gpio”组的成员
sudousermod -a -Ggpio<你的用户名>
- “权限拒绝”
- 位延迟函数:1微秒和100微秒之间没有区别
- 如果您使用
thread::sleep()
作为位延迟函数,那么在几微秒时您会遇到问题:操作系统(或者更确切地说,硬件)在这么短的时间内切换线程还不够快。 - 在这种情况下,您应该使用类似于“忙等待”的方法,该方法不会使线程进入睡眠模式,而是在循环中等待直到达到特定的时间。
- 如果您使用
MSRV
MSRV 是 1.52.1
。
趣闻
-
在 crates.io 上还有另一个关于 TM1637 的库:https://github.com/igelbox/tm1637-rs 它使用“embedded-hal”库并采用不同的方法。也看看这个吧。 :)
-
我不知道“驱动程序”这个词是否合适,因为它与操作系统没有关联。但是显示器是一个设备,我的库可以与之通信 ... 所以是的,基本上是一个驱动程序,对吧?
依赖项
~0-500KB