第十七篇、基于Arduino uno,获取cp2d12红外测距传感器的原始值和距离值——结果导向

0、结果

说明:先来看看串口调试助手显示的结果,第一个值是原始的模拟电压值,第二个值是距离值,如果是你想要的,可以接着往下看。


1、外观

 说明:虽然红外测距传感器形态各异,但是原理和代码都是适用的,只是测量范围可能不一样。


2、连线

 说明:只需要连接三根线。

  • uno————红外测距传感器
  •     5V--------------VCC
  • GND--------------GND
  •     A0--------------SIG

3、源程序

说明:采用非阻塞方式编写,一定时间检测一次距离值,并进行了简单滤波,又将对应功能进行函数化,方便移植。

/****************************************红外测距 part****************************************/
/*
  接线:
  VCC------VCC
  GND------GND
  A0------SIG
*/
#define cp2d12Pin A0                                                        //定义一个引脚  
#define cp2d12timeInterval 150                                              //检测一次的时间间隔 
unsigned long cp2d12Times = 0;                                              //记录设备运行时间
double distance = 0;                                                        //距离值
int beforeVal = 0;                                                          //前一个距离值
int presentVal = 0;                                                         //当前距离值
int averageVal = 0;                                                         //前一个后一个距离的平均值
/****************************************set up and loop part*********************************/
void setup () {
  Serial.begin (9600);                                                      //设置串口波特率为9600
  pinMode(cp2d12Pin, INPUT);                                                //引脚设置成输出

  Serial.println("设备上线!");
}
void loop () {
  getDistanceData();                                                        //获取距离数据并且打印
}
/*获取距离数据并且打印*/
void getDistanceData() {
  if (millis() - cp2d12Times >= cp2d12timeInterval) {                       //一定时间执行一次
    cp2d12Times = millis();
    int value1 = analogRead (cp2d12Pin);
    distance = getIr(value1);                                 
    filterData();                                                           //进行一次简单的滤波

    Serial.print("原始值:");                                                //串口打印对应的值 
    Serial.print(value1);
    Serial.print(" ,距离值:");                                              //串口打印对应的值 
    Serial.print(averageVal);                                               //串口打印对应的值 
    Serial.println (" cm");                                                 //串口打印对应的值
  }
}
/*当距离值不够设为定值最小值*/
double getIr(uint16_t value1) {
  if (value1 < 16)  {
    value1 = 16;
  }
  return (6762 / (value1 - 9)) - 4;                                         //转换公式
}

/*滤波*/
void filterData() {
  beforeVal = averageVal;                                                   //平均值给前一个值
  presentVal = distance;                                                    //距离值给当前值
  averageVal = beforeVal + (presentVal - beforeVal) / 2;                    //求出当前距离值
}

4、注意事项

说明:首先需要看一下模块能够检测到的一个距离值。如果检测到的距离值不是准确的,那就需要改一下转换公式的部分值 (6762 / (value1 - 9)) - 4,可以查自己模块对应的转换公式,因为每个型号传感器可能不一样。

5、基本原理

        红外测距传感器是一种常用的非接触式距离测量传感器,可以用于测量物体与传感器之间的距离。
        红外测距传感器的工作原理基于红外线反射原理。传感器通过内置的红外发射管发射红外线,并接收红外线反射回来的光信号。当红外光线照射到物体上时,一部分红外光被物体吸收,一部分红外光被物体反射回来。传感器接收到反射回来的红外光信号后,经过处理后可以计算出物体和传感器之间的距离。
        在Arduino中使用红外测距传感器,我们需要先将其正确连接到Arduino板上,并编写相应的程序进行控制。通常,可以通过数字输入输出端口发送控制信号,使红外传感器发射红外线,并通过模拟输入输出端口读取传感器返回的距离值。具体地,在程序中需要使用Arduino提供的相应函数来对数字输入输出端口和模拟输入输出端口进行操作,从而实现红外测距传感器的控制。
        需要注意的是,红外测距传感器的距离测量精度和稳定性受到多种因素的影响,如环境光线、物体表面特性等,因此在使用时还需要进行相应的校准和优化,以提高测量数据的准确性和可靠性。同时,在实际应用中,我们也需要考虑不同情况下采用不同类型和参数的红外测距传感器,并将其合理地组合和应用,以实现更加智能和高效的控制系统。

