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交互-超声波测距传感器的读取与显示的主要内容,如果未能解决你的问题,请参考以下文章

Processing与Arduino交互-光敏传感器

Processing与Arduino交互-光敏传感器

Arduino与Processing交互-旋转编码器控制播放音乐

Arduino与Processing交互-旋转编码器控制播放音乐

processing与arduino互动编程

Arduino UNO与超声波传感器接口进行测距,将距离显示在LCD1602液晶屏上,第一行?