夏普红外测距模块使用笔记

外形图:
在这里插入图片描述
接线图:
在这里插入图片描述

型号选择

  • GP2Y0A21YK0F 10-80cm
  • GP2Y0A02YK0F 20-150cm
  • GP2Y0A710K0F 100-550cm
  • GP2Y0A51SK0F 2-15cm
  • GP2Y0A41SK0F 4-30cm

使用

从数据手册可以明显的发现,测量距离和模拟电压是非线性关系。这给我们的实际使用造成了很多不便。实际上数据手册中还提供了一个模拟电压和距离倒数的曲线图,该曲线可以近似为直线,可以根据该关系算出不同电压对应的距离值。

今天在调试的时候发现Arduino平台上有一个专门用于夏普红外模块测距的库ZSharpIR
在这里插入图片描述

https://github.com/zoubworldArduino/ZSharpIR为该代码的具体仓库,其中的README.md文件中也介绍的使用方法 。该库中提供了另一种建立模拟电压和距离关系的方法:通过散点来拟合曲线函数的方式来建立模拟电压和距离的公式关系。这时候便需要用到了 https://mycurvefit.com/ 网站来建立散点对应的公式。

在这里插入图片描述

实例

这里以GP2Y0A41SK0F型号的红外测距模块为例:

打开 https://mycurvefit.com/网址,选择Fit Method --> Nonlinear --> Power,然后在下面的XY栏中输入XY的坐标输入完成后,选择Export后会生成相应的excel文件,该文件中包含了拟合曲线的函数。实际计算中便可以根据该函数进行距离的计算。
在这里插入图片描述
注意:这里上面的函数曲线并不是该模块的曲线实际是GP2Y0A02YK0F模块的函数曲线,这里只是为了说明。

该模块对应的实际函数关系:Distance = 12.08 X POW(Volt , -1.058)

Arduino平台下的测试代码(基于arduino uno)

Arduino uno 的ADC精度为10位

#define SIGNAL_PIN  A0

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(SIGNAL_PIN, INPUT);
}

int get_distance(uint16_t value) {

  return (int)(120.8*pow(map(value, 0, 1023, 0, 5000)/1000.0, -1.058));
}

void loop() {
  // put your main code here, to run repeatedly:
  uint16_t value = analogRead(SIGNAL_PIN);
  int distance = get_distance(value);

  Serial.print("ADC: ");
  Serial.print(value);
  Serial.print(" Distance(mm): ");
  Serial.print(distance);
  Serial.println();
  delay(500);
}

问题:

使用该模块在测距的过程中,遇到黑色障碍时,测量的距离会明显不准确。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值