赞
踩
超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收,电路板上有4引脚:VCC(正极),Trig(触发),Echo(回应),GND(接地) 主要参数:
1.工作电压与电流:5V,13MA
2.感测距离:2~400CM
3.感测角度:不大于15度
4.被测面积不要小于50cm平方并且尽量平整。
5.具备温度补偿电路

上图为超声波的时序图,有不明白的可直接百度,都会有。
(1)WeMos D1
1 基于ESP-8266EX
2 ARDUINO兼容, 使用RDUINO IDE来编程
3 11*I/O引脚
4 1 * ADC 引脚(输入范围0 ~ 3.3)
5 板载5V 1A 开关电源 (高输入电压24V)
(2)软件环境的介绍(ARDUINO)
ARDUINo开发环境,和KEIL对比
优点:集成很多开发库如串口,网络, SG90等
各种硬件开发接口,迅捷开发自带串口调试工具
缺点:程序编译速度慢
servo类函数的用法(代码中可理解)
| attach | 连接舵机(自带库9/10角有效) |
| write | 角度控制可调节,具体看代码 |
| writeMicroseconds() | 更精准的角度控制(um级) |
| read() | 读上一次舵机转动角度 |
| attached() | 检查舵机及是否连接控制板上 |
| detach() | 断开舵机连接,使接口(9/10角)可做PWM输出 |
该部份核心的代码参考:
#define PIN_SERVO D3 //定义了D3这个引脚
Servo myservo; //定义了一个myservo的类
myservo.attach(PIN_SERVO); //把D3与舵机连接起来了
myservo.write(30); //可自行的定义偏转角度
- #include<ESP8266WiFi.h>
- #include<Servo.h>
- #define DuoPIN D3 //设置舵机的引脚输出
- Servo myDuoJi; //定义一个类
- #define Dong1 D6 //定义引脚的名称
- #define Dong2 D7
- #define Zhuan1 D4
- #define Zhuan2 D5
- #define Echo D2 //超声波传感器端E
- #define Trig D8 //超声波传感器端D
- #define den D9 //警示灯的引脚
- char* ssid ="electric";
- char* passwd ="dianzixiehui";
- int port = 8888;//设置端口号
- WiFiServer server(port);//设置服务器端口号
-
- long getTime() //获取波在空气中的时间
- {
- digitalWrite(Trig,HIGH);//发送一个10us的脉冲,
- delayMicroseconds(10);
- digitalWrite(Trig,LOW);
-
- return pulseIn(Echo,HIGH); // 波传输的过程中echo高电平,计算高电平时间,就是获取波传输的
- // 时间,单位是us(微秒)
- }
-
- void initWifiSta()
- {
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid,passwd);
- while(WiFi.status() != WL_CONNECTED){
- Serial.print(".");
- delay(500);
- }
-
- }
-
-
- void initL9110s() //四个引脚的初始化 为输出引脚
- {
- pinMode(Dong1,OUTPUT);
- pinMode(Dong2,OUTPUT);
- pinMode(Zhuan1,OUTPUT);
- pinMode(Zhuan2,OUTPUT);
- }
- void zuo() //向左
- {
- digitalWrite(Dong2,LOW);
- digitalWrite(Zhuan1,HIGH);
-
- }
- void you(){ // 向右
-
- digitalWrite(Dong2,HIGH);
- digitalWrite(Zhuan1,LOW);
- }
- void qian() // 向前
- {
- digitalWrite(Dong2,HIGH);
- digitalWrite(Zhuan1,HIGH);
-
- }
- void hou() // 停止
- {
-
- digitalWrite(Dong1,LOW);
- digitalWrite(Dong2,LOW);
- digitalWrite(Zhuan1,LOW);
- digitalWrite(Zhuan2,LOW);
- }
- void tui() // 退后
- {
- digitalWrite(Dong1,LOW);
- digitalWrite(Dong2,LOW);
- digitalWrite(Zhuan1,LOW);
- digitalWrite(Zhuan2,HIGH);
- }
-
- void setup() {
- initL9110s();
- pinMode(Echo,INPUT); //初始化超声波引脚
- pinMode(Trig,OUTPUT);
- pinMode(den,OUTPUT); //初始化指示灯的控制引脚
- Serial.begin(115200); //初始化串口(重要)
- myDuoJi.attach(DuoPIN);
- initWifiSta();
- server.begin();//启动服务器
- Serial.println(WiFi.localIP());//通过串口打印wemos的IP地址
- }
-
- void loop() {
-
- char cmd;
- int mark = 0;
- long dis;
- long y;
- long z;
- long q;
-
- qian();
- delay(50);
-
- dis = getTime()/58; //取超声波的探测的距离
- Serial.print(dis);
-
-
-
-
- if(dis < 10){
- tui(); //当小车探到的距离是 dis< 10 时的会后退
- delay(500); // 这是后退的时间可调节
- hou(); // 后退完是先停留一小段时间,小车停留的这段时间,警示灯会亮启,
- delay(500);
- digitalWrite(den,HIGH); /*******************这段时间是小车亮起的时间************************/
- delay(500);
- digitalWrite(den,LOW);
- delay(500);
- digitalWrite(den,HIGH);
- delay(500);
- digitalWrite(den,LOW);
- delay(500);
- digitalWrite(den,HIGH);
- delay(500);
- digitalWrite(den,LOW); /******************* 灯会一闪一闪********************/
- myDuoJi.write(0); // 舵机向左转90度 这先说明一下,因为每个人舵机放的位
- // 置都不经相同,因此调节的话可更改括号里的值
- delay(2000);
- y = getTime()/58; //重新获取超声波的探测的距离
- delay(500);
-
- myDuoJi.write(180); // 舵机向左转180度 这先说明一下,因为每个人舵机放的位置都
- // 不经相同,因此调节的话可更改括号里的值
- digitalWrite(den,HIGH); /*****************************这段时间是小车亮起的时间***********************/
- delay(500);
- digitalWrite(den,LOW);
- delay(500);
- digitalWrite(den,HIGH);
- delay(500);
- digitalWrite(den,LOW);
- delay(500);
- digitalWrite(den,HIGH);
- delay(500);
- digitalWrite(den,LOW);/****************************************************************************/
- delay(500);
- z = getTime()/58; //旋转180度后再次获取该方向的超声波的距离,先说一下为什么要
- // 获取两次不同方向的距离,因为我的代码是当小车向前开碰到障碍
- // 物时,会探测左和右的障碍误的距离,然后选择更好的一个方向
- // 去行驶
- delay(500);
-
- myDuoJi.write(90);
- delay(500);
- q = getTime()/58; // 获取前方的超声波的距离
- digitalWrite(den,HIGH);
- delay(500);
- digitalWrite(den,LOW);
- delay(300);
-
- if(z<y) //当右边的距离大于左边时
- {
- zuo();
- delay(800);
- }else if(y<z){ //当左边的大于右边时
- you();
- delay(800);
- }
-
-
-
- }else{ // 否则向前
- qian();
-
- }
- /*if(mark == 0)
- {
-
- switch(cmd){
- case 'q':
- qian();
- break;
- case 'h':
- hou();
- break;
- case 'y':
- zuo();
- break;
- case 'z':
- you();
- break;
- }
- }
- */
- }
- //}
- //}
-
-
-
-
-
-
-

每一份代码都得用心去写,这样你会学到更多,编写这段代码,我也调试的蛮久的,但过程是非常的愉快的,因为疫情在家很无聊因此让自己动起来很重要,在项目与实验中方能体会到那种美好而忙碌的感觉。希望能帮得到每一正在经历的你们。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。