内容

介绍

这个例子将展示如何使用光敏电阻和Arduino控制的MATLAB Arduino硬件支持包创建一个简单而灵敏的运动检测器。金宝app光敏电阻是一个可变的电阻,它对入射光的强度作出反应,因此运动检测器将对引起光敏电阻照明变化的运动敏感。

用MATLAB编写的程序将使用来自支持包的命令从Arduino引脚读取模拟电压。金宝app在MATLAB中收集电压读数时,它们与时间戳相关联,以保持一个全面的记录。然后,结合电压和时间数据绘制并实时分析,以确定是否检测到运动。这里提供的代码利用了一组算法来检测运动,但还有许多其他机器学习和数据分析算法可以应用。

当运动检测器运行时,MATLAB程序存储每个电压读数以及相应的时间戳。这允许用户在记录完成后在MATLAB中处理一组完整的数据。本文分享了分析代码中提供的几种记录后运动检测和分析算法的结果。

所需的硬件

任务1 -连接Arduino到MATLAB

要将Arduino连接到MATLAB,需要安装MATLAB Arduino Hardware Support Package。金宝app这个支持包金宝app可用于MATLAB版本R2014b和更高版本,可以使用支持包安装程序访问。这个安装程序可以从MATLAB Toolstrip下打开获取硬件支持包金宝app或通过跑步金宝appsupportPackageInstaller在命令窗口中。安装了支持包后,请按照以下步骤连接到金宝app您的Arduino。

  1. 用USB线将Arduino连接到电脑上。
  2. 在MATLAB中,初始化一个Arduino对象。
% input:端口ID(来自您的计算机),Arduino板类型myArduino = arduino (“COM6”'uno');

任务2 -测试MATLAB-Arduino连接

大多数Arduino或Arduino克隆板有一个内置的LED在引脚13。如果你的电路板上有LED,你可以通过打开或关闭LED来测试Arduino连接。如果你的电路板没有一个内置的LED,你可以很容易地将一个串联在数字引脚(例如13)和GND引脚之间的电阻(见下图)。所需的电阻值将根据LED的颜色而变化,但对于基本的红色和黄色LED来说,330欧姆的电阻应该是合适的。一旦你有一个LED连接,执行下面的代码闪烁LED 5次。

myarduino.configurigigitalpin(13,“输出”);%设置引脚13输出为了blink = 1:5 myArduino.writeDigitalPin(1,1);%打开LED暂停(1);暂停1秒myArduino.writeDigitalPin (13,0);关闭LED暂停(1);暂停1秒结尾

任务3 -制作电路

注意,像普通的电阻器一样,光敏电阻没有方向-我们不必担心电流通过它的方向。我们将用光敏电阻创建一个简单的分压器。

  1. 使用面包板,将光电晶体连接和10个kohm电阻串联。
  2. 将10个kohm电阻的自由侧连接到Arduino上的GND(接地)销。
  3. 在Arduino上连接光电晶体的自由侧到5V(5伏)销。
  4. 为了让我们监控光敏电阻和10 kOhm电阻之间的电压,将电路中的这一点连接到Arduino上的模拟输入使用一根电线。这将起电位器的作用。

任务4 -测试电路和光敏电阻

下一步是测试你制作的电路,以确保光敏电阻对变化的光照条件做出正确的反应。下面的脚本演示了如何配置Arduino和从模拟引脚上的光敏电阻检索电压读数。当脚本运行时,尝试覆盖光敏电阻或打开/关闭灯,以查看光敏电阻如何响应。注意,如果您使用自己的硬件设置运行这个MATLAB文件,您将得到自己独特的数据,它将不同于本示例发布的html版本中显示的下2个图。发布的版本是基于我们收集的数据,并用于下面部分的数据分析。

%configure arduinoPHOTORESISTOR_PIN_NUMBER = 0;myArduino.configureAnalogPin (PHOTORESISTOR_PIN_NUMBER“输入”);%初始化变量阅读= 750;这将需要20-30秒* = 0(阅读,1);analogVoltageIn = 0(阅读,1);初始化图形和坐标轴图;持有;ylim ([0, 5]);标题(“模拟电压与时间”);ylabel ('模拟电压(伏)');包含(的时间(秒));散点图=散射(NaN(阅读,1),南(阅读,1),200年,“同意”);实时记录和显示模拟电压读数抽搐;为了R = 1:读取时间(R) = toc;analogVoltageIn (r) = myArduino.readVoltage (PHOTORESISTOR_PIN_NUMBER);scatterPlot.XData (r) = (r);scatterPlot.YData (r) = analogVoltageIn (r);结尾

光敏电阻理论

