Arduino与Processing交互-超声波测距传感器的读取与显示
Posted 村头陈师傅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino与Processing交互-超声波测距传感器的读取与显示相关的知识,希望对你有一定的参考价值。
公众号:STCode
1-超声波测距传感器简介
超声波测距传感器是利用频率高于20kHz的声波在空气中传播,遇到障碍物反射回来,通过计算发射和接收时间差,可以计算出发射点与障碍物间的距离。
超声波测距的公式如下: L=Vx(T2-T)/2
式中L为测量的距离长度;V为超声波在空气中的传播速度(在20℃时为344m/s);T为测量距离的起始时间;T2为收到
回波的时间;速度乘以时间差等于来回的距离,除以2可以得到实际距离。
超声波测距传感器的种类繁多,有的模块带有串口或I2C输出,这种能直接输出距离值。本设计选用了市面上性价比较高的模块HC-SR04,如图所示。该传感器测量距离为2~450cm,精度为3mm。
超声波测距目前已经广泛应用于汽车倒车雷达等设备,机器人爱好者也将其用于机器人导航、智能小车避障等。超声波传感器的测量精度往往只能达到厘米数量级,若要进一步提高精度,需进行温度补偿计算。声速受温度影响较为明显,例如,当温度为0℃时超声波速度是332m/s,30℃时是350m/s。温度变化引起的超声波速度变化为18m/s。HC-SR04超声波测距模块引脚说明如下:
2-Arduino读取超声波传感器
HC-SR04模块的工作原理如下:
1)单片机引脚拉低Trig,给予至少10us的高电平信号去触发。
2)模块触发后会发射8个40KHz的方波,并开始自动检测是否有信号返回。
3)若接收到信号返回,则通过Echo输出一个高电平,高电平持续的时间便是超声波从发射到接收的时间,该模块工作时序如图所示。
触发脉冲触发后。HC-SR04模块会自动发射8个40kHz的方波。并自动检测是否有信号返回,如果有信号返回,通过ECHO输出一个高电平、高电平持续的时间便是超声波从发射到接收的时间。
那么测试距离=高电平持续时间x340m/sx0.5。
3-接线图
4-超声波测距代码
int outputPin =2; //接超声波Trig到数字D2脚
int inputPin =3; //接超声波Echo到数字D3脚
void setup()
{
Serial.begin(9600);
pinMode(inputPin,INPUT);
pinMode(outputPin,OUTPUT);
}
void loop()
{
digitalWrite(outputPin,LOW);
delayMicroseconds(2);
digitalWrite(outputPin,HIGH);//发出持续时间为10微秒到Trig脚驱动超声波检测
delayMicroseconds(10);
digitalWrite(outputPin,LOW);
int distance =pulseIn(inputPin,HIGH); //接收脉冲的时间
distance =distance/58; //将脉冲时间转换为距离值
Serial.print("The distance is :");
Serial.println(distance);
delay(50);
}
接好电路后,下载该程序到Arduino控制器,打开串口监视器将能看到超声波传感器检测到的距离值。
5-Processing绘制距离值与提示
读取一张公交车的图片,在界面的右边画上一堵墙,墙上的读数是公交车与墙的距离。用键盘的“←”和“→”键控制公交车的远离或靠近墙。与墙的实际距离会显示在屏幕的右上角,最远距离为450cm,最近为0cm。
公交车图片如下,注意要将该图片拖动到Processing草稿区。
代码如下:
PImage BUS;
int x =0,y =220;
int distance =0;
void setup()
{
size(640,480);
BUS =loadImage("bus.png"); //读取图片
background(255);
image(BUS,x,y);
}
void draw()
{
background(255);
fill(30,40,40);
rect(600,80,30,395);
image(BUS,x,y);
distance=450-x*450/(600-BUS.width); //换算与墙之间的距离,设其最大值为450m
text("Distance is "+distance+"CM",250,50);
}
void keyPressed() //特殊键的key值为CODED,此时需要keyCode再次判断
{
if(key==CODED)
{
switch(keyCode)
{
case LEFT: //按下“左”键
if(x>0)
{
x=x-1;
}
else
{
x=0;
}
break;
case RIGHT: //按下“右”键
if(x<(600-BUS.width))
{
x=x+1;
}
else
{
x= 600-BUS.width;
}
break;
default:
break;
}
}
}
用键盘的“←”和“→”键控制公交车的远离或靠近墙,Processing界面效果如下:
6-Arduino与Processing交互
读取超声波传感器的数值,将值显示在屏幕的右上角。根据该距离值来绘制公交车与墙之间的距离。超声波测距传感器的数值大,则公交车与墙的距离远,读取的数值小,则公交车离墙的距离近。
Processing端代码:
import processing.serial.*;
Serial myPort;
PImage BUS;
int x =0,y =220;
int distance =0;
void setup()
{
size(640,480);
BUS =loadImage("bus.png");
myPort =new Serial(this,"COM10",9600);
}
void draw()
{
if(myPort.available()>0)
{
distance =myPort.read();
println(distance);
}
background(255);
fill(30,40,40);
rect(600,80,30,395);
x =(450-distance)*(600-BUS.width)/450; //将读取的距离值换算成实际的坐标
image(BUS,x,y);
text("Distance is "+distance+"CM",250,50);
}
Arduino端代码:
int outputPin =2; //接超声波Trig到数字D2脚
int inputPin =3; //接超声波Echo到数字D3脚
void setup()
{
Serial.begin(9600);
pinMode(inputPin,INPUT);
pinMode(outputPin,OUTPUT);
}
void loop()
{
digitalWrite(outputPin,LOW);
delayMicroseconds(2);
digitalWrite(outputPin,HIGH);//发出持续时间为10微秒到Trig脚驱动超声波检测
delayMicroseconds(10);
digitalWrite(outputPin,LOW);
int distance =pulseIn(inputPin,HIGH); //接收脉冲的时间
distance =distance/58; //将脉冲时间转换为距离值
Serial.write(distance);
delay(50);
}
上传代码验证下效果吧~
以上是关于Arduino与Processing交互-超声波测距传感器的读取与显示的主要内容,如果未能解决你的问题,请参考以下文章
Arduino与Processing交互-旋转编码器控制播放音乐