arduino WIFI避障小车

Wemos D1 接入wifi(STA模式)

原型
#include <ESP8266WiFi.h>
char* ssid = "gcc-tech";           //“wifi热点名称”,最好不要中文
char* passwd = "18650711783";      //”wifi热点密码”
void initWifiSta()
{
  WiFi.mode(WIFI_STA);         // 设置STA模式
  WiFi.begin(ssid, passwd);   //连接网络
  while (WiFi.status() != WL_CONNECTED) {//一直等待wifi是否连接进去,连接进去后,WiFi.status()和WL_CONNECTED相等
         Serial.print(".");
        delay(500);
   }
  Serial.println(WiFi.localIP());  //通过串口打印wemos的IP地址
  delay(500);
  
}

C/S模式

在这里插入图片描述

架设Wemos为ftp服务器
int port = 8888;  //端口号
WiFiServer server(port); // 设置服务器端口号
void loop() {
	WiFiClient client = server.available();  //服务初始化
	while (client.connected()) {  //等待客户端连接
		while (client.available() > 0) {  //有数据到来,类似串口的那个函数
 	     		cmd = client.read();//读取数据
		}
	}
}
//Tips: 启动服务器的API:       server.begin();

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;
      }
  } 
}


整体项目的电路连接

在这里插入图片描述

Android开发环境搭建

一. 编程软件 Eclipse AD下载,解压。
二. 安卓模拟器(夜神),适合 没安卓手机的同学,下载,双击像普通程序一样安装。

Android导入程序包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目整合以及在安卓模拟器上运行演示

项目整合:实现小车方向控制,如果小车距离障碍物的距离小于10厘米 ,并后退一定的距离 。
Arduino完整编程代码:

#include<ESP8266WiFi.h>
#define Echo D2
#define Trig D8
#define Dong1 D6
#define Dong2 D7
#define Zhuan1 D4
#define Zhuan2 D5

char* ssid = "Tenda_D82600";                           //“wifi热点名称”
char* passwd = "123456789aa";            //”wifi热点密码”
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 dzoutput() {
  pinMode(Dong1, OUTPUT);
  pinMode(Dong2, OUTPUT);
  pinMode(Zhuan1, OUTPUT);
  pinMode(Zhuan2, OUTPUT);
}
void qian() {
  digitalWrite(Dong1, HIGH);
  digitalWrite(Dong2, LOW);
}
void hou() {
  digitalWrite(Dong2, HIGH);
  digitalWrite(Dong1, LOW);
}
void ting() {
  digitalWrite(Dong1, LOW);
  digitalWrite(Dong2, LOW);
}
void zuo() {
  digitalWrite(Zhuan1, HIGH);
  digitalWrite(Zhuan2, LOW);
}
void you() {
  digitalWrite(Zhuan2, HIGH);
  digitalWrite(Zhuan1, LOW);
}
void zheng() {
  digitalWrite(Zhuan1, LOW);
  digitalWrite(Zhuan2, LOW);
}
void setup() {
  dzoutput();
  initChaoShengBo();
  Serial.begin(115200);//打开串口
  initWifiSta();
  server.begin();//启动服务器
}

void loop() {
  char cmd;
  long dis;
  int mark = 0;
  WiFiClient client = server.available();  //服务初始化
  while (client.connected()) {  //等待客户端连接
    while (client.available() > 0) {  //有数据到来,类似串口的那个函数
      cmd = client.read();//读取数据
      //cmd = Serial.read();
      dis = getTime() / 58;
      if (dis < 10) {
        hou();
        delay(500);
        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;
        }
      }
    }
  }
}

java完整编程代码:
ContrlActivity.java:

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;
			}
		});
	}

}

NetUtils.java:

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.106", 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();

	}
}


