基于Wemos的wifi控制避障小车
项目面试问题
C/C++/嵌入式—面试题汇总
1.项目描述:
利用wemos D1实现小车的前后行走、转弯和避障。
2.开发及硬件组成:
Arduino、wemos D1、小车、步进电机驱动、超声波测距模块。
3.项目描述:
wemos D1通过wifi与手机App连接,手机App控制小车的运动,当前方出现障碍物时超声波测距模块会把数据返回给wemos D1,若距离小于规定值则会驱动小车后退。
4.小车展示:
手机App:
TCP助手:
5.视频演示:
避障遥控小车
6.代码展示:
小车代码:
#include<ESP8266WiFi.h>
#define Dong1 D6
#define Dong2 D7
#define Zhuan1 D4
#define Zhuan2 D5
#define Echo D2
#define Trig D8
char* ssid = "Meng";
char* passwd = "meng123456";
int port = 8888; //端口号
WiFiServer server(port); //设置服务器端口号
long getTime() //超声波传播时间
{
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
return pulseIn(Echo, HIGH);
}
void initChaoShengBo() //超声波初始化
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
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 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 you() //右转
{
digitalWrite(Zhuan1, LOW);
digitalWrite(Zhuan2, HIGH);
}
void zuo() //左转
{
digitalWrite(Zhuan1, HIGH);
digitalWrite(Zhuan2, LOW);
}
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()
{
char cmd;
int mark = 0;
long dis;
WiFiClient client = server.available(); //服务初始化
while (client.connected())
{
while (client.available() > 0)
{
cmd = client.read();
Serial.println(cmd);
dis = getTime() / 58;
Serial.println(dis);
if (dis < 15)
{
hou();
delay(100);
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 'd':
zheng();
break;
}
}
}
}
}
手机App:
package com.gec.bluetoothcarlink;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
public class ContrlActivity extends Activity {
Button qian;
Button hou;
Button zuo;
Button you;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_contrl);
initView();
}
void initView() {
qian = (Button) findViewById(R.id.btnqian);
hou = (Button) findViewById(R.id.btnhou);
zuo = (Button) findViewById(R.id.btnzuo);
you = (Button) findViewById(R.id.btnyou);
qian.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
new NetUtils("q").sendMessage();
break;
case MotionEvent.ACTION_UP: {
new NetUtils("s").sendMessage();
break;
}
}
return false;
}
});
hou.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
new NetUtils("h").sendMessage();
break;
case MotionEvent.ACTION_UP: {
new NetUtils("s").sendMessage();
break;
}
}
return false;
}
});
zuo.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
new NetUtils("z").sendMessage();
break;
case MotionEvent.ACTION_UP: {
new NetUtils("d").sendMessage();
break;
}
}
return false;
}
});
you.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
new NetUtils("y").sendMessage();
break;
case MotionEvent.ACTION_UP: {
new NetUtils("d").sendMessage();
break;
}
}
return false;
}
});
}
}
package com.gec.bluetoothcarlink;
import java.io.OutputStream;
import java.net.Socket;
import android.os.Handler;
public class NetUtils {
public String message;
public String reTurnMes;
public Handler handler;
public NetUtils(String message) {
this.message = message;
}
public NetUtils(String message, Handler handler) {
this.message = message;
this.handler = handler;
}
public void sendMessage() {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Socket client = new Socket("192.168.1.108", 8888);
//Socket client = new Socket(StartActivity.IP, Integer.parseInt(StartActivity.Port));
OutputStream out = client.getOutputStream();
out.write(message.getBytes());
out.close();
client.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}