WeMos下实现小车避障与手机控制

参考:WeMos下实现小车避障与手机控制
作者:爱学习的小王呀
发布时间:2020-10-02 10:17:45
网址:https://blog.csdn.net/hongliwong/article/details/108900048?spm=1001.2014.3001.5501

前言

通过WeMos D1开发板、超声波模块、蜂鸣器、L9110s步进电机实现:小车方向控制,如果小车距离障碍物的距离小于10厘米 ,再按前进蜂鸣器就会报警,并后退一定的距离 。

一、项目软硬件平台及开发环境

1.硬件平台介绍

在这里插入图片描述
特性
1.基于ESP-8266EX
2.Arduino兼容,使用rduino IDE来编程
3.11 x I/O 引脚
4.1 x ADC 引脚(输入范围0-3.3V)
5.板载5V 1A开关电源(高输入电压24V)
工作中:
和stm32模块开发类似,集成度高
STM32方案也更经济便宜

2.开发环境介绍

在这里插入图片描述

ArduiNo开发环境,和keil对比
优点:
集成很多开发库如串口,网络,sg90等
各种硬件开发接口,迅捷开发
自带串口调试工具
缺点: 程序编译速度慢

3.开发环境配置支持Wemos

在这里插入图片描述

二、驱动演示

1.蜂鸣器

在这里插入图片描述

//基础控制:蜂鸣器叫唤和不叫唤
void setup()
{
pinMode(D5, OUTPUT); //设置引脚为输出引脚
}

void loop()
{
digitalWrite(D5, HIGH); // 输出高电平,蜂鸣器闭嘴
delay(1000); //这一秒内都得闭嘴
digitalWrite(D5, LOW); //输出低电平,蜂鸣器吼起来
delay(1000); //吼一秒(延时期间,蜂鸣器控制引脚属于低电平)
}

2.Wemos串口通信

串口有关的函数:在这里插入图片描述
串口与wemos的简单通信:
在这里插入图片描述
在这里插入图片描述
串口控制蜂鸣器代码:

#define BEEP D5

void setup() {
Serial.begin(115200); //初始化串口,设置波特率为115200
pinMode(BEEP, OUTPUT); //设置引脚为输出引脚
digitalWrite(BEEP, HIGH); // 上电不让蜂鸣器响起
}

void loop()
{
int cmd;
if ( Serial.available() > 0 )
{ //检测串口是否有数据
cmd = Serial.read(); // 读取串口数据
Serial.println(cmd);
if (cmd == 1) { //如果读取的数据是1
digitalWrite(BEEP, LOW); // 蜂鸣器响起
}
else
{
digitalWrite(BEEP, HIGH); // 否则(读取数据非1)蜂鸣器不响
}
}
}

3.Wemos和wifi

**板载无线网卡:支持AP(路由), sta(上网设备)模式**

 
 
  • 1

在这里插入图片描述
作为设备接入wifi(STA模式)

#include <ESP8266WiFi.h>
char* ssid = “TENK-888; //“wifi热点名称”
char* passwd =12345678; //”wifi热点密码”

void initWifiSta()
{
WiFi.mode(WIFI_STA); // 设置STA模式
WiFi.begin(ssid, passwd); //连接网络
while (WiFi.status() != WL_CONNECTED) //判断WiFi接入状态
{
Serial.print(".");
delay(500);
}
}
void setup() {
//初始化串口
Serial.begin(115200);
//初始化wifi
initWifiSta();

}

void loop() {
Serial.println(WiFi.localIP()); //通过串口打印wemos的IP地址
delay(500);
}

由串口打印出wemos的IP地址:192.168.1.5
在这里插入图片描述
手机调试工具发送指令控制蜂鸣器:
在这里插入图片描述
编程代码:
#include <ESP8266WiFi.h>

#define BEEP D5

char* ssid = “TENK-888”; //“wifi热点名称”
char* passwd = “12345678”; //”wifi热点密码”
int port = 8888; //端口号
WiFiServer server(port); // 设置服务器端口号

void initWifiSta()
{
WiFi.mode(WIFI_STA); // 设置STA模式
WiFi.begin(ssid, passwd); //连接网络
while (WiFi.status() != WL_CONNECTED) //判断WiFi接入状态
{
Serial.print(".");
delay(500);
}
Serial.println(WiFi.localIP()); //通过串口打印wemos的IP地址
delay(500);
}

void initBeep()
{
pinMode(BEEP, OUTPUT); //设置引脚为输出引脚
digitalWrite(BEEP, HIGH); // 输出高电平,蜂鸣器闭嘴
}

void setup() {

initBeep(); //初始化蜂鸣器
Serial.begin(115200); //初始化串口
initWifiSta(); //初始化wifi
server.begin(); //启动服务器

}