activity_contrl_xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/test"
    tools:context=".ContrlActivity" >

    <LinearLayout
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="100dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btnqian"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/btn_back"
            android:text="前进"
          
            android:layout_margin="10dp"
            android:textColor="#ffffff" />
        
          <Button
            android:id="@+id/btnhou"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:layout_margin="10dp"
            android:background="@drawable/btn_back"
            android:text="后退"
            
            android:textColor="#ffffff" />
          
         
        
          
    </LinearLayout>
    
    <LinearLayout
      	android:layout_centerVertical="true"
      	android:layout_marginLeft="100dp"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btnzuo"
            android:layout_height="100dp"
            android:layout_width="100dp"
            android:layout_weight="1"
            android:background="@drawable/btn_back"
            android:text="左转"
        
            android:layout_margin="10dp"
            android:textColor="#ffffff" />
    
        
          <Button
            android:id="@+id/btnyou"
            android:layout_height="100dp"
            android:layout_width="100dp"
            android:layout_weight="1"
            android:layout_margin="10dp"
            android:background="@drawable/btn_back"
            android:text="右转"
      
            android:textColor="#ffffff" />
    </LinearLayout>
    

</RelativeLayout>

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino超声波智能⼩车完整代码 // Arduino超声波 智能⼩车(不含舵机) #include <LiquidCrystal.h> //申明1602液晶的函数库 LiquidCrystal lcd(11,2,3,4,7,8); //4数据⼝模式连线声明, //=============================================================== //LCD的接⼝:各个引脚连接的I/O⼝编号,格式为 // LiquidCrystal(rs, enable, d4, d5, d6, d7) // LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) // LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) // LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) //=============================================================== int Echo = A0; // Echo回声脚(P2.0) int Trig =A1; // Trig 触发脚(P2.1) int Distance = 0; int L_motor_back=5; //左电机后退(IN1) int L_motor_go=6; //左电机前进(IN2) int R_motor_go=9; // 右电机前进(IN3) int R_motor_back=10; // 右电机后退(IN4) void setup() { Serial.begin(9600); // 初始化串⼝ //初始化电机驱动IO为输出⽅式 pinMode(L_motor_go,OUTPUT); // PIN 5 (PWM) pinMode(L_motor_back,OUTPUT); // PIN 6 (PWM) pinMode(R_motor_go,OUTPUT);// PIN 9 (PWM) pinMode(R_motor_back,OUTPUT);// PIN 10 (PWM) //初始化超声波引脚 pinMode(Echo, INPUT); // 定义超声波输⼊脚 pinMode(Trig, OUTPUT); // 定义超声波输出脚 lcd.begin(16,2); //初始化1602液晶⼯作 模式 //定义1602液晶显⽰范围为2⾏16列字符 } //=======================智能⼩车的基本动作========================= void run() // 前进 { analogWrite(R_motor_go,200);//右电机前进,PWM⽐例0~255调速,左右轮差异略增减 analogWrite(R_motor_back,0); analogWrite(L_motor_go,200);// 左电机前进,PWM⽐例0~255调速,左右轮差异略增减 analogWrite(L_motor_back,0); } void brake() //刹车,停车 { digitalWrite(R_motor_go,LOW); digitalWrite(R_motor_back,LOW); digitalWrite(L_motor_go,LOW); digitalWrite(L_motor_back,LOW); } void left() //左转(左轮不动,右轮前进) { analogWrite(R_motor_go,200); //右电机前进,PWM⽐例0~255调速 analogWrite(R_motor_back,0); digitalWrite(L_motor_go,LOW); //左轮不动 digitalWrite(L_motor_back,LOW); } void spin_left() //左转(左轮后退,右轮前进) { analogWrite(R_motor_go,200); //右电机前进,PWM⽐例0~255调速 analogWrite(R_motor_back,0); analogWrite(L_motor_go,0); analogWrite(L_motor_back,200);//左轮后退PWM⽐例0~255调速 } void right() //右转(右轮不动,左轮前进) { digitalWrite(R_motor_go,LOW); //右电机不动 digitalWrite(R_motor_back,LOW); analogWrite(L_moto

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值