<think>好的,我现在需要帮助用户了解红外测距传感器的工作原理应用。根据用户提供的引用资料,我需要整理这些信息并用中文清晰地呈现出来。首先,我得仔细阅读用户提供的所有引用内容,确保正确引用每个来源的信息。 首先,用户引用了五个不同的资料,其中引用1提到被动红外传感器的工作原理,而引用2到5主要涉及GP2D12这种主动式红外测距传感器。我需要区分被动主动两种类型,避免混淆。根据引用1,被动红外传感器依赖检测人体发出的红外辐射,而主动式的如GP2D12则是自己发射红外光并接收反射信号,如引用23所述。 接下来,工作原理部分需要详细说明主动式传感器如何工作。引用3提到三角测量原理,这里需要解释发射角度、偏移以及如何通过几何关系计算距离。这部分可能需要绘制三角关系图,但在文本中需要用语言描述清楚。同时,引用24提到GP2D12的应用场景,如机器人避障自动导航,这些都是重要的应用点。 另外,要注意引用格式,每个引用来源的末尾添加对应的标识符,如[^2]、[^3]等。确保每个引用的信息准确对应到正确的来源。例如,引用3详细描述了三角测量原理,而引用5提到了Arduino的连接方式,这部分可能在应用或实现部分提及。 用户的问题包括工作原理应用,因此需要分两部分回答。工作原理部分要区分被动主动式传感器,主动式中的三角测量原理是关键。应用部分则需要列举具体的例子,如机器人、工业自动化等,并引用对应的资料。 最后,生成的相关问题需要基于现有内容,可能涉及优化方法、与其他传感器的对比,以及具体实现中的电路连接问题。需要确保问题与用户提供的资料相关,并且能够引导进一步的学习。 现在需要检查是否有遗漏的信息,例如引用5中的电路连接方式是否需要在应用部分提到,或者在实现中简要说明。不过用户主要询问的是原理应用,因此可能不需要深入代码细节,但可以简要提及硬件连接作为应用的一部分。 总结,回答的结构应该分为工作原理(包括主动被动)、具体技术(三角测量),以及应用场景。每个部分正确引用资料,并确保LaTeX公式的正确使用,如三角关系中的变量可能需要用行内公式格式。</think>### 红外测距传感器的工作原理与应用 #### 一、工作原理 1. **主动式与被动式传感器** - **被动红外传感器**(如引用[1]所述):通过检测物体(如人体)自身发射的红外辐射工作。传感器内部的热释电元件会因温度变化释放电荷,进而触发信号处理[^1]。 - **主动红外测距传感器**(如GP2D12):主动发射红外光并接收反射信号,利用**三角测量原理**计算距离(图1)。公式推导如下: $$ D = \frac{f \cdot X}{L} $$ 其中,$D$为物体距离,$f$为滤镜焦距,$X$为发射器与接收器的中心距,$L$为反射光在CCD上的偏移。 2. **三角测量实现步骤** - 红外发射器以固定角度$a$发射光束; - 反射光被CCD检测器捕获,通过几何关系计算偏移$L$; - 结合已知参数($a$, $f$, $X$)计算距离$D$[^3]。 #### 二、应用场景 1. **机器人领域** - **避障与导航**:GP2D12传感器常用于机器人实时检测障碍物距离,配合STM32等单片机实现路径规划[^2][^4]。 - **自动跟随系统**:例如仓库AGV小车通过多传感器融合实现定位。 2. **工业自动化** - 生产线物料高度检测、机械臂操作距离校准等场景。 3. **消费电子** - 结合Arduino等开发板(如引用[5]示例),可快速搭建测距原型系统,适用于智能家居或教育项目[^5]。 #### 三、典型电路连接(以Arduino为例) ```arduino // 接线示例(引用[5]简化) void setup() { Serial.begin(9600); pinMode(A0, INPUT); // 信号线接模拟引脚A0 } void loop() { int value = analogRead(A0); float distance = 1234.5 / value; // 需根据传感器特性校准公式 Serial.println(distance); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值