Arduino问答实验室

使用 Ardublock 解释声纳测距公式0条评论

作者:学长   发布于:2013年8月28日 16:05:17 周三    分类: Ardublock    4494 人浏览

声纳测距模块又称为超声波测距模块,这个实验所使用的是 HC-SR04 型号的模块。


在实际使用这个模块之前,先大致了解声波测距的过程。


1.  触发发射器发射声波。

2.  拉高 Echo 脚。

3.  声波受到阻碍反射。

4.  接收器收到反射的声波。

5.  下拉 Echo 脚。


因此,只要计算声波移动的速度乘上 Echo 脚上拉的时间,

就可以得到声波从发出之后经过反射到接收器的距离。

在模块跟障碍物静止的状态下,发射器到障碍物的距离跟障碍物到接收器的距离是相等的,

所以我们只要简单的把总距离除以二,就可以得到模块到障碍物的实际距离。


在这个实验里,我们使用 Ardublock 来做为我们的编程环境。

这也是 Ardublock 有利於 Arduino 入门新手的因素之一,在完成 ardublock 编程之后再行解释。


打开 Ardublock 之后,根据 Arduino 的编程经验,第一个想要找的函数就是 pulseIn() 函数,

用来计算 Echo 脚上拉的时间。

在寻找 block 时发现 Ardublock 竟然提供了 ultrasonic 模块,所以我们就直接拉出 ultrasonic 模块,如下图。

step01.png


如图,我们观察到此模块有两个数入参数,一个输出。

Trigger 参数是触发声波的引脚号码,尖型输入表示类型为数值

Echo 参数是Echo 引脚号码,同样是数值类型。

这个模块的输出,此时我们只知道是数值,是什么单位目前还不知道。


此时,要将输出透过串口打印到串口监视器上。将 Utilities 分类下的 Serial println 所代表的 block 拉出。如下图

step02.png


我们发现 Serial println 及所属的 message 这两个block ,只能接受的方形的输入,代表只能接受字串或字符的输入。

因此,我们再拉出另一个 block :Number/Constants 分类下的 glue ,

glue 有两个 block ,其中我们要的是接受数值型态输入的 glue ,如下图。

step03.png

step03.png


这个 glue ,就是把数值的输入转换为字串后再输出给其他 block 。

接下来,按照步骤将这三个组 block 组好。

1. Ultrasonic 的 Trigger 引脚号改为如接线图所示的12,Echo 脚为11 。

2. 将Ultrasonic 输出接到 glue 的输入。

3. 将 glue 的输出,接到 Serial println 所附属的蓝色 message 方块的输入。

4. 将 message 方块改为“Ultrasonic Inpur:“。

完成之后如下图

step04.png


最后拉出主循环,把这组已经完成的逻辑方块,放入主循环。如下图:

step05.png


储存后,按下 Upload 产生程序代码,如下图。

step06.png


程序如下:

int ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(int trigPin, int echoPin)
{
  int duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  return duration;
}


void setup()
{
digitalWrite( 12 , LOW );

Serial.begin(9600);
}

void loop()
{
Serial.print( "Ultrasonic Inpur:" );
Serial.print( ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 12 , 11 ) );
Serial.println("");
}

一个新手因为经验不足,不可能同时写出函数,又同时计进行计算、控制引脚,

先使用 ardublock 进行逻辑编排产生可执行的代码之后,

再对代码进行学习、优化,这就是刚刚所说的有利於新手的最大因素。 

新手在分析程序时可以学习这里的方式,

将程序分成三个部份来看,第一个是 setup() ,第二个是 loop() ,

第三个是 ardublock 生成的 ardublockUltrasonicSensorCodeAutoGeneratedReturnCM() 。


按照顺序先看 setup() ,函数里面将12号数位引脚也就是触发引脚(trig)下拉,

以准备等下让程序触发声波。然後设置串口的 baud rate 为 9600bps 。


loop() 这个函数,就是对应到 ardublock 里所提到的主循环,

功能就是不断的在串口监听器打印出Ultrasonic 模块的输出值。

loop() 的第一行是 print 我们输入在 message 方块里面的字串 Ultrasonic Inpur:
第二行可以看到,print 出 ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(12,11)  的结果。

12是我们的 Trig 引脚, 11 是 Echo 。

第三行是空的 println ,这个是打印之后换行,打印内容可以输入单位。

虽然从函数名称上看出返回的单位是 CM ,可以先填入单位:公分,但是更应该证实输出的单位后再填入。


接下来就是重点, ardublockUltrasonicSensorCodeAutoGeneratedReturnCM() 函数,其参数我们已经说明过。

第四行到第八行,就是以一个20 us 的高位脉冲触发声波发射。

第九行 将收到的 Echo 时间长度储存到 duration 变量里面。

第十行 将 duration 除以 59 所得到的结果就是 CM ..... 哈哈。

这个 59 怎麽来的? 


这个要从头说起,音速的公式为 音速c = 331.5 + (0.6*气温摄式度)。

以室温来说(不知道谁规定的,只要提到室温就是指20度) 音速 = 331.5 +(0.6*20) = 343.5 m/s 

这个数值对我们来说实在是是太,HC-SR04 的最远距离官方表示只有 450CM 。

因此,单位转换为 cm/us 较适合我们使用,室温下音速 334.5 * 100 /1000000 = 0.03435 cm/us

音速的另一个表示的方法为 us/cm ,含意为音速每前进一公分花费多少时间。

1/0.03435 = 29.1 us/cm

回到本实验的最前面测距的公式:距离D = (总时间t/2) * 音速c(cm/us)

将这个公式再修正,则为 距离D = (总时间t/2) * 1/0.03435 = (总时间t/2) /29.1 = (总时间t/58.2)


这里计算出来的 58.2 就是自动生成的 59 的由来,但为什麽是 59 呢?

除了温度的变化外还有另一个因素,就是约定俗成。一般常用的音速,不论温度,就是 340 m/s 。

以 340 m/s 计算,1/0.0340 = 29.411  us/cm ,取小数点后1位,采无条件进位,就是 29.5 us/cm ,

则 距离D (总时间t/2) /29.5(总时间t/59) ,这就是由来啦。


好啦,讲这麽多 都头晕了。


将程序编译后上传,用直径超过 3mm 的圆柱体,测试距离。所得结果如下图

step07.png


上图 单位为公分,各位记得填上就行啦。


以下为实验照片

ex01.jpg

ex02.jpg


本实验主旨在於讲解 超声波传感器的使用,以及 ardublock 图形化编程。

有关进阶使用,请参考另一篇:

使用 NewPing 程序库操作 HC-SR04 声纳传感器


如果实验过程有疑问,请多多提问。

Me.png


Arduino问答实验室- 本站版权
1、本主题由文章作者发表,文章作者与Arduino问答实验室享有文章相关版权
2、转载或引用本文时请同时征得文章作者和Arduino问答实验室的同意
3、本站部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站即时予与以处理
5、原文链接:www.985z.com/?post=21
二维码
继续查看有关 arduino sr04 ardublock 图形化编程 的文章

我来说说

*

*