void loop() {

char cmd;

WiFiClient client = server.available(); //服务初始化
while (client.connected())
{
while (client.available() > 0) //等待客户端连接
{
cmd = client.read();//读取数据
if(cmd == ‘1’)
{
digitalWrite(BEEP, LOW);
}
else
{
digitalWrite(BEEP, HIGH);
}

        }

 
 
  • 1

}
}

4.Wemos和超声波测距

超声波测距原理:
在这里插入图片描述
超声波测距编程实现(距离小于10触发蜂鸣器发出声音):

#define Echo D2
#define Trig D8
#define BEEP D5

long getTime()
{
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);

return pulseIn(Echo,HIGH);
}

void initChaoShengBo()
{
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}

void initBeep()
{
pinMode(BEEP,OUTPUT);
digitalWrite(BEEP,HIGH);
}

void setup()
{
initChaoShengBo();
initBeep();
Serial.begin(115200);
}

void loop()
{
//获取距离
long dis;
dis = getTime()/58;
Serial.print(dis);
Serial.println(“cm”);
if(dis < 10)
{
digitalWrite(BEEP,LOW);
}
else
{
digitalWrite(BEEP,HIGH);
}
delay(500);
}

在这里插入图片描述

5.Wemos和L9110s步进电机控制器

L9110s步进电机控制器:
在这里插入图片描述
串口控制小车主要代码:

#define Dong1 D6
#define Dong2 D7
#define Zhuan1 D3
#define Zhuan2 D4

void initL9110s()
{
pinMode(Dong1,OUTPUT);
pinMode(Dong2,OUTPUT);
pinMode(Zhuan1,OUTPUT);
pinMode(Zhuan2,OUTPUT);
}

void qian()
{
digitalWrite(Dong1,HIGH);
digitalWrite(Dong2,LOW);
}

void hou()
{
digitalWrite(Dong1,LOW);
digitalWrite(Dong2,HIGH);
}

void zuo()
{
digitalWrite(Zhuan1,LOW);
digitalWrite(Zhuan2,HIGH);
}

void you()
{
digitalWrite(Zhuan1,HIGH);
digitalWrite(Zhuan2,LOW);
}

void setup()
{
initL9110s();
Serial.begin(115200);
}

void loop()
{
char cmd;

if(Serial.available() > 0)
{
cmd = Serial.read();
switch(cmd)
{
case ‘q’: qian();break;
case ‘h’: hou();break;
case ‘z’: zuo();break;
case ‘y’: you();break;
}
}
}

6.安卓APP控制小车

6.1 Android开发环境搭建
编程软件下载,解压。
Android导入程序包
在这里插入图片描述
在这里插入图片描述
Android修改代码支持你的Wemos
在这里插入图片描述
在这里插入图片描述

三、项目整合

1.相关函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.代码整合

实现小车方向控制,如果小车距离障碍物的距离小于10厘米 ,再按前进蜂鸣器就会报警,并后退一定的距离 。
Arduino完整编程代码:

这里先看一个别人写的例子,没有加入蜂鸣器的代码实现。主要是因为这篇代码格式很清晰。
摘自:wifi避障小车最终完整版(可实现手机端操作小车)
作者:陈峻熙
发布时间:2020-10-11 10:17:28
网址:https://blog.csdn.net/Tiazz/article/details/109008477?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&dist_request_id=1329187.10695.16178663918238401&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control

#include <ESP8266WiFi.h>

#define Dong1 D6
#define Dong2 D7
#define Zhuan1 D4
#define Zhuan2 D5
#define Echo D2
#define Trig D8

char* ssid = "126587"; //WiFi热点名称
char* passwd = "12345678"; //WiFi热点密码
int port = 8888;
WiFiServer server(port);//设置服务端口号

long getTime()
{
  digitalWrite(Trig, HIGH); //*******************
  delayMicroseconds(10);    //发送一个10微秒的脉冲
  digitalWrite(Trig, LOW); //************

  return pulseIn(Echo, HIGH); //波传输过程echo高电平,计算高电平时间就获取波传输的时间,单位是微秒
}

void initWifiSta()
{
  WiFi.mode(WIFI_STA);//设置STA模式
  WiFi.begin(ssid, passwd); //连接网络
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println(WiFi.localIP());//通过串口打印wemos的ip地址
}

void initChaoShengBo()
{
  pinMode(Echo, INPUT);
  pinMode(Trig, OUTPUT);

}

void initL9110s()
{
  pinMode(Dong1, OUTPUT);
  pinMode(Dong2, OUTPUT);
  pinMode(Zhuan1 , OUTPUT);
  pinMode(Zhuan2, OUTPUT);
}
void qian()
{
  digitalWrite(Dong1, HIGH);
  digitalWrite(Dong2, LOW);
}
void hou()
{
  digitalWrite(Dong1, LOW);
  digitalWrite(Dong2, HIGH);
}
void ting()
{
  digitalWrite(Dong1, LOW);
  digitalWrite(Dong2, LOW);
}

