做一个简单的超声波测距装置,用Arduino
novakon2013/04/23电子技术 IP:广东
大家好我是电子小白,我的水平不高,所以写出来的教程水平也不高,请多包涵。
这个教程是写给没有任何电子基础的同学看的。


零基础教程:做一个简单的超声波测距装置


首先你需要一块Arduino单片机。为什么不是51单片机呢?不是都说51单片机是入门吗?
我认为“入门”这个词代表着简单,但是不代表低端。我用的第一块单片机是STM32F407,纯粹只是因为它够快够猛IO口够多罢了。
Arduino的编程够简单,各种功能类库啥的比较齐全,所以推荐初学者折腾这个。


闲话不多说,这是我花四十多大洋购买的Arduino Leonardo板子,右边的是在网上买的超声测距模块,十几块钱一个。


DSC_2321.jpg

(背面写的是made in italy,但愿吧)


得到Arduino单片机之后,上Arduino官方网站下载Arduino开发环境:
XXXXXXXXXXXXXXXXX/en/Main/Software


选择windows,下载。
zip文件直接解压。在解压后的文件夹找到drivers文件夹,
选择里面的XXXXXXXXXXf文件,右键,安装驱动程序。


然后就可以把arduino连到电脑的usb口,电脑应该能够成功识别插入的是Arduino.


然后运行arduino.exe:
QQ截图20130423154229.jpg



在菜单里面选择你的arduino型号:
QQ截图20130423154658.jpg



接下来就要输入代码。代码是C语言的语法,不过不会C语言也没关系。在菜单里面找到blink,打开最简单的例子:


QQ截图20130423155629.jpg



