基于Wemos的超声波避障小车(可自行判断方向)

本文介绍了基于ESP8266的超声波避障小车制作过程,包括超声波传感器的工作原理、WeMos D1的功能特性以及如何使用Servo库控制舵机。在代码实现中,小车能够根据探测到的障碍物自动转向。通过集成WiFi功能,可以实现远程监控和控制。文章强调了动手实践在学习过程中的重要性,适合电子爱好者参考。
摘要由CSDN通过智能技术生成

 基于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;
      }
    }
    */
  }
  //}
//}







  

四.总结

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

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值