#driver #i2c-driver #proximity #embedded-hal-driver

no-std apds9151

适用于APDS9151数字接近和RGB颜色I2C传感器的跨平台Rust驱动程序

2个版本

0.1.1 2022年3月22日
0.1.0 2022年3月18日

#1586 in 嵌入式开发

MIT/Apache

15KB
243

Rust APDS9151数字接近和RGB颜色I2C传感器

这是一个基于embedded-hal traits的APDS9151数字接近和RGB颜色I2C传感器的跨平台Rust驱动程序。

此驱动程序允许您

  • 初始化设备。请参阅 initialize()
  • 获取颜色传感器红外通道数据。请参阅 get_ir()
  • 获取颜色传感器红通道数据。请参阅 get_red()
  • 获取颜色传感器蓝通道数据。请参阅 get_blue()
  • 获取颜色传感器绿通道数据。请参阅 get_green()
  • 获取接近传感器数据。请参阅 get_proximity()
  • 配置接近传感器LED频率、电流和脉冲数。请参阅 config_proximity_led()
  • 配置接近传感器测量率和分辨率。请参阅 config_proximity()
  • 配置颜色传感器测量率和分辨率。请参阅 config_color()
  • 配置颜色传感器增益。请参阅 set_gain()

设备

此设备提供通过I2C控制的RGB+IR颜色感应。

APDS9151在产品中的应用示例是Rev Robotics v3颜色传感器。链接

数据表:APDS9151

用法

要使用驱动程序,请导入crate和您的平台的embedded_hal i2c接口。

以下示例使用stm32f1xx_hal并在循环中获取颜色。

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use panic_probe as _;
use rtt_target::{rtt_init_print, rprintln};
use stm32f1xx_hal::{
    pac,
    i2c::{BlockingI2c, DutyCycle, Mode},
    prelude::*,
};
use cortex_m::asm::delay;
use apds9151::Apds9151;

#[entry]
fn main() -> ! {
    rtt_init_print!();
    let dp = pac::Peripherals::take().unwrap();
    let mut flash = dp.FLASH.constrain();
    let rcc = dp.RCC.constrain();
    let clocks = rcc.cfgr.use_hse(8.MHz()).freeze(&mut flash.acr);    
    
    let mut afio = dp.AFIO.constrain();
    let mut gpiob = dp.GPIOB.split();

    let scl = gpiob.pb8.into_alternate_open_drain(&mut gpiob.crh);
    let sda = gpiob.pb9.into_alternate_open_drain(&mut gpiob.crh);

    let i2c = BlockingI2c::i2c1(
        dp.I2C1, (scl, sda), 
        &mut afio.mapr, 
        Mode::Fast { 
            frequency: 400_000.Hz(),
            duty_cycle: DutyCycle::Ratio2to1 
        }, 
        clocks, 
        1000, 
        10,
        1000,
        1000,
    );

    let mut color_sensor = Apds9151::new_apda9151(i2c);
    
    color_sensor.initialize().unwrap();

    loop {
        let red = color_sensor.get_red().unwrap();
        let green = color_sensor.get_green().unwrap();
        let blue = color_sensor.get_blue().unwrap();
        rprintln!("R: {:#?}", red);
        rprintln!("G: {:#?}", green);
        rprintln!("B: {:#?}", blue);

        let ir = color_sensor.get_ir().unwrap();
        rprintln!("IR: {:#?}", ir);

        delay(clocks.sysclk().raw() / 100);

    }
    
}

支持

有关问题、问题、功能请求和其他更改,请在GitHub项目中提交问题。

许可证

许可协议为以下之一

任你选择。

贡献

除非你明确声明,否则任何根据Apache-2.0许可证定义,由你有意提交以包含在作品中的贡献,将按照上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~71KB