光敏电阻是一种随入射光强度变化的可变电阻。光越亮,光敏电阻提供的电阻就越小。一个简单的分压电路,其中光敏电阻与一个定值电阻串联,将有效地将电阻的变化转换为可测量的电压变化。用MATLAB从Arduino上的模拟引脚读取这些电压。当用MATLAB记录电压时,一个程序可以将每个电压与相应的光电平相关联。即使是简单的光敏电阻也可以非常敏感,为Arduino的模拟引脚读取提供全范围的电压(0-5V)。MATLAB将读取这些电压四舍五入到最接近的0.0049伏,因为模拟信号被转换成10位数字信号。

$$ \ frac {5volts} {2 ^ {10bits}} = 0.0049Volts $$

任务5 -校准你的运动检测算法

因为光致抗蚀剂具有高灵敏度,所以运动检测算法将需要校准,这取决于周围的照明条件以及如何使用运动检测器。还需要根据您希望此功能的敏感程度来调整程序的照明级别描述符。

提供的运动检测器MATLAB代码(Run_Motion_Detector.m)实时应用三种计算方法来确定当前电压读数是否表示运动。每个计算都是在一个小的数据窗口内量化不同类型的可变性的一种简单方法。将计算结果与相应的阈值变量进行比较,以确定其可变性是否表明运动。如果任何计算超过其相应的阈值变量,则当前电压读数被指定为显示运动。阈值变量与运动检测器的灵敏度直接相关,应该针对每个特定情况进行校准。

以下是每个方法的描述:

为了对照明条件进行描述性分析,使用getLightingCondition函数定性地描述每个电压读数处的光强。这个功能应该经过校准和扩展,以适当地描述运动检测器所在位置的光水平。

%输入:Arduino对象,录制时间(秒)run_motion_detector(Myarduino,30);

任务6 -记录后数据分析

许多运动检测器只被设计用于实时检测运动,因为它们可以自动完成特定的任务。这是一种非常常见的动作探测器,可以在机场和杂货店的接近激活门上看到,也可以在办公楼的动作激活灯开关上看到。使用MATLAB,在这个例子中构建的运动检测器不仅可以实时检测运动,它还可以记录和编译整个记录会话的传感器读数。

Run_Motion_Detector功能会自动将未处理的模拟电压和时间戳作为变量保存到基本MATLAB工作区analogVoltagesensorTime.保存在MATLAB中,此数据可以传递给Analyze_Motion_Detector_Data函数实现和比较各种运动检测算法。下图显示了三种运动检测算法应用于完整数据集的结果。所有三种方法都将红色数据标记标记为运动。有一点很有用,那就是一些运动只被斜率法检测到(用绿色标记显示),而其他运动只被标准差和/或差值法检测到(用青色标记显示)。通过结合使用这三种方法来确定运动,MATLAB运动检测器可以生成一个全面的运动记录。

负载(“实时方法比较数据”);Analyze_Motion_Detector_Data(SensorTime,AngumVoltage);ylim([3,4.5]);

任务7 -动作分类

利用MATLAB进行数据处理,可以很容易地分离运动事件,并用几个计算参数对每个运动事件进行表征。可以计算的一些简单参数包括:

Categorize_Motion_Events功能计算每个运动事件的这四个参数,并使用它们来定性地描述记录的运动。描述用于在电压绘图上创建有用的标签。运动标签由三个文本字符组成,并位于他们描述的运动事件之上。第一个字符是一个加号,减去或等于标志,指示照明的强度是否增加(+),减少( - ),或者在运动事件周围保持恒定(=)。下一个字符是指特定类型运动的字母。下面列出了具有相应字母的运动类型。第三个字符(如果指定)指示每个运动事件期间的平均照明是如何与先前和之后的光强度相关的,使用相同的加号,减号,并等于标志标识符作为第一个字符。

如果您正在监控非常具体的运动类型,您可以收紧约束以获得更准确的分类,或者使用MATLAB中的机器学习技术来编程自动调整运动检测器。

负载(“样本运动分类数据”);Categorize_Motion_Events (categorizationTime categorizationVoltage);

应用:走廊活动监视器

因为我们的运动检测器对光线变化很敏感,所以当你想要捕捉的运动与光照条件的急剧增加或急剧减少相对应时,它的工作效果最好。有一种方法可以很好地检测到人,那就是把运动探测器对准走廊对面光线充足的墙壁或光源。当人们走过走廊时,当他们的影子经过光敏电阻时,电压会急剧下降。

下图是你可能从走廊运动检测监视器中收集到的数据。运动事件被分类使用的版本Categorize_Motion_Events专门修改以分析走廊数据的功能。分类为仅作为照明(M或L)的变化的运动事件可以被丢弃,因为它们很可能不表明人们通过走廊。这留下了九场似乎表明人的事件。可以进行进一步分析来计算人们走路的速度或通过观察运动事件的长度来计算一组人。

负载(“走廊运动检测器数据样本”);Categorize_Hallway_Events (hallwayTime hallwayVoltage);