(待续
+10  科创币    justinpiggy    2013/04/23 已补充注释
+100  科创币    拔刀斋    2013/04/23 非常详细的入门教程
+10  科创币    yurifreeman    2013/04/24 怀念啊,我的激活帖就是用areuino做的超声波测距。
+1  科创币    布布卡    2013/07/31 Arduino单片机+1
来自:电子信息 / 电子技术
31
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon 作者
11年9个月前 IP:未同步
518878
QQ截图20130423160158.jpg

这就是blink程序。

程序中灰色的字是注释,也就是和程序无关的说明性文字。写注释的方法:用/*和*/包住一段文字,或者在某一行的开头加入两个斜杠//

点击upload按钮,就可将程序编译并上传到arduino上面开始运行。
QQ截图20130423160422.jpg

如果上传失败,检查这里,看有没有给当前arduino使用的usb口打钩
QQ截图20130423160759.jpg

(待续
+30
科创币
极度深寒
2013-04-23
正需要这玩意..谢
+20
科创币
ry7740kptv
2013-04-23
很不错
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年9个月前 IP:未同步
518882
blink程序运行后,应该能够看到arduino开发板上面的led灯在闪动,每秒钟切换一次状态(明/暗)。

下面是对blink程序的解释:

/*
  Blink
  将一个LED不断地点亮、熄灭,每秒钟切换一次,重复不断地运行。
*/

// 大多数的Arduino板子的13号针脚,都连接了一个LED灯。
// 现在要定义一个叫led的整数型(int)变量,值为13;
int led = 13;

// 下面是叫做setup的函数。每当板子通电或者重启时,运行一次这个函数里面的代码,而且只运行一次。
void setup() {                
  // 这是pinMode函数,用来调整针脚的工作方式。函数有两个参数,一个是针脚的号码,一个是工作方式。
  // led代表13号针脚,这个脚的另一头通常连接了板子上的一个LED灯。OUTPUT表示输出模式,即这个脚输出一个电压,这个电压可以是0V,也可以是芯片供电电压5V
  pinMode(led, OUTPUT);    
}

// 而loop函数在setup函数之后运行,但是loop函数会不断地、一次又一次地循环运行。
void loop() {
  digitalWrite(led, HIGH);   // digitalWrite函数的意思是,向某个针脚写入输出的状态。HIGH代表高电平。
//这句话就将第13号针脚设为5V电压,LED灯就亮了。
  delay(1000);               // delay函数代表延时等待,单位是毫秒。等待1000毫秒就是1秒钟。也就是让单片机休息一秒钟
  digitalWrite(led, LOW);    // 向13号针脚写入低,也就是设为0V电压。这一步就关掉了led
  delay(1000);               // 再等待一秒
//到此为止,循环执行。
}


QQ截图20130423162839.jpg



此时我们将程序中的delay(1000); 都改成delay(100); 然后上传到arduino,就会看到LED灯闪得更快了,每0.1秒改变一次状态。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年9个月前 IP:未同步
518890
如果能够成功地运行blink程序,并且通过修改参数改变LED灯的闪烁频率,就算是成功地给Arduino编程了。

下面介绍这个教程的主角,超声波模块:
DSC_2321.jpg
图上标出了四个脚的名称,vcc trig echo gnd

然后将它插在我的leonardo板子的2-5脚上。0和1脚要作为和计算机之间串口通信用的针脚,保留不用。
DSC_2323.jpg

那么介绍一下这个超声波模块的用法。首先vcc脚连5V电压,gnd脚连0V电压供电。当trig脚接收到高电平(也就是当单片机向trig脚输出一个高电压)的时候,会向前方发射一个超声波信号。

发射信号完毕,模块会通过echo脚,向单片机发送高电平;当超声波反射信号接收到之后,模块又会把echo脚设为低电平。我们只要测量echo脚电压变化的间隔时间,就可以知道超声波在空气中从发射到返回花掉的时间,也就可以计算出距离了。

下面给出程序。
(待续
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年9个月前 IP:未同步
518897
int ssgnd=5; //首先为了程序看着方便,定义若干针脚。gnd是5, echo是4, trig 是3, vcc是2.
int ssecho=4;
int sstrig=3;
int ssvcc=2;
//前缀ss是supersonic的意思,不加也可以。

void setup() {                
  pinMode(ssgnd,OUTPUT);
  pinMode(sstrig,OUTPUT);
  pinMode(ssecho,INPUT); //除了echo脚设成输入模式(INPUT),其他都设为输出模式。因为我们要检测echo脚的电平变化,所以设成输入模式。
  pinMode(ssvcc,OUTPUT);

  digitalWrite(ssvcc,HIGH); //将vcc脚设为高电压5V,给超声波模块供电。
  XXXXXXXXXgin(9600); //启用串口(虽然是通过usb连接模拟的),速率为9600字每秒。
}

这里讲一下串口。我们用串口将信息发回到电脑,在电脑上用串口查看程序就可以看到单片机发来的信息。
比如我测量到了距离信息,我就可以把这个距离数值不断地发回到电脑上,这样一来就可以实时观察它的变化。

(待续
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年9个月前 IP:未同步
518903
int supersonicread()
//这里我定义了一个函数,叫做supersonicread,顾名思义就是读取超声波传感器数值。
//函数前面的int表示这个函数返回一个整数。
{
   digitalWrite(sstrig,HIGH); // 将trig脚电压设为高
  digitalWrite(sstrig,LOW); //将trig脚电压设为低,这样就向模块发送了一个信号,让模块发射超声波。
  int echotime=pulseIn(ssecho,HIGH); //定义一个叫做echotime(回声时间)的量,并让它等于pulseIn函数的返回值。这里介绍一下pulseIn函数。

pulseIn(abc,HIGH) 代表在abc针脚上,等待一个高电压脉冲(等待电压由低变高,又由高变低)。然后返回一个值,这个值代表两次电压变化经过的时间,单位是微秒(microseconds, us).

pulseIn(abc,LOW)代表等待一个低电压脉冲,其他一样。
所以在程序里面写int echotime=pulseIn(ssecho,HIGH);  就代表我在ssecho脚上,等待电压由低变高(发射了超声波),开始计时,然后等待电压由高变低(收到了超声波),停止计时,然后把经过的时间写到echotime变量里面去。

  return echotime; //return 命令 表示把一个数作为这个函数的返回值。我们把echotime,也就是回声时间,作为这个函数返回的数值。
}

然后是程序主干,也就是loop函数。

void loop() {
  int microseconds=supersonicread(); //定义一个叫microseconds变量,令它的值等于supersonicread函数的返回值。我们知道supersonicread的返回值,是超声波从发射到回声所经过的时间,单位是微秒。所以现在microseconds变量里面就保存了这个时间。
  XXXXXXXXXint(microseconds); //XXXXXXXXXint代表从串口输出文字(这样我们就可以用电脑接收)。先输出微秒值;
  XXXXXXXXXint("us,"); //再输出单位符号
  float centimeters=microseconds/58.0; //定义一个叫做centimeters的float(浮点数,也就是带有小数部分的数)类型的变量,并让它的值等于计算出的距离,单位是厘米。这里的换算关系很简单,微秒/1000000=秒,厘米/100=米,声速是每秒3xx米,而声音传播的路程是实际距离的两倍……
  XXXXXXXXXint(centimeters); //从串口输出厘米值
  XXXXXXXXXint("cm.\\n"); //输出单位符号厘米,最后面的斜杠n代表回车符号
  delay(100);//延迟100毫秒,然后循环。
}
QQ截图20130423173055.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年9个月前 IP:未同步
518906
上传程序到你的arduino板子,开始运行,会听到超声模块发出疙瘩声。

然后在arduino开发界面找到串口查看程序:

QQ截图20130423173838.jpg

就能看到源源不断的输出了。
QQ截图20130423173952.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年9个月前 IP:未同步
518988
引用第10楼warmonkey于2013-04-23 19:10发表的  :
吐槽一下,LZ的C代码,和Arduino全C++的库格格不入。

Playground的NewPing库
XXXXXXXXXXXXXXXXXXXXXXXXXXXX/Code/NewPing

.......


吐个槽哈。
从【代码越短越好】的角度来看,当然应该用人家写好的类库。
在这个教程里,我写了一个函数,没有用人家写好的库来演示,是希望没有单片机基础/单片机基础很差的同学,通过阅读我的代码,掌握数字输入、输出等等功能的基本用法。如果只是纯粹演示类库,两句话就搞掂了,人家还没弄清楚怎么回事呢。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年9个月前 IP:未同步
518990
引用第11楼laji3865689于2013-04-23 20:50发表的  :
Leonardo才40多?
为毛我的UNO都花了180多。。。[s:225]
据说Leonardo还可以软件设置成USB HOST,一次满足你两个愿望




是的,leonardo可以把自己模拟成USB鼠标键盘,这貌似是其他arduino上没有的功能。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年8个月前 IP:未同步
520000
回 16楼(量子隧道) 的帖子
关于arduino选购:

我也是第一次买arduino。arduino本身并没有多大区别,无非是有的型号可以usb直接下载,有的型号要麻烦一点点,还有就是运行速度的差别。
arduino从性能和针脚数量上来讲是不怎么样,唯一的优点是编程门槛低。

选型可以去官网参考一下。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
11年8个月前 IP:未同步
524654
回 25楼(daphigee) 的帖子
网上卖这个模块的就有资料,具体你翻一下。XXXXXXXXXXXXXXXXXXXXX/file/id_XXXXXXXXXXXXXXXXXXXXml
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
novakon
学者 机友 笔友
文章
1256
回复
8386
学术分
16
2008/03/29注册,2年10个月前活动

已走,勿送

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}