基于Wemos的超声波避障小车(可自行判断方向)
一. Wemos和超声波测距的原理
超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收,电路板上有4引脚:VCC(正极),Trig(触发),Echo(回应),GND(接地) 主要参数:
1.工作电压与电流:5V,13MA
2.感测距离:2~400CM
3.感测角度:不大于15度
4.被测面积不要小于50cm平方并且尽量平整。
5.具备温度补偿电路
上图为超声波的时序图,有不明白的可直接百度,都会有。
二.硬件平台介绍WeMos D1 (与开发环境的介绍)
(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等
各种硬件开发接口,迅捷开发自带串口调试工具
缺点:程序编译速度慢
三.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;
}
}
*/
}
//}
//}
四.总结
每一份代码都得用心去写,这样你会学到更多,编写这段代码,我也调试的蛮久的,但过程是非常的愉快的,因为疫情在家很无聊因此让自己动起来很重要,在项目与实验中方能体会到那种美好而忙碌的感觉。希望能帮得到每一正在经历的你们。