外形图:
接线图:
型号选择
- 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 A0void 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);
}
问题:
使用该模块在测距的过程中,遇到黑色障碍时,测量的距离会明显不准确。