Arduino读取HC-SR04超声波测距传感器数据附带滤波
目录
前言
程序
1.无滤波程序
2.低通滤波器滤波程序
3.低通滤波器滤波程序(弃掉高幅噪声)
4.中位值滤波
5.中位值平均滤波
总结
前言
传感器的接线非常简单,一共四根线
vcc和gnd按照要求接线即可。TRIG接数字引脚8号口,ECHO接数字引脚9号口。
程序
1.无滤波程序
#define TRIGGER 8
#define ECHO 9
long duration;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime = LONGEST_DISTANCE*2/0.034;void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communication
}long counter=0;
void loop() {// Clears the trigPindigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/sSerial.println(distance);delay(10);
}
可以看到,当前方障碍物距离变化时,会产生尖峰,这是噪声,我们需要去掉。
2.低通滤波器滤波程序
我们通过低通滤波器进行滤波,再看看效果。
#define TRIGGER 8
#define ECHO 9
long duration;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime = LONGEST_DISTANCE*2/0.034;class LowPassFilte{public:LowPassFilte(float Tf);//低通滤波器时间常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通滤波器时间常量protected:unsigned long timestamp_prev; //!< 上次执行时间戳float y_prev; //!< 经过上次执行后过滤到的值
};LowPassFilte::LowPassFilte(float time_constant): Tf(time_constant), y_prev(0.0f)
{timestamp_prev = micros();
}float LowPassFilte::operator() (float x)
{unsigned long timestamp = micros();float dt = (timestamp - timestamp_prev)*1e-6f;if (dt < 0.0f || dt > 0.5f)dt = 1e-3f;float alpha = Tf/(Tf + dt);float y = alpha*y_prev + (1.0f - alpha)*x;y_prev = y;timestamp_prev = timestamp;return y;
}LowPassFilte us_filter(0.1);void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communication
}long counter=0;
void loop() {// Clears the trigPindigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/s//摒弃突变值Serial.print(distance);Serial.print(",");Serial.println(us_filter(distance));delay(10);
}
可以看到,红色的波形是经过滤波之后的结果,已经变得平滑许多了,但是由于蓝色波形(原始数据)有时会有较大突变,还是会影响我们获取到的结果,我们下一步,将这个突变较大的突变值给弃掉。
3.低通滤波器滤波程序(弃掉高幅噪声)
由于正常情况下,自然界或者传感器的噪声是高频低幅的,因此高幅噪声主要是传感器内部造成的,这些垃圾数据,我们将其摒弃。
#define TRIGGER 8
#define ECHO 9
long duration;
float distance_last;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime = LONGEST_DISTANCE*2/0.034;class LowPassFilte{public:LowPassFilte(float Tf);//低通滤波器时间常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通滤波器时间常量protected:unsigned long timestamp_prev; //!< 上次执行时间戳float y_prev; //!< 经过上次执行后过滤到的值
};LowPassFilte::LowPassFilte(float time_constant): Tf(time_constant), y_prev(0.0f)
{timestamp_prev = micros();
}float LowPassFilte::operator() (float x)
{unsigned long timestamp = micros();float dt = (timestamp - timestamp_prev)*1e-6f;if (dt < 0.0f || dt > 0.5f)dt = 1e-3f;float alpha = Tf/(Tf + dt);float y = alpha*y_prev + (1.0f - alpha)*x;y_prev = y;timestamp_prev = timestamp;return y;
}LowPassFilte us_filter(0.1);
LowPassFilte us_filter1(0.001);long time_last=0;void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communicationdigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance_last = distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/stime_last=millis();
}
long counter=0;
byte lvbo=0;
void loop() {// Clears the trigPindigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/sSerial.print(distance);//摒弃高幅数据if((abs(distance-distance_last))>10){if(lvbo<10){distance = distance_last;lvbo++;}elselvbo=0;}Serial.print(",");Serial.println(us_filter(distance));distance_last = distance;delay(10);
}
可以看到滤波效果非常好, 首先,我们去除了高频低幅噪声,同时也去掉了高频高幅噪声,只剩下了我们的目标值(低频低幅数据),因为正常情况下,障碍物距离我们传感器的位置是均匀低俗变化的。
红色为滤波之后的效果,蓝色为原始数据。
4.中位值滤波
连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。我这里采样11次。
#define TRIGGER 8
#define ECHO 9
long duration;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime = LONGEST_DISTANCE*2/0.034;//中值滤波器
class MidFilter{public:int Sum;MidFilter(int Sum);//数据总数float operator() (float Num[11]);
};MidFilter::MidFilter(int Sum){this->Sum=Sum;
}float MidFilter::operator() (float Num[11]){for(int i=0;i<Sum-1;i++){for(int j=i+1;j<Sum;j++){if((Num[i])>(Num[j])){float t=Num[i];Num[i]=Num[j];Num[j]=t;}}}return Num[(int(Sum/2))];
}//实例化中值滤波器
MidFilter mid5(11);void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communication
}long counter=0;
void loop() {float distance_s[11]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};// Clears the trigPinfor(int i=0;i<=10;i++){digitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance_s[i] = duration * 0.034 / 2; // 10^-6 * 34000 cm/s// Serial.println(distance_s[i]);}
// Serial.println();
// Serial.print(distance_s[0]);
// Serial.print(",");Serial.println(mid5(distance_s));delay(10);
}
滤波效果发现不是很好,还是会出现尖峰和低谷这种情况。不知是否我的代码有问题?
5.中位值平均滤波
总结
我们通过上述第三个程序,可以获得比较理想的滤波后的传感器数据。
但是,从上图中可以看到,我们观察滤波之后的红色波形,相比蓝色波形有一定的滞后性,这个我们如何解决呢?
Arduino读取HC-SR04超声波测距传感器数据附带滤波相关推荐
- Arduino与Processing交互-超声波测距传感器的读取与显示
公众号:STCode 1-超声波测距传感器简介 超声波测距传感器是利用频率高于20kHz的声波在空气中传播,遇到障碍物反射回来,通过计算发射和接收时间差,可以计算出发射点与障碍物间的距离. 超声波测距 ...
- Arduino的光敏传感器和超声波测距传感器测试代码
光敏传感器测试代码 使用的是一个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载一个可调电阻以及一个LED, 调节电阻大小, 可以控制LED亮灭和DO输出变化对光亮的灵敏度 ...
- 基于STM32和超声波测距传感器的测距功能设计
基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...
- 超声波测距传感器认知
目录 一.超声波测距传感器认知 二.从零编程实现超声波测距 三.项目--感应开关盖垃圾桶 1.开发步骤 2.感应开关盖垃圾桶代码测试 一.超声波测距传感器认知 超声波测距模块是用来测量距离的一种产品, ...
- 超声波测距传感器模块在畜牧业的应用
我国现代养殖是一种"高投入.高产出.高效益"的产业.资本密集型和劳动集约化是其基本特征.这种集约化的产业耗费了大量的人力和自然资源,并在某种程度上对环境造成负面影响.如今物联网应用 ...
- 超声波测距传感器模HG-C40U工作程序图文详解
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离. 超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口 ...
- [博创智联]创新创客智能硬件平台——超声波测距传感器
[博创智联]创新创客智能硬件平台--超声波测距传感器 准备工作 测试环节 编译驱动和测试代码 加载驱动并执行代码 准备工作 烧录原版系统,供电.连接串口线,配置网络,挂载NFS共享,拷贝超声波测距传感 ...
- 【HaaS Python硬件积木】HCSR04超声波测距传感器
来这里发现更多拿来即用的传感器 HaaS开发框架HaaS积木方案,赋能生态开发者,让您快速找到自己需要的解决方案,硬件主板与外设,以及各种应用组件.https://haas.iot.aliyun.co ...
- 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器
[STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...
最新文章
- java oracle分页_oracle 分页存储过程和java代码
- [改善Java代码]在接口中不要存在实现代码
- php tp5 redis的使用(亲测)
- PWN-PRACTICE-BUUCTF-13
- 这些学霸的作息表“曝光”,太震撼了,快来找差距!
- FreeRTOS任务挂起与解除
- 解决vue-cli使用组件报错
- java 保存的代码怎么写_java实现写入并保存txt文件的示例代码
- MSP430学习笔记2---两个LED同时亮灭和顺闪
- JUnit测试框架使用介绍
- js 获取iframe页面元素
- Java Matcher源码学习记录
- Duilib使用---颜色配置
- 登陆模块邮箱用例设计_邮箱注册模块测试用例.doc
- json对象数组转数组方法
- windows电脑常见问题故障解决办法
- 知道创宇区块链安全实验室|Deus Finance预言机攻击事件分析
- JavaScript监听键盘事件,组合键事件
- 使用Python库valuequant和利润表历史数据计算股权价值
- 为什么很多公司都在招测试开发?
热门文章
- 文储研习社第14期 | 区块链骗局避坑指南
- 最近朋友民间借贷起诉,聊天记录内容过多,聊天长截图需要处理成A4纸上,方便打印
- 结构光-----激光散斑图像评测算法
- 电脑连不上手机热点了
- 微信体育馆运动场地预约小程序系统设计与实现
- window10安装深度linux双系统,转:【史上最详细】win10下的Deepin双系统安装小白教程-论坛-深度科技...
- 上层点云分割(C++PCL)
- HTML 正则表达式 输入框数字+字母、数字 四位数
- [工具]嵌入式开发工作流常用工具箱
- 2021年10月TIOBE排行 榜首 Python yyds