#gpio #driver #tm1637 #micro-controller #display #interface #generic

无std tm1637-gpio-driver

适用于TM1637微控制器的通用GPIO驱动器,主要用于教育目的。无需std库,你可以选择任何你想要的GPIO接口/库。

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

MIT许可

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)

移动文本

gpio demonstration

带闪烁的双点时间

gpio demonstration

这是如何工作的?我该如何为这个设备编写驱动程序?

这是我第一次编写(超级简单基本)类型的设备驱动程序。到目前为止,我对微控制器的经验并不多。经过一段时间,我通过查看数据表了解了它的工作原理。也请查看我的代码!我尽量做了尽可能多的注释。

我该如何使用它?

你可以在github仓库中找到代码示例!

我的驱动/库不依赖于特定的GPIO接口。您可以使用crates.io: wiringpicrates.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)
  • 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