void zuo()
{
  digitalWrite(Zhuan1, HIGH);
  digitalWrite(Zhuan2, LOW);

} void you()
{
  digitalWrite(Zhuan1, LOW);
  digitalWrite(Zhuan2, HIGH);
}
void zheng()
{
  digitalWrite(Zhuan1, LOW);
  digitalWrite(Zhuan2, LOW);
}
void setup() {
  // put your setup code here, to run once:
  initL9110s();
  initChaoShengBo();
  Serial.begin(115200);
  initWifiSta();
  server.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  char cmd;
  long dis;
  int mark = 0;

  WiFiClient client = server.available();//服务器初始化
  while (client.connected()) {    //等待客户端接入
    while (client.available() > 0) {
      cmd = client.read();
      Serial.println(cmd);
      dis = getTime() / 58;
      if (dis < 10) {
        hou();
        delay(300);
        ting();
        mark = 1;
      } else {
        mark = 0;
      }
      if (mark == 0) {
        switch (cmd) {
          case'q':
            qian();
            break;
          case'h':
            hou();
            break;
          case'z':
            zuo();
            break;
          case'y':
            you();
            break;
          case's':
            ting();
            break;
          case'p':
            zheng();
            break;
        }
      }
    }
  }
}

回过头来继续看原文作者的代码:

#include <ESP8266WiFi.h>

#define Dong1 D6
#define Dong2 D7
#define Zhuan1 D3
#define Zhuan2 D4
#define Echo D2
#define Trig D8
#define BEEP D5

/*****************************************************************************/
/ /
/ wifi模块函数 /
/***************************************************************************/
char ssid = “TENK-888; //“wifi热点名称”
char passwd =12345678; //”wifi热点密码”
int port = 8888; //端口号
WiFiServer server(port); // 设置服务器端口号

void initWifiSta()
{
WiFi.mode(WIFI_STA); // 设置STA模式
WiFi.begin(ssid, passwd); //连接网络
while (WiFi.status() != WL_CONNECTED) //判断WiFi接入状态
{
Serial.print(".");
delay(500);
}
Serial.println(WiFi.localIP()); //通过串口打印wemos的IP地址
}
/*****************************************************************************/
/ /
/ 电机控制模块函数 /
/*****************************************************************************/
void initL9110s()
{
pinMode(Dong1,OUTPUT);
pinMode(Dong2,OUTPUT);
pinMode(Zhuan1,OUTPUT);
pinMode(Zhuan2,OUTPUT);
}

void qian()
{
digitalWrite(Dong1,HIGH);
digitalWrite(Dong2,LOW);
}

void hou()
{
digitalWrite(Dong1,LOW);
digitalWrite(Dong2,HIGH);
}

void ting()
{
digitalWrite(Dong1,LOW);
digitalWrite(Dong2,LOW);
}

void zuo()
{
digitalWrite(Zhuan1,LOW);
digitalWrite(Zhuan2,HIGH);
}

void you()
{
digitalWrite(Zhuan1,HIGH);
digitalWrite(Zhuan2,LOW);
}

void zheng()
{
digitalWrite(Zhuan1,LOW);
digitalWrite(Zhuan2,LOW);
}
/*****************************************************************************/
/ /
/ 超声波测距模块函数 /
/*****************************************************************************/
long getTime()
{
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);

return pulseIn(Echo,HIGH);
}

void initChaoShengBo()
{
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}
/*****************************************************************************/
/ /
/ 蜂鸣器模块函数 /
/*****************************************************************************/
void initBeep()
{
pinMode(BEEP,OUTPUT);
digitalWrite(BEEP,HIGH);
}

/*****************************************************************************/
/ /
/ 各个模块初始化函数 /
/*****************************************************************************/
void setup()
{
initL9110s();
Serial.begin(115200);
initWifiSta();
server.begin();
initChaoShengBo();
initBeep();
}
/*****************************************************************************/
/ 主循环函数:实现小车方向控制,如果小车距离障碍物的距离小于10厘米 /
/ 再按前进蜂鸣器就会报警,并后退一定的距离 /
/*****************************************************************************/
void loop()
{
char cmd;
int flag = 0;
long dis;

WiFiClient client = server.available(); //服务初始化
while (client.connected())
{
while (client.available() > 0) //等待客户端连接
{
cmd = client.read();//读取数据
Serial.println(cmd);
dis = getTime()/58;
if(dis < 10 )
{
digitalWrite(BEEP,LOW);
hou();
delay(200);
ting();
digitalWrite(BEEP,HIGH);
flag = 1;
}
else
{
flag = 0;
}
if(flag == 0)
{
switch(cmd)
{
case ‘q’: qian(); break; //前进
case ‘h’: hou(); break; //后退
case ‘z’: zuo(); break; //左转
case ‘y’: you(); break; //右转
case ‘s’: ting(); break; //停止
case ‘d’: zheng(); break; //回正
}
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值