首先感谢米尔电子活动提供的传感器模块,先来个开箱照吧
模块兼容了树莓派的接口,设计得很精巧: - 基于 Raspberry Pi 40PIN GPIO 接口设计,适用于树莓派系列主板
- 板载 TSL25911FN 数字环境光传感器,可测量红外光强及人眼可见光
- 板载 BME280 温湿度气压传感器,可测量温度、湿度、气压
- 板载 ICM20948 运动姿态传感器,可测量加速度、陀螺仪、磁力计
- 板载 LTR390-UV-1 紫外传感器,可测量紫外光强
- 板载 SGP40 气体传感器,可检测环境 VOC
- I2C 接口通信,两线即可实现读取
本期先进行BME280传感器的一个开发笔记。
BME280是博世公司的一款数字温湿度、压力传感器,该传感器模块安装在一个非常紧凑的金属盖封装中,大小仅为2.5x2.5平方毫米。它的小尺寸和低功耗使其用在电池驱动的智能设备上称为可能,比如手机、智能手表等。
主要应用领域: l 健康检测 l 智能家居 l 物联网应用 l GPS增强 l 室内、室外导航 l 天气预报
模块是使用I2C接口与Remi Pi进行连接,先根据Remi Pi的原理图,找到对应的I2C接口,从引脚名称可以看到,这里使用的是I2C2,如下图所示: 传感器模块的I2C接口:
然后根据《Remi Pi-PinList-V1.0.pdf》找到对应的使用引脚,可以看到,这里IIC2是作为第二功能来使用的,后面配置设备树的时候需要注意: 然后米尔默认提供的Linux系统,只使能了I2C0、I2C1和I2C3,唯独没有使能I2C2,如sys文件系统信息可以看到,如下图:
所以我们需要修改设备树文件,添加对I2C2的支持,修改的设备树文件为:mys-rzg2l-smarc-base.dtsi,修改内容如下:
然后更新设备树文件到系统,可以看到我们打开了I2C2接口:
驱动BME280,可以使用Linux内核默认自带的IIO驱动(Industrial I/O,即工业总线IO),可以非常方便的读取在应用层读取传感器的相关信息,而不必单独为每个传感器开发对应的驱动程序,因为较新的Linux内核已经为我们适配了大部分常用的传感器驱动,我们可以通过内核配置选项来打开这些配置: 内核配置项中,Device Drivers->Industrial I/O support->Pressure sensors->Bosch Sensortec BMP180/BMP280 pressure sensor I2C driver
保存内核配置,编译完成后,将arch/arm64/boot/Image文件更新到开发板中,重新上电后,在sys文件系统下可以看到 /sys/bus/iio/devices/iio:device0 有如下文件信息
这样,我们可以直接在用户层编写应用程序就能非常方便得读到相关的传感器值: - #include <stdio.h>
- float get_pressure(void)
- {
- FILE *fp = NULL;
- float val = 0;
- fp = fopen("/sys/bus/iio/devices/iio:device0/in_pressure_input","r");
- if (fp) {
- fscanf(fp, "%f", &val);
- }
- fclose(fp);
- return val;
- }
- float get_humidity(void)
- {
- FILE *fp = NULL;
- float val = 0;
- fp = fopen("/sys/bus/iio/devices/iio:device0/in_humidityrelative_input","r");
- if (fp) {
- fscanf(fp, "%f", &val);
- }
- fclose(fp);
- return val;
- }
- float get_temp(void)
- {
- FILE *fp = NULL;
- float val = 0;
- fp = fopen("/sys/bus/iio/devices/iio:device0/in_temp_input","r");
- if (fp) {
- fscanf(fp, "%f", &val);
- }
- fclose(fp);
- return val;
- }
- int main(int argc, char *argv[])
- {
- float pressure = 0;
- float humidity = 0;
- float temp = 0;
-
- while (1) {
- pressure = get_pressure();
- humidity = get_humidity();
- temp = get_temp();
- printf("pressure: %f, humidity: %f, temp: %f\n", pressure, humidity/1000, temp/1000);
- sleep(1);
- }
- return 0;
- }
复制代码
最后,再次感谢米尔电子,其他模块的测试验证敬请期待后期文章
|