0°

Arduino小车-超声波测距实验

用手在超声波模块前面不断移动,1602液晶不断显示超声波模块到手的距离

介绍

本文介绍智能小车超声波测距功能

电气参数

超声波模块参数

  • 1、典型工作用电压:5V。
  • 2、超小静态工作电流:小于2mA。
  • 3、感应角度:不大于15 度。
  • 4、探测距离:2cm-400cm
  • 5、高精度:可达0.3cm。
  • 6、盲区(2cm)超近
  • 7、测距的公式表示为:L=C×T
    式中L 为测量的距离长度;C 为超声波在空气中的传播速度;T 为测量距离传播的时间差(T 为发射到接收时间数值的一半)。已知超声波速度C=344m/s (20℃室温) 

1602LCD主要技术参数

  • 显示容量为16×2个字符;
  • 芯片工作电压为4.5~5.5V;
  • 工作电流为2.0mA(5.0V);
  • 模块最佳工作电压为5.0V;
  • 字符尺寸为2.95×4.35(W×H)mm。

连接图

  • 超声波模块引脚
  1.Vcc
    2.Trig(触发端) 
    3.Echo(回声端) 
    4.Gnd
    备注:触发端发一个10US 以上的高电平,就可以在回声端等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。
  • 在J2插口插上超声波模块。注意:插好后测一下超声波模块的VCC/GND引脚是否和小车的VCC/GND引脚通路
  • 超声波模块的Echo和Trig引脚通过J2插口连接到P2.0和P2.1,再连接到Arduino
    Echo回声脚 → P2.0/IN5 → Arduino/A0
    Trig 触发脚 → P2.1/IN6 → Arduino/A1
  • 1602采用标准的16脚接口,其中:
    第1脚:VSS为地电源
    第2脚:VDD接5V正电源
    第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
    第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
    第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读信号,当RS为高电平RW为低电平时可以写入数据。
    第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
    第7~14脚:D0~D7为8位双向数据线。
    第15脚:背光电源正极
    第16脚:背光电源负极
  • 1602液晶连接图

Arduino小车-超声波测距实验
1602/pin1_VSS → GND
1602/pin2_5V → 5V
1602/pin3_V0 → 通过10k的变阻器连接到GND,可用3k~5k的电阻代替
1602/pin4_RS → Arduino/pin11
1602/pin5_RW → GND 保持写入状态
1602/pin6_EN → Arduino/pin2
1602/pin7-10_D0-D3 → NC
1602/pin11-14_D4-D7 → Arduino/pin3-pin4-pin7-pin8 四线数据模式
1602/pin15 → 5V
1602/pin16 → GND

样例代码

//===============================================================
//  智能小车超声波测距实验
//===============================================================
#include <LiquidCrystal.h> //申明1602液晶的函数库
//申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一
LiquidCrystal lcd(11,2,3,4,7,8); //4数据口模式连线声明,
//===============================================================
//LCD的接口:各个引脚连接的I/O口编号,格式为
// LiquidCrystal(rs, enable, d4, d5, d6, d7)
// LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
// LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
// LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
//===============================================================

int Echo = A0;  // Echo回声脚(P2.0)
int Trig =A1;  //  Trig 触发脚(P2.1)

int Distance = 0;

void setup()
{
  Serial.begin(9600);     // 初始化串口
  //初始化电机驱动IO为输出方式
  //初始化超声波引脚
  pinMode(Echo, INPUT);    // 定义超声波输入脚
  pinMode(Trig, OUTPUT);   // 定义超声波输出脚
  lcd.begin(16,2);      //初始化1602液晶工作                       模式
  //定义1602液晶显示范围为2行16列字符  
}


void Distance_test()   // 量出前方距离 
{
  digitalWrite(Trig, LOW);   // 给触发脚低电平2μs
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);  // 给触发脚高电平10μs,这里至少是10μs
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);    // 持续给触发脚低电
  float Fdistance = pulseIn(Echo, HIGH);  // 读取高电平时间(单位:微秒)
  Fdistance= Fdistance/58;       //为什么除以58等于厘米,  Y米=(X秒*344)/2
  // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
  Serial.print("Distance:");      //输出距离(单位:厘米)
  Serial.println(Fdistance);         //显示距离
  Distance = Fdistance;
}  

void loop()
{
  Distance_test();
  if((2<Distance)&(Distance<400))//超声波测距范围2cm到400cm
  {
    lcd.home();        //把光标移回左上角,即从头开始输出   
    lcd.print("    Distance: ");       //显示
    lcd.setCursor(6,2);   //把光标定位在第2行,第6列
    lcd.print(Distance);       //显示距离
    lcd.print("cm");        //显示
  }
  else
  {
    lcd.home();        //把光标移回左上角,即从头开始输出  
    lcd.print("!!! Out of range");       //显示超出距离
  }
  delay(250);
  lcd.clear();
}

测试结果

用手在超声波模块前面不断移动,1602液晶不断显示超声波模块到手的距离

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论