9. I2C接口 传感器

9.1. MPU6050

MPU6050六轴姿态模块能同时检测三轴加速度、三轴陀螺仪(三轴角速度)的运动数据以及温度数据,利 用芯片内部的DMP模块(Digital Motion Processor 数字运动处理器),可对传感器数据进行滤波、融合 处理,通过I2C接口向主控器输出姿态解算后的数据。

下图为野火MPU6050六轴姿态模块:

../_images/show-peripheral-mpu6050-01.png

鲁班猫扩展板板载1个MPU6050接口:

../_images/show-board-mpu6050-01.png
../_images/show-board-mpu6050-02.png

MPU6050接口对应扩展板I2C2_SDA、I2C2_SCL,XL9535也是使用该I2C接口,部分原理图如下:

../_images/show-circuit-mpu6050-01.png
../_images/show-circuit-mpu6050-02.png

以鲁班猫1为例,扩展板I2C2_SDA、I2C2_SCL对应鲁班猫1的I2C5_SDA、I2C5_SCL:

../_images/show-circuit-mpu6050-03.png

执行如下命令修改/boot/uEnv/uEnv.txt,开启XL9535插件:

1
sudo vi /boot/uEnv/uEnv.txt
../_images/show-dtbo10.png

本次代码例程将循环打印MPU6050数据,若接OLED屏幕,数据也会显示在OLED屏上。

python代码测试

python测试代码为:lubancat_rk_code_storage/expansion_board/i2c/mpu6050/python/main.py

关于程序中OLED I2C接口和MPU6050接口的定义,需要自行根据具体板卡来修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
'''
filename : main.py
'''

...

oled_i2c = busio.I2C(board.I2C3_SCL, board.I2C3_SDA)

...

mpu6050_i2c = busio.I2C(board.I2C5_SCL, board.I2C5_SDA)

...

将main.py所在的整个文件夹传到板卡,执行如下命令运行程序:

1
2
 # 运行程序
 sudo python main.py
../_images/show-operation-coderun-mpu6050-py.png

c代码测试

c测试代码为:lubancat_rk_code_storage/expansion_board/i2c/mpu6050/c/main.c

关于程序中OLED I2C接口和MPU6050接口的定义,需要自行根据具体板卡来修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/* filename : main.c */

...

ret = oled_init(3);

...

ret = mpu6050_init(5);

...

将main.c所在的整个文件夹传到板卡,执行如下命令运行程序:

1
2
3
4
5
 # 编译程序
 sudo make

 # 运行程序
 sudo ./main
../_images/show-operation-coderun-mpu6050-c.png

9.2. 心率传感器

心率血氧检测模块是一种集成了红外光和可见红光LED、光电探测器以及信号处理电路的设备,利 用人体组织在血管搏动时造成透光率不同来实时监测心率和血氧饱和度,主芯片为MAX30102,使用IIC 接口通信。

下图是野火心率血氧模块:

../_images/show-peripheral-max30102-01.png

MPU6050接口不仅可以接MPU6050模块,还可以接除I2C OLED外的其它直插式的野火I2C模块。 如下图,接上心率血氧检测模块:

../_images/show-board-max30102.png

python代码测试

python测试代码为:lubancat_rk_code_storage/expansion_board/i2c/max30102/python/main.py

关于程序中OLED I2C接口和心率血氧检测模块I2C接口的定义,需要自行根据具体板卡来修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
'''
filename : main.py
'''

...

max30102 = MAX30102(i2c_bus=5)

...

oled_i2c = busio.I2C(board.I2C3_SCL, board.I2C3_SDA)

...

将main.py所在的整个文件夹传到板卡,执行如下命令运行程序:

1
2
 # 运行程序
 sudo python main.py

程序执行后,当心率血氧检测模块未检测到手指时,会一直打印如下:

../_images/show-operation-coderun-max30102-py-01.png

将手指轻覆盖在心率血氧检测模块的表面,测量时请尽量保持模块和手指相对静止,模块不移动和抖动。 程序检测到手指后,会开始采集传感器数据(前几次的测量数据会不稳定,也可以自行对测量结果再作滤波处理):

../_images/show-operation-coderun-max30102-py-02.png

若接上OLED屏幕,OLED也会显示心率和血氧饱和度数据:

../_images/show-operation-coderun-max30102-py-03.png

c代码测试

c测试代码为:lubancat_rk_code_storage/expansion_board/i2c/max30102/c/main.c

关于程序中OLED I2C接口和心率血氧检测模块I2C接口的定义,需要自行根据具体板卡来修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/* filename : main.c */

...

ret = oled_init(3);

...

ret = max30102_init(5);

...

将main.c所在的整个文件夹传到板卡,执行如下命令运行程序:

1
2
3
4
5
# 编译程序
sudo make

# 运行程序
sudo ./main

程序执行后,当心率血氧检测模块未检测到手指时,会一直打印如下:

../_images/show-operation-coderun-max30102-c-01.png

将手指轻覆盖在心率血氧检测模块的表面,测量时请尽量保持模块和手指相对静止,模块不移动和抖动。 程序检测到手指后,会开始采集传感器数据(前几次的测量数据会不稳定,也可以自行对测量结果再作滤波处理):

../_images/show-operation-coderun-max30102-c-02.png

若接上OLED屏幕,OLED也会显示心率和血氧饱和度数据:

../_images/show-operation-coderun-max30102-c-03.png