超音波感应器蛮常出现在电子机器人的产品上,通常是用来测量距离,超音波感应器各有一个发射及接收超音波的零件,活像两颗大大的眼睛,在制作机器人时,就经常成为造型之一 … XD
认识超音波感应器
如上图看到的,我手边这颗超音波感应器为HC-SR04,左边被标示为 T 的那颗是发射器(Transmitter),会发出 40 kHz 的声波,这个声波超出人类可感知的 20 kHz 上限,因此才称之为超音波,右边那颗被标示为 R 的是接收器(Receiver),可接收超音波。
HC-SR04 脚位从左至右分别为 Vcc、Trig、Echo 与 GND,Vcc 与 GND 就是接 5V 电源及 GND 了,Trig 为输入脚位,Echo 为输出脚位,超音波的发射与接收,就是靠 Trig 与 Echo 这两个脚位,如果你送出 10 微秒的 5V 高电位讯号给 Trig,就会触发超音波的发射,接着 Echo 脚位就会处于 5V 高电位状态,如果接收到反射的超音波讯号,那么 Echo 脚位就会处于 0V 低电位状态:
因此,在超音波发射之后,Echo 的高电位持续时间,就可以搭配音波速度每秒 343.2 公尺,也就是每公分要花费 29.1 微秒左右,计算出超音波感应器与障碍物之间的距离,记得音波往返是走了两倍距离,因此 Echo 的高电位持续时间要除以 2,再用来除以 29.1 微秒,才是与障碍物之间的距离。
如果使用 Arduino 官方语言的话,可以如下撰写程式,以取得超音波感应器与障碍物之间的距离:
pulseIn函式可以计算指定脚位的高电位或低电位持续时间,单位是微秒。
使用 mBlock 超音波感应器方块
嗯?delayMicroseconds与pulseIn在 mBlock 中并没有对应的方块,因此,没什么好继续介绍的了?
实际上,在 mBlock 2.1 中,机器人模块中的 Makeblock 区块里有个“超音波感应器”方块,这原是搭配 Makeblock 超音波感应器模组而使用,这个超音波感应器模组使用 RJ11 接头,而 Makeblock 在 Arduino 板子上设置了八个 RJ11 连接埠,你可以在Me-Baseboard看到相关图片说明。
在说明中,可以看到 Ports on Baseboard Orion to pins on Arduino UNO 这张图,假设我想将超音波感应器连接在 3 号连接埠,它对应的脚位是 D12 与 D13,而在The Upgrade of Me Series Electronic Modules的说明中可以看到,Makeblock 的超音波感应器模组,似乎只是将 Vcc、Trig、Echo 与 GND,直接对应至 RJ11 的相关接点,因此,就来试试看用这个方块吧!
搭配上面這個程式,試著使用以下的電路連接,Trig 連接 D12,Echo 連接 D13:
接著執行程式,你就可以看到貓咪跟你報告距離了 … XD
如果你試著使用 mBlock 超音波感應器方塊,然後轉為 Arduino mode 檢視 Arduino 原始碼,可以發現,它實際上是 MeUltrasonic 程式庫,這可以在 mBlock 安裝目錄的 ext/libraries/makeblock/src 中找到對應的原始碼,其中控制超音波感應器的程式碼,主要是在measure函式:
MePort的dWrite2中,基本上就是在对应脚位作digitalWrite的动作(依 makeblock 的埠决定哪个脚位):
依这个写法模式,似乎很像是 HC-SR04,不过,依上面的程式码来看,它都只用到s2,也就是脚位13,为什么呢?因为 Makeblock 最新的超音波感应器 V3.0,可以自行使用杜邦线接线的脚位只有三个,三个脚位中,有两个分别是接电源与 GND,一个是信号接脚,这意谓着,Trig 与 Echo 必须使用同一个脚位,这也就是为什么,在measure的程式码中,看到的都只有使用s2脚位。
可是 HC-SR04 是四个脚位,Trig 是其中独立的一个脚位,怎么能适用“超音波感应器”方块呢?自行触发 Trig 啰!只是直接使用“设置数位脚位”方块的速度不够快,因此,我想到的是,使用“播放脚位”方块,这可以控制脚位电压高低的频率,建立起类似以下的效果:
简单来说,最后我就只是利用了“超音波感应器”方块底层的pulseIn来取得回波时间而已,这个方法下测出来的距离数值会跳动,不过大致上勉强可用啦!
(这个方法比较适用于 mBlock 2.1.4,在 mBlock 2.1.5 中,韧体上似乎做了些修改,虽然还是可以用相同方法,不过,跳动的范围会变大许多。)
超音波搭配七段显示器
那么,就也来回顾一下〈mBlock & Arduino(7)七段显示器之 HELLO!〉,试着将超音波感应器量得的距离,使用七段显示器来回报吧!
因为只有一颗七段显示器,超过 8 公分就一律显示为 0 了 … XD
清单 numbers 使用字串编码 0 到 8 的数字:
感谢CodeData用户:caterpillar的贡献 著作权归作者所有
整理:宁波家电物联网云平台,中科极动云
网友评论