- 前言
这是一次自制的尝试,想法来源于生活。
- 实验目的
利用GSR技术结合光传感技术,监测皮下电位和实时心率,从而达到测谎的效果。
- 实验器材
- arduino uno 主板
- I/O 扩展板(可以不用)
- 面包板
- MAX30102传感器
- 10K电阻一个
- 0.1mF电容一个
- 杜邦线若干(插的和被插的都需要准备,视前面设备而定)
- 实验原理
GSR技术:全称为皮肤电反应,在日常生活中由自主神经系统介导,自主神经系统还负责调节心率、呼吸和消化等身体功能;并可由交感神经系统激活皮肤中的汗腺,引起皮肤电导变化。
简而言之就是:在情绪波动的时候,体内离子分布会产生变化,同时局部汗腺会被激活,导致皮肤的电导率增大,从而表现出电流通过人体的时候会波动变大。
心率检测原理:MAX30102在这次实验中本质上只是发出特定波长的红光和绿光,并接受返回的光,对光信号进行预处理,经过一系列处理后变为数字信号,简单来看就是光→电→数字。而光射出到被返回接受的过程中,会被皮肤,血液,血红蛋白等各种东西吸收,这其中大部分东西对光的吸收散射等都是基本固定的,而在心脏一次跳动前后,血液中氧合血红蛋白和脱氧血红蛋白的组成比例会产生较大变化,从而导致对光的吸收和反射产生较为固定的变化,因此可以通过检测光信号的波动,来判断是否跳动。
可参考以下资料:Signal-to-Noise Ratio as a Quantitative Measure for Optical Biosensors | 亚德诺半导体 (analog.com)
测谎原理:未经训练的人在说谎的时候,会有不经意的情绪波动,并且心率也会短时间波动,进而表现出GSR向上波动,心率不稳定,通过对这两个数据的监测,则可以在一定程度上判断是否说谎。
- 连线过程
MAX30102部分:
- -VIN = 5V
- -GND = GND
- -SDA = A4 (or SDA)
- -SCL = A5 (or SCL)
GSR部分:
A1和GND之间串上电阻,再在电阻两端并联上电容。然后从5V和A1脚分别引出两根导线(使用时人用双手分别捏住导线)
- 实验源码
#include <Wire.h>
#include "MAX30105.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; //最大存储量
byte rates[RATE_SIZE]; //存储心率的数组
byte rateSpot = 0;
long lastBeat = 0; //最后一次检测跳动后的暂停时长
float beatsPerMinute;
int beatAvg;
void setup()
{
Serial.begin(115200);
Serial.println("Initializing...");
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //用默认的IC口,480KHZ;
{
Serial.println("MAX30102 was not found. Please check wiring/power. ");
while (1); //如果没检测到传感器连接,则报错
}
Serial.println("Place your index finger on the sensor with steady pressure.");
particleSensor.setup(); // 传感器初始化
particleSensor.setPulseAmplitudeRed(0x0A); //红光打开
particleSensor.setPulseAmplitudeGreen(0); //开绿光
}
void loop()
{
long irValue = particleSensor.getIR(); //检测是否有合理信号
if (checkForBeat(irValue) == true)
{
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20)
{
rates[rateSpot++] = (byte)beatsPerMinute; //存储数据
rateSpot %= RATE_SIZE;
//计算平均BPM
beatAvg = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++)
beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
Serial.print("IR=");
Serial.print(irValue); //信号参数
Serial.print(", BPM=");
Serial.print(beatsPerMinute); //瞬时bpm(这个不准)
Serial.print(", Avg BPM=");
Serial.print(beatAvg); //平均心率
Serial.print(" ");
if (irValue < 50000)
Serial.print(" No finger?");
Serial.println(analogRead(A1)); //串口监视仪显示GSR
Serial.println();
}
- 实验展示
做了个外壳包一下,避免直接被人看到内部简陋的构造(
- 实验反思
应该找一个优秀的美工和一个优秀的手工人来帮忙制作(