这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】STM32F4驱动RPR-0521RS照度、接近一体型传感

共8条 1/1 1 跳转至

【换取手持数字示波器】STM32F4驱动RPR-0521RS照度、接近一体型传感器

工程师
2025-05-17 20:11:58   被打赏 23 分(兑奖)     打赏

罗姆公司的产品接触的比较少,近期在项目上用到了罗姆的RPR-0521RS。RPR-0521RS是将光学式接近传感器和红外LED(IrLED)、数字照度传感器整合在1chip中的模块。
接近传感器 (PS)通过对IrLED发射光线的接近物产生的反射光,检测出人及物体的接近。另外,照度传感器(ALS)可测量从昏暗光线到直射日光的广泛照度。根据照度数据调整LCD显示器及按键的亮度,从而提高组件的节电性能和画面的可视性。

image.png


作为I2C总线的从设备,其地址是0x38h,I2C总线时序如下:

image.png

image.png

从STM32发送指令到传感器的格式如下:

image.png


从STM32发送读取传感器数据的格式如下:

image.png

STM32配置,从CubeMX中的I2C配置开始:

image.png


自动生成初始化代码:

	I2cHandle.Instance = I2C1;
	I2cHandle.Init.ClockSpeed = 100000;
	I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_2;
	I2cHandle.Init.OwnAddress1 = 0;
	I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
	I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
	I2cHandle.Init.OwnAddress2 = 0;
	I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
	I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
	if (HAL_I2C_Init(&I2cHandle) != HAL_OK) {
		/* Initialization Error */
		Error_Handler();
	}


初始化RPR-0521RS

void	rohm_rpr_0521rs_Init(void)
{
	uint8_t val;
	
	if(HAL_I2C_IsDeviceReady(&I2cHandle,0x70, 2, 100)==HAL_OK)
	{
		printf("RPR-0521RS Device OK\r\n");
	}
	HAL_Delay(10);

	val=0x02;
	HAL_I2C_Mem_Write(&I2cHandle,0x70,0x42, 1, &val, 1, 10);		//ALS_PS_CONTROL
	HAL_Delay(10);
	val=0x01;
	HAL_I2C_Mem_Write(&I2cHandle,0x70,0x43, 1, &val, 1, 10);		//PS_CONTROL
	HAL_Delay(10);
	val=0xc6;
	HAL_I2C_Mem_Write(&I2cHandle,0x70,0x41, 1, &val, 1, 10);		//MODE_CONTROL
	HAL_Delay(10);
}


读取RPR-0521RS数据:

void	rohm_rpr_0521rs_GetPSALSVal_V0(void)
{
	uint8_t	RegVal[6];
	uint16_t PS,ALS[2];
	float lx;
float d0, d1, d1_d0;
	
	HAL_I2C_Mem_Read(&I2cHandle,0x70,0x44, 1, RegVal, 6, 10);					//读取寄存器数据
	
	PS		=((uint16_t)RegVal[1]<<8)+RegVal[0];
	ALS[0]=((uint16_t)RegVal[3]<<8)+RegVal[2];
	ALS[1]=((uint16_t)RegVal[5]<<8)+RegVal[4];
	
	//mgcsh test
	printf("ALS[0]=%d ,ALS[1]=%d\r\n",ALS[0],ALS[1]);

	//转化为光强数据
d0 = (float)ALS[0] * (100 / 100) / 1;
d1 = (float)ALS[1] * (100 / 100) / 1;
	
if (d0 == 0) {
lx = 0;
return;
}

d1_d0 = d1 / d0;

if (d1_d0 < (float)0.595) {
lx = ((float)1.682 * d0 - (float)1.877 * d1);
} else if (d1_d0 < (float)1.015) {
lx = ((float)0.644 * d0 - (float)0.132 * d1);
} else if (d1_d0 < (float)1.352) {
lx = ((float)0.756 * d0 - (float)0.243 * d1);
} else if (d1_d0 < (float)3.053) {
lx = ((float)0.766 * d0 - (float)0.25 * d1);
} else {
lx = 0;
}
	
	printf("MagDat:PS=%d ,ALS=%f\r\n",PS,lx);
	LUX = lx;
}

烧录,通过串口查看传感器数据:

image.png

此外,如果采用Arduino环境开发,可以参考罗姆公司的官方Github:

https://github.com/RohmSemiconductor/Arduino/tree/master/RPR-0521RS


院士
2025-05-18 14:59:59     打赏
2楼

这个亮度感知的传感器在生活中好是常用呀


高工
2025-05-25 10:50:51     打赏
3楼

这个光线传感器的光谱图是什么样的?是全色域的吗?还是只对特定光谱敏感?


专家
2025-05-26 09:15:02     打赏
4楼

谢谢分享!日本的元器件都挺贵的,不知道为啥。


工程师
2025-05-26 10:26:36     打赏
5楼

HAL_I2C_Mem_Read(&I2cHandle,0x70,0x44, 1, RegVal, 6, 10);  if(HAL_I2C_IsDeviceReady(&I2cHandle,0x70, 2, 100)==HAL_OK)      {          printf("RPR-0521RS Device OK\r\n");      } 

楼主你在说明地址时,是0x38,但是在这里写的是0x70,而且读写是一个地址,这个是什么原因呢?



高工
2025-05-26 20:03:35     打赏
6楼

这是STM32 硬件iic读取的数据,通讯速度可以快一些吗?还有这个光传感器模块,是采集的特定波长的吗?


工程师
2025-05-27 09:45:53     打赏
7楼

不知道价格多少, 我搜索了一下价格好像在5元左右. 感觉还可以. 详细的配置驱动过程, 这种比较少见的传感器还是多多益善


专家
2025-05-27 22:34:31     打赏
8楼

这种在玩具上应该很有市场。不知道有没有国产ic。


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]