Arduino 测谎仪
本文最后更新于 627 天前,其中的信息可能已经有所发展或是发生改变。
  • 前言

这是一次自制的尝试,想法来源于生活。

  • 实验目的

利用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();
}


  • 实验展示

做了个外壳包一下,避免直接被人看到内部简陋的构造(

  • 实验反思

应该找一个优秀的美工和一个优秀的手工人来帮忙制作(

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