智能wifi小车源程序

合集下载

无线智能遥控小车--电子设计实验报告

无线智能遥控小车--电子设计实验报告

****************大学班级:****** 作者:******指导老师:****电 子设 计 之无线遥控智能小车1引言1.1编写目的本概要设计说明书是针对电子设计的课程要求而编写。

目的是对该项目进行总体设计,在明确系统需求的基础上划分系统的功能模块,进行系统开发的分工,明确各模块的接口,为进行后面的详细设计和实现做准备。

满足无线遥控爱好者对智能小车的设计要求,想通过这份概要设计给爱好者一个好的设计思路,设计方法进行参考。

本概要设计说明书的预期读者为本项目小组成员以及无线遥控爱好者。

1.2背景a.实践题目的名称:无线遥控智能小车b.项目的任务提出者:***,***,***c.项目的开发者:***,***,***d.面向用户:所有无线遥控爱好者,对智能小车感兴趣,想借此提高动手能力的用户。

鉴于电子设计课程要求,需要一份设计实品,加之小组成员对智能小车有着独特的爱好,所以这次设计选择了遥控智能小车作为电子设计的题目。

2总体设计2.1需求规定●所设计智能小车功能:主要功能:无线遥控,避障;附加功能:超声波测距、速度调节、液晶显示、音乐、流水灯和散热系统。

★通过无线串口对小车进行无线遥控,可以在遥控,避障这两个主要功能之间自由切换。

★遥控时,通过遥控器上的按钮可以方便灵活地控制小车前进,后退,左转和右转等。

★避障时,利用红外传感器探测障碍物,从而达到避障的目的。

●小车安装了超声波传感器,可以进行距离测量,如果距离过近,蜂鸣器发出警报,并将距离等数据实时传到液晶屏上显示。

★通过按钮同时控制一些其他功能,如音乐,风扇和流水灯等。

2.2运行环境最好是室内平地2.3基本设计概念和处理流程整体框图:2.4所需器件★小车模型(三轮,带电机)★ATMAGE16单片机最小系统(3个,小车上两个一个负责接受无线,控制电机,另外一个则是负责其他功能,最后一个遥控器上的)★直流电机驱动模块,采用两个LM298驱动模块分别控制两个电机★传感器模块,采用红外传感器2个,超声波传感器两个★无线串口模块★电源模块(5v,12v)★按键模块,用于无线遥控小车★LCD1602液晶一块★电机一个★蜂鸣器一个★锂电池一块★南孚电池若干节★发光二级管若干★键盘(8个按钮)3接口设计3.1用户接口小车主要有避障和遥控两种模式,通过控制小车上的一个模式选择开关,手动遥控时自动模式无效,同样小车处于自动状态时,手动遥控无效。

手机WiFi智能小车

手机WiFi智能小车
手机WiFi智能小车
目录
项目介绍 硬件设计 软件设计 测试结果
手机WiFi智能小车
现在是一个智能化的时代,各种智能化设 备正在逐步替代人为的操作。随着汽车工 业的迅速发展,关于智能汽车的研究也就 越来越受人关注。而且,智能手机的普及 与发展,更使得WiFi一词深入人心。 在这里我们用最基本的51单片机为核心 来实现WiFi信号对智能系统
L298N电机驱动模块
软件设计
52单片机最小系统原 理图
L2987N驱动原理图
调试结果
系统联调
硬件调试
实现 功能
软件调试
硬件调试
在每个元件在没焊上去时,先用万用表检测,它们是不是都 正常的,像LED灯,有些可能是有损坏的。单片机最小系统 的焊接相对于驱动电路的焊接比较容易,以为在实训中多次 焊接过该电路,但我还是很细心的按电路设计流程,画原理 图、焊接电路、检测电路到通电测试。完成了该最小系统的 设计。该设计过程中,要注意谐振电容的选择,焊接前一定 要对该电容进行检测,确保谐振电容完好,否则将导致晶振 不起振,单片机无法正常工作,振荡器输入分别由引脚18和 引脚19来完成振荡部分。51单片机的一个机器周期含有6个 状态周期,而每个状态周期为2个振荡器周期,因此一个机器 周期共有12个振荡周期,12MHz的振荡频率,一个振荡器周 期为1/12微秒,一个机器周期为1微秒。
软件调试
软件调试是制作该课题一个难点,在 调试采用分模块调试,首先调试光电 避障模块位置以达到最佳效果,其次 开始调试驱动模块,该模块是该课题 的核心。
系统联调
将硬件调试和软件调试相结合,在电路原理 图上先检测电路有没有短接,断路现象,可 以用万用表检测电路中的电流、电压是否符 合。上电后,观察各个电源指示灯是否正常 ,用万用表检测各个主要测试点,看各个测 试点电压是否正常。正常后,将所编写的程 序烧入单片机最小系统中,进行系统联调将 ,看是否能够达到预期效果。

基于Android平台的无线遥控智能小车

基于Android平台的无线遥控智能小车

基于Android平台的无线遥控智能小车朱丹峰;葛主冉;林晓雷【摘要】Design the hardware and software in the Android-based intelligent car with wireless remote control.The system has two kinds of remote control ways:Bluetooth and WiFi.As for the hardware,the system takes STC12C5A60S2 singlechip as the core,others is mainly composed by the Android devices,power supply modules,DC motor drivermodule,tracking module,obstacle avoidance module,light-searching module,WiFi module and camera module.Regarding the software,complete the programming of Android device in the upper computer and singlechip in the lower computer.After comparing the programs and testing the relevant parameters,the results show that the system of the intelligent car is stable and it can achieve the desired goals by perfectly performing functions of wireless remote control,tracking,obstacle avoidance,light-searching,video monitoring and so on.%设计基于Android平台的无线遥控智能小车的软硬件.该系统具有蓝牙和WiFi两种遥控方式.在硬件方面,该系统以STC12C5A60S2单片机为核心,其他主要由Android设备、稳压电源模块、直流电机驱动模块、循迹模块、避障模块、寻光模块、蓝牙模块、WiFi模块及摄像头模块等组成.在软件方面,完成了上位机Android设备程序、下位机单片机程序的编写.经过方案的对比,相关参数的测试,实验结果表明该智能小车系统稳定,能完成无线遥控、循迹、避障、寻光、视频监控等功能,达到预期目标.【期刊名称】《电子器件》【年(卷),期】2013(036)003【总页数】5页(P408-412)【关键词】Android;WiFi;蓝牙;单片机;监控;智能小车【作者】朱丹峰;葛主冉;林晓雷【作者单位】温州医学院生物医学工程系,浙江温州325035;温州医学院生物医学工程系,浙江温州325035;温州医学院生物医学工程系,浙江温州325035【正文语种】中文【中图分类】TP242.6目前,蓝牙和WiFi技术得到了空前广泛的应用,使用蓝牙和WiFi的产品非常多,如手机、电脑、汽车、游戏设备和医疗设备等。

基于51单片机WiFi智能小车制作

基于51单片机WiFi智能小车制作

基于51单片机WiFi智能小车制作基于51单片机WiFi智能小车制作一、基本原理51单片机WiFi智能小车是利用PC或手机作为控制端,通过手机连接wifi模块(路由器)以获得wifi信号,同时车载也连接wifi模块以获得和手机相同的IP地址,实现手机和小车的连接,然后利用PC或手机上的控制软件以wifi网络信号为载体发送相关信号,wifi模块接收PC 或手机端发送来的相关信号并分析转换成TTL 电平信号,然后发送给单片机,单片机接收到的电平信号处理、分析、计算,转化成控制指令并发送给电机驱动模块以实现小车的前进、后退、左拐、右拐等功能。

二、购买所需材料了解51单片机WiFi智能小车基本原理后,需要购买所需材料进行制作。

下面列出所需制作材料:序号材料备注图例6 小车底盘7 摄像头 根据固件支持摄像头购买8 电源根据自己需要购买种类9 杜邦线及小配件制作所需工具:序号工具名备注图例称1 电烙铁一套 包括松香焊锡2 螺丝刀 平口、十字等3 微型电钻 可以自制4手工刀5 剪刀6 万用表7 热熔胶枪或快干胶8US B下载器三、开始制作1、制作流程开始制作前,我们首先需要看购买路由器的型号,笔者采用的是703n 路由器,所以需要引出ttl 线。

总体步骤为:路由器引TTL 线→路由器刷OpenWrt 固件→制作51单片机最小系统→下载下位机程序到51单片机→安装上位机程序至PC 或手机→测试上、下位机通信→组装→调试完成。

2、路由器引ttl线首先打开703n路由器,按照下图标示位置焊接ttl线。

注意:1、焊接的时候要小心焊接,焊好后微拉下查看松紧2、焊接最好采用软线焊接,防止意外整块拉掉焊点3、焊好后一定用胶固定,最好采用热熔胶下图为引好ttl线样子3 刷OpenWrt固件何为OpenWrt固件,OpenWrt可以被描述为一个嵌入式的Linux 发行版,(主流路由器固件有dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的,静态的系统。

智能小车源代码

智能小车源代码

include<>include <>xe”软件上(de)数据设置/define leftdata 0x11define rightdata 0x22define forwarddata 0x33define backdata 0x44define stopdata 0x55define uchar unsigned chardefine uint unsigned intunsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration();/电机端口定义/sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转/无线遥控模块定义/sbit Key_A = P2^0; //B键信号端对应D0sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2sbit Key_D = P2^3; //C键信号端void delay0(int a);void delay15us(void);void delay1ms(int z);void di(); //蜂鸣器函数声明unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离(de)值char flag =0; //量程溢出标志位char f1,f2,f3,f4,n0;int a;int n;//运行次数判断标志int s_left,s_right;void Delay10us(unsigned char i){unsigned char j;do{j = 10;do{_nop_();}while(--j);}while(--i);}///电机程序/ //void loop(){IN1=1; //左电机IN2=0;IN3=1; //右电机IN4=0;}void runfront(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车后退函数void runback(){IN1=0; //左电机 IN2=1;IN3=1; //右电机 IN4=0;}//小车左转void runleft(){IN1=0; //左电机 IN2=0;IN3=0; //右电机 IN4=1;}//小车右转void runright(){IN1=1; //左电机 IN2=0;IN3=0; //右电机 IN4=0;}////小车左后转//void runbackleft() //{// IN1=0; //左电机// IN2=0;// IN3=0; //右电机// IN4=1;//}////小车右后转//void runbackright() //{// IN1=1; //左电机// IN2=0;// IN3=0; //右电机// IN4=0;//}//小车停止函数void stop(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=0;}///蓝牙程序///void delay(unsigned int a){unsigned int b;for(;a>0;a--)for(b=3;b>0;b--);}//左电机转void left_motor_runfront(unsigned int a) {IN1=1; //左电机IN2=0;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_runfront(unsigned int a){IN3=0; //右电机IN4=1;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_back(unsigned int a) {IN1=0; //左电机IN2=1;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_back(unsigned int a) {IN3=1; //右电机IN4=0;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_stop(){IN1=0; //左电机IN2=0;}void right_motor_stop(){IN3=0; //左电机IN4=0;}//PWM调速void PWM_RUNFRONT(unsigned int a,unsigned int b) //a属于0~100{left_motor_runfront(a);right_motor_runfront(b);}void PWM_RUNBACK(unsigned int a,unsigned int b) //a属于0~100{left_motor_back(a);right_motor_back(b);}void PWM_RUNLEFT(unsigned int a) //a属于0~100{right_motor_runfront(a);left_motor_stop();}void PWM_RUNRIGHT(unsigned int a) //a属于0~100{right_motor_stop();left_motor_runfront(a);}void bluestop(){left_motor_stop() ;right_motor_stop() ;}void UsartConfiguration(){SCON=0X50; //设置为工作方式1TMOD=TMOD|0x21; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=0XFA; //计数器初始值设置,注意波特率是4800(de) TL1=0XFA;ES=1; //打开接收中断EA=1; //打开总中断TR1=1;TH0=0;TL0=0;ET0=1; //打开计数器}/函数名 :Delay(unsigned int i)函数功能 : 延时函数输入 : 无输出 : 无void Usart() interrupt 4{receiveData=SBUF;//出去接收到(de)数据RI = 0;//清除接收中断标志位if(receiveData==0x66){low_velosity=1;high_velosity=0;// write_com(0x80);}if(receiveData==0x77){low_velosity=0;high_velosity=1;}}///舵机程序/void delayx(int t){char j;for(;t>0;t--)for(j=19;j>0;j--);}void degree0(){int i;for(i=0;i<10;i++){PWM=1;delayx(10);//1msPWM=0;delayx(390);//19ms }}void degree90(){int i;for(i=0;i<10;i++)PWM=1;delayx(24);//50PWM=0;delayx(376);//}}void degree180(){int i;for(i=0;i<15;i++){PWM=1;delayx(40);//PWM=0;delayx(360);//}}///超声波程序/ ///A键被按下后,前进/void Count1(void){time=TH1256+TL1;TH1=0;TL1=0;S=(time/100;n++;if(S<=30&&n==1){led1=0;stop();degree0();di();}if(S>30&&n==1){led1=1;runfront();n=0;}if(n==2){s_left=S;degree180();di();}if(n==3){s_right=S;degree90();di();n=0; //标志位清零if(s_left>s_right){led2=1;delay1ms(50);led2=0;delay1ms(50);runright();delayx(1250);}else{led3=1;delay(800);led3=0;delay(500);runleft();delayx(1250);}}}/超声波高电平脉冲宽度计算程序/void Timer_Count(void){TR1=1; //开启计数while(RX); //当RX为1计数并等待TR1=0; //关闭计数//Count1(); //计算}//void StartModule() //启动模块{TX=1; //启动一次模块 Delay10us(2);TX=0;}///主程序///void main(void){UsartConfiguration();while(1){if(k1==0&&n0==0){delay1ms(20);if(k1==0){n0++;}}else if(k1==0&&n0==1){delay1ms(20);if(k1==0){n0--;}if(n0==0){if(Key_B==0&&Key_D==0&&Key_C==0&&Key_A==1) //A键被按下{f1=1;f2=0;f3=0;f4=0;di();}else if(Key_A==0&&Key_D==0&&Key_B==1&&Key_C==0) //B键被按下{f1=0;f2=1;f3=0;f4=0;di();}else if(Key_B==0&&Key_D==0&&Key_A==0&&Key_C==1) //C键被按下{f1=0;f2=0;f3=1;f4=0;di();}else if(Key_D==1&&Key_B==0&&Key_A==0&&Key_C==0) //D键被按下{f1=0;f2=0;f3=0;f4=1;di();if(f1){StartModule();for(a=951;a>0;a--){if(RX==1){Timer_Count();Count1();}}}if(f2){runback();}if(f3){loop();}if(f4){stop();}}if(n0==1){if(low_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(30); break;case rightdata: PWM_RUNRIGHT(30); break;case forwarddata: PWM_RUNFRONT(64,70); break;case backdata: PWM_RUNBACK(64,70); break;case stopdata: bluestop(); break;}}if(high_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(50); break;case rightdata: PWM_RUNRIGHT(50); break;case forwarddata: PWM_RUNFRONT(94,100); break;case backdata: PWM_RUNBACK(94,100); break;case stopdata: stop(); break;}}}}}/蜂鸣器/void di(){int i;for(i=0;i<150;i++){Beep= 1;delay0(20);}Beep=0;}void delay0(int a){char j;int i;for(i=a; i > 0; i--)for(j = 200; j > 0; j--); }void delay1ms(int z) //延时1ms {int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。

wifi智能小车实训报告

wifi智能小车实训报告

wifi智能小车实训报告一、实训内容概述为了更好地培养我们计算机科学与技术专业的学生的实际操作能力,我们学校开展了一次为期一个月的Wifi智能小车实训。

该实训旨在通过设计并组装Wifi智能小车来锻炼同学们的动手能力和技术能力,同时也为同学们提供了一个了解物联网相关技术的机会。

二、实训过程详述1、选购器材在实训之前,我们需要先选购实验所需的器材。

其中包括Wifi模块、HC-SR04距离传感器、小车底盘、直流电机、轮子等材料。

我们采购时不仅需要关注价格,同时也需要注意品质和适配程度,以保证实训顺利进行。

2、组装小车底盘我们首先要组装小车底组,这就需要将小车底盘、直流电机和轮子等器材放在一起进行组装。

这一步需要大家仔细阅读说明书,并在老师的指导下逐步进行。

3、添加HC-SR04距离传感器为了使小车具备自主避障能力,我们需要为小车添加 HC-SR04距离传感器。

至于如何添加,就需要我们具备一定的编程开发知识,老师为我们介绍了 Arduino IDE 和 MicroPython 两种编程工具。

4、编写程序代码在添加完传感器之后,接下来就要编写程序了。

代码的编写包含了两个部分,一个是确定小车的移动方向和速度,并通过串口监视器将数据实时传输到电脑端;另外一个部分是实现HC-SR04距离传感器的功能,保证小车能够自主避障。

5、本地测试和远程调试经过以上步骤,我们可以在本地使用电脑的串口通信端口来测试小车的各项功能。

当测试通过后,我们就可以将代码迁移到ESP8266 Wifi 模块中进行远程调试。

这意味着我们可以通过手机等电子设备操作小车,并进行观察调试。

三、实训成效总结通过本次实训,我们不仅学会了组装小车、添加传感器和编写程序代码等技能,还了解了IoT物联网相关知识。

在实验过程中,我们遇到了一些组装困难、调试难度大等问题,经过不断尝试,最终成功解决了问题。

整个过程让我们切实感受到了科技带给我们的便利和乐趣,进一步增强了我们对于计算机技术的热爱。

基于ArduinoMega2560的无线监控小车设计

基于ArduinoMega2560的无线监控小车设计

基于ArduinoMega2560的无线监控小车设计作者:贾瑞来源:《数字技术与应用》2013年第10期摘要:本文简要介绍了一款基于Arduino Mega2560的智能无线控制小车的设计方案。

智能小车主要分为传感器模块,最小系统模块,电机驱动模块,电源模块,无线控制模块,以及摄像头模块等。

本方案以Arduino平台为核心部件,利用光电检测技术,红外避障,配合Arduino的软件算法实现了对小车的无线控制、wifi实时监控等功能。

通过试验证明了该方案可行,智能小车最终完成了设计之初要求的各项任务。

该方案对于Arduino新型集成开发环境的应用具有一定的参考价值。

关键词:智能小车 Arduino中图分类号:TP242 文献标识码:A 文章编号:1007-9416(2013)10-0144-03Arduino是源自意大利的一个开放源代码的硬件项目平台,该平台包括一块具备简单I/O 功能的电路板以及一套类似于Java和C语言的IDE集成开发环境。

Arduino用户通过USB接口直接进行编程和通信,可以用来开发交互产品,比如它可以读取大量的开关盒传感器信号,并且可以控制电灯、电机和其他各式各样的物理设备;Arduino也可以开发出和PC相连的周边装置,能在运行时与PC上的软件进行通讯。

Arduino的硬件电路板可以自行焊接组装,也可以购买已经组装好的模块,而程序开发环境的软件则可以从网上免费下载和使用。

本文提出了一种基于Arduino开发环境的智能无线控制小车设计方案,包括数据采集、人机互动、智能动作在内的智能小车,加载上一台功能完备的wifi监控摄像头,以达到能够在一定距离范围内的无线操作及监控功能。

Arduino无线监控小车-参数:主控板:Arduino Mega 2560直流电机驱动芯片:L9110红外模块信号放大芯片:LM339红外模块检测距离:(白)3~30cm监控摄像头:凯聪SIP1201可视角度:上下120°,左右270°图像视频传输距离:局域网无线受无线路由制约,公网无制约无线控制模块:APC220可控距离:空旷1000米1 智能小车方案设计本设计通过无线控制模块和wifi监控摄像头来实现对整个小车的定位,方案如图1所示。

DIY wifi智能小车.docx

DIY wifi智能小车.docx

DIY wifi智能小车时下非常流行制作WIFI视频小车,所谓的wifi智能小车就是可以通过WIFI网络控制的视频传输可移动甚至可以安装其他机械手各类传感器实现数据互动的小车。

你可以理解为电影、科教片里面的防爆机器人的原型机,或者说是火星勇气号的原型机。

呵呵。

防爆机器人火星探路车“勇气号”下面展示下我们这里所DIY的WIFI智能小车,还行吧,是不是很酷,这不是重点,主要是他组装简单、一般懂得点电脑知识的朋友都可以尝试下,PC操控软件下面我们介绍下他的基本原理:WIFI智能小车包括5个部分:1.微电脑控制板(单片机控制板附带电机驱动)2.Openwrt路由器3.301摄像头4.小车底盘5.12V锂电池组下面我们分别介绍下:1.微电脑控制板(单片机控制板附带电机驱动):就是大家常说的单片机,最好自带电机驱动,这样就非常方便,他可以与openwrt路由器进行串口通信,通过p3.0 p3.1连接。

2.Openwrt路由器:她是WIFI智能小车的核心,或者迅捷3G 171刷成Openwrt路由器。

机,当然不能打电话,但操作系统相当于安卓,一种简化的linux系统。

支持301摄像头,不是所有的摄像头都支持呀。

3.301摄像头:不多说,是一种型号,30元左右。

必须这种型号才行。

4. 小车底盘:这里也不必解释太多,就是一个亚克力板上面固定了4个减速电机和轮子,给电机通电后就可以跑起来。

5. 12V锂电池组:非常重要,是成功的保证,因为wifi智能小车对电力要求较高。

充足稳定的电能是成功的保证。

基本原理图:下面我进行图片展示:路由器刷完openwrt后,连接301摄像头就可以通过电脑进行查看视频了,就相当于一个网络监控器。

摄像头+路由器算起来就120元左右,简直太廉价了。

但离wifi小车还差一步,需要进行串口改装,敲开路由器:这个步骤是真正考验你的时候,电烙铁要用的好,用漆线连接。

小车底盘:电机导线要焊接好,必要需要用热缩管固定,可靠性非常重要。

智能小车程序(完整)

智能小车程序(完整)

智能小车程序---------超长完整版---------#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type) {unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++){P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}。

新手入门之 Wifi Robot无线远程智能遥控小车

新手入门之 Wifi Robot无线远程智能遥控小车

新手入门之Wifi Robot无线远程智能遥控小车您正在看的文章来自爱果联盟,原文地址:/read.php?tid=222 一:什么是Wifi Robot无线远程智能遥控小车?Wifi Robot无线远程智能遥控小车就是利用非常成熟的WIFI无线网络为数据载体,实现控制数据,音视频双向数据交换而达到控制小车和视频监控等等功能。

二:Wifi Robot无线远程智能遥控小车有什么功能?Wifi Robot无线远程智能遥控小车是集无线通讯、实时四驱、多向机械云台、视频监控、电器红外遥控、环境温度检测、为一体的多功能智能遥控车。

使用使用ATMEGA16L单片机作为数据处理中心,将电脑、手机端的控制数据经过路由器/btplug转换转换成串口数据,ATMEGA16L再将路由器发送来的串口数据进行分配来控制4个车轮的工作状态模式和三个陀机的工作角度A TMEGA16L还负责实时监控环境温度并经过路由器/btplug反馈至电脑,让使用者可以实时了解小车所在地的气温便于在到达目的地之前设定好空调温度等应用。

三:Wifi Robot无线远程智能遥控小车用在什么地方?怎么玩?Wifi Robot无线远程智能遥控小车可以放在公司作为产品演示的高级智能助手,帮你递送文件,帮你拿听百威,帮你拿盒万宝路,又或者向你的客户打声招呼。

Wifi Robot无线远程智能遥控小车可以放在家里当做一贴切保姆,你可以在公司用电脑监控家里的的一切动态,可以在车上就设定好家里空调温度,可以定时电视机在什么时候换什么台,这一切你只需要连接到ITELNET。

Wifi Robot无线远程智能遥控小车也是广场上的明星,你带着他在城市广场上炫耀,玩耍,让它拿个小礼物送心仪的MM,让他帮你丢垃圾,这一切都不是问题。

四:Wifi Robot无线远程智能遥控小车从哪里买得到?Wifi Robot无线远程智能遥控小车不会以成品方式出售,Wifi Robot无线远程智能遥控小车其实是我们全国各地广大爱好者组织开发的一款DIY车,我们只提供了驱动板部分路由器和车架这些都是大家团购再回来组装的,所有每个人DIY出来的车车可能都不一样,可谓风情万种。

智能循迹小车详细源代码程序MSPID

智能循迹小车详细源代码程序MSPID

巡线车程序(完整版)1 #ifndef _Macro.h_2 #define _Macro.h_3 #include <msp430x14x.h>4 #include <intrinsics.h>5 #define uchar unsigned char6 #define uint unsigned int7 #define one 11.118 #define LMAX 19999 #define RMAX 399910 #define CPU_F ((double)8000000)11 #define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))1213 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))14 #define PC 20 // 比例放大系数15 #define IC 0 //积分放大系数16 #define DC 85 //大系数17 #define LEFTOUT TACCR118 #define RIGHTOUT TACCR219 #define SensorIn P5IN20 #define F 5000//5000hz21 #define Period (8000000/F)22 #define EnableLeftPos P3OUT|=BIT123 #define UnenableLeftPos P3OUT&=~BIT12425 #define EnableLeftNeg P3OUT|=BIT026 #define UnenableLeftNeg P3OUT&=~BIT02728 #define EnableRightPos P3OUT|=BIT229 #define UnenableRightPos P3OUT&=~BIT23031 #define EnableRightNeg P3OUT|=BIT332 #define UnenableRightNeg P3OUT&=~BIT33334 #define Basic_Left 100//百分之八十35 #define Basic_Right 100//Basic_Left36 #define MAX (100)37 #define MIN (-100)38 #define foreward 139 #define backward 040 #define max_speed 10041 #define min_speed -10042 #define key 0434445 #define left_1 146 #define left_2 247 #define left_3 348 #define left_4 449 #define left_5 550 #define left_6 651 #define left_7 7//右直角5253 #define right_1 -154 #define right_2 -255 #define right_3 -356 #define right_4 -457 #define right_5 -558 #define right_6 -659 #define right_7 -7//左直角60 #endif[cpp]view plaincopy61 #include "Macro.h"62 #include "sensor.h"63 void Motorstop()64 {65 LEFTOUT=0;66 RIGHTOUT=0;67 }68 void MotorLeft(int speed,int direction)69 {70 if(speed>max_speed)speed=max_speed;71 if(direction==backward)//反转72 {73 EnableLeftNeg;74 UnenableLeftPos;75 }76 else if(direction==foreward)//正转77 {78 EnableLeftPos;79 UnenableLeftNeg;80 }81 LEFTOUT=Period/100*speed;82 }83 void MotorRight(int speed,int direction)84 {85 if(speed>max_speed)speed=max_speed;8687 if(direction==backward)//反转88 {89 EnableRightNeg;90 UnenableRightPos;91 }92 else if(direction==foreward)//正转93 {94 EnableRightPos;95 UnenableRightNeg;96 }97 RIGHTOUT=Period/100*speed;98 }99 void MotorDrive(int PIDout)100 {101 int speedleft,speedright;102 speedleft=Basic_Left PIDout;103 speedright=Basic_Right-PIDout;104105 if(speedleft<0)106 MotorLeft(speedleft,backward);//反转107 else MotorLeft(speedleft,foreward);//正转108109 if(speedright<0)110 MotorRight(speedright,backward);//反转111 else MotorRight(speedright,foreward);//正转112 }113 void Rangle(float angle)114 {115 // TBCTL|=TBCLR;116 TBCCR1=LMAX (unsigned int)(angle*one);117 }[cpp]view plaincopy118 //下面是小车的程序。

基于Arduino开源平台的WIFI视频监控小车

基于Arduino开源平台的WIFI视频监控小车

基于Arduino开源平台的WIFI视频监控小车市面上美国 WowWee公司推出路威(ROVIO)机器人,一个可以通过WiFi无线局域网络控制的八方移动的机器人摄像机,支持使用者利用内部网络或者通过INTERNET来进行远程遥控。

通过网络,使用台式电脑、笔记本、智能手机(PDA,SMARTPHONE),PSP和WiLi遥控手柄进行控制,具有实时控制监控、声像传递、根据设定路线(path)巡航,拍照,自动EMAIL。

在这里我们可以通过价廉的路由器搭建WIFI视频监控小车。

加起来成本一千多元就可以搞定一台可以自己编程玩的机器人。

下面是材料清单:材料清单序号材料名称单价1 A4WD小车2052 ROMEO控制板3003 5节2300MAH电池654 12V电池包1305 充电器906 上海贝尔RG-100A路由器557 中星微301摄像头208 两自由度DF15MG云台259合计:11241. A4WD是一个铝合金结构的四轮驱动小车,每个轮子都有一个电机作为驱动,马力强劲。

首先根据小车附带的安装说明书装配小车车体,如图就是装好的效果。

在底盘里面装了5节2300MAH的镍氢充电电池。

2. 接下来安装ROMEO扩展板,ROMEO扩展板是一个基于Arduino开源平台的扩展板。

因为全球DIY爱好者都在使用,所以提供了丰富的例子程序。

基本上想实现的功能都能够找到参考代码。

Arduino封装了底层枯燥的寄存器操作,使程序开发都是基于应用的函数调用。

输入输出口的定义也是非常直观。

程序操作某个口,就对应硬件的某个接口。

3. 安装两自由度DF15MG云台及其摄像头,DF15MG云台可以上下左右180度旋转。

301摄像头是一个裸板没有外壳,所以体积非常小,用一个红外开关的支架就可以装上去,还需要用热熔胶固定。

这里我把摄像头的USB线减掉了很长,消除了很大的牵绊。

4.最复杂也是最重要的设备来了,就是一个无线路由器。

路由器需要支持OpenWrt。

基于单片机的WiFi智能小车设计

基于单片机的WiFi智能小车设计

基于单片机的WiFi智能小车设计作者/胡城瑜,成都理工大学信息科学与技术学院文章摘要:单片机就是一种电路集成芯片,主要是采用线路集成技术将电路数据处理后,连接到硅片上构成一个类似于微型计算机的系统。

单片机在工业生产控制中应用比较广泛。

在信息技术智能化发展的今天,单片机WiFi智能小车系统应运而生。

文章据此,主要分析单片机的WiFi智能小车系统的作用和特点。

关键词:单片机;WiFi;智能小车;系统引言智能设备正逐渐代替人工设备,单片机的WiFi智能小车设计主要组成部分有小车车体、电机驱动和电源、舵机、摄像头等。

单片机中的WiFi智能小车设计主要是为了通过终端智能设备发送、控制指令,实现小车的视频数据采集。

1.单片机WiFi智能小车系统内容■1.1总体构造信息科技水平的提高,促进了人们对人工智能系统的研究和应用,智能小车的应用范围较广,在单片机WiFi智能小车系统设计中,主要是将单片机作为控制芯片,科学获取障碍物距离小车的距离,这个数据是由超声波来控制距离测定的。

基本路况和小车行驶情况都可以根据信息反馈来获取。

单片机的WiFi智能小车系统总体构造由主控模块、驱动模块和避障模块构成。

主控模块主要根据小车的行驶情况和路障情况进行方向和路线的判断、选择,控制其电机信号的输入输出。

驱动模块主要是为了对小车的速停、速动进行调制。

避障模块也包括循迹模块的内容,这也是单片机智能小车系统设计的核心内容,主要是利用红外线和超声波等进行信息探测、收集。

单片机WiFi智能小车西系统构造总体上可以分为软件部分和硬件部分,硬件部分的核心是控制器,软件核心则是程序编码、设计。

[1]■1.2软件设计单片机WiFi智能小车系统中的软件设计构成有主程序、中断子程序、电机驱动子程序和调速子程序等,主要功能就是信号的监测、采集、分析和控制。

电机的路障躲避、左右转动和前后进退等都需要软件控制速度和方向。

单片机的系统设计、调制中需要利用计算机网络程序完成编程、初始化等工作。

4、WIFI智能小车视频教程 主控制板功能讲解介绍

4、WIFI智能小车视频教程 主控制板功能讲解介绍

HJ-4WD核心板教程基于慧净4WD智能小车讲解HJ-4WD主控板总体功能•1、集成USB烧写下载程序功能。

•2、集成4路直流电机驱动模块。

•3、集成4路红外传感器模块。

•4、集成4位共阳数码管。

•5、集成蓝牙功能接口。

•6、集成WIFI功能接口。

•7、单片机学习常用功能都有集成。

•8、注意:个别模块功能需要另购,标准发货不配套电源供电接线•板子可由7.2-9V直流电源供电,其中单片机部份5V供电,由板子集成的5V稳压模块取得。

•为什么要用充电电池?•普通1.5V电池内阻小,不能充电,使用时间短,电机在启动时工作电流大,使电池电压不稳定,很容易烧毁单片机芯片,使用成本高,因此慧净推荐你使用3.7V的锂离子充电电池2节为智能小车供电。

7.2V-9V电池座接线说明电压检测模块接线位置•电压表可以直接接到下面的位置上,红色线接 +号,黑色线接到-号位置上。

用电烙铁焊接,(模块为另购)。

T1T2T3T4电机输出接线•T1接左电机,T2接右电机,小车车轮转向方向由T1中的1脚,2脚换位置来决定,比如电机开始接成反转了,只要把T1中的 1、2脚线互换一下就可以正转。

直流电机正反转原理•电机中有一个线圈,当有直流电输入时电流会向一个方向转动(正转),当外部更换电源正负极时,电机内部电流方向改变,转子方向也跟着改变,由原来的正转变反转。

四路传感器接线•P1 接右边避障传感器(向前,安装在小车上方)•P2接右边寻迹传感器 (向下,安装在小车底部)•P3 接左边寻迹传感器(向下,安装在小车底部)•P4接左边避障传感器(向前,安装在小车上方)•其中,接收头中的VCC OUT GND 对应核心板上的P1\P2\P3\P4 中的VCC OUT GND,用杜邦线对应接好,不得接反,接错,否则烧坏传感器模块。

四路传感器调试方法•调节核心板上的W1 W2 W3 W4 电位器可以控制P1 P2 P3 P4 各路传感器的距离位置。

2代WiFi遥控智能小车使用说明书

2代WiFi遥控智能小车使用说明书
1) 下载并安装手机 APP DoitcarV2.apk; 2) 查找并连接 ESP8266 开发板的 WiFi 信号 Doit_ESP_####; 3) 打开 APP,点击本地模式,即可控制小车。
2.3.2 本地模式(本地局域网)
这种本地模式有三个点 ESP8266 开发板+当地 WiFi 路由中转+手 机组成一个小局域网。也就是说 ESP8266 开发板通过 WiFi 路由器中 转后连接到手机中进行通信的。
2.2 微信控制小车
在 2.1 节中 ESP8266 开发板在页面参数配置成功的前提下,扫描 下述二维码并可关注四博智联的微信公众号。
图 8 四博智联微信二维码
然后在微信上会显示“您好,设备绑定成功”,然后点击手机微 信的右下角“我的设备”,
图 9 微信绑定
6
深圳四博智联科技有限公司 Shenzhen Doctors of Intelligence & Technology (DOIT)
图 5 电脑 WiFi 信号
3
深圳四博智联科技有限公司 Shenzhen Doctors of Intelligence & Technology (DOIT)
http://www.doit.am https:/// Tel: 186 7666 2425, QQ:123433772
深圳四博智联科技有限公司 Shenzhen Doctors of Intelligence & Technology (DOIT)
http://www.doit.am https:/// Tel: 186 7666 2425, QQ:123433772
深圳四博智联科技有限公司
图 11 微信控制小车界面

智能小车代码

智能小车代码

智能小车代码一、主程序#include<reg51.h>#include <INTRINS.H>#include "pwm.h"#include "delay.h"#include "tracking.h"#define uchar unsigned char#define uint unsigned intsbit front=P3^3; /*前边红外避障*/sbit right1=P3^4; /*右前红外避障*/sbit right2=P3^5; /*右后红外避障*/sbit left1=P3^6; /*左前红外避障*/sbit left2=P3^7; /*左后红外避障*/sbit shine0=P1^0; /*前趋光*/sbit shine1=P1^1; /*左趋光*/sbit shine2=P1^2; /*右趋光*/sbit beef=P1^3;sbit led=P2^4; /*声光报警led灯*/uchar flag=0;void main(void){ uchar k;int i;beef=1;pwm_init();/*******从A到B******************************/ while(right1==0 || right2==0 ){if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}/******转弯进入Ⅰ区***************/go(20,-20); //左转delay(4);TR0=0;stop();delay(1000);TR0=1;go(20,15);delay(180);while(front==1) //检测到白板前直走{go(17,15);}TR0=0;stop();delay(200);TR0=1;go(20,-20); //检测到白板就左转delay(4);TR0=0;stop();delay(1000);TR0=1;while(left1==0 || left2==0) //靠左边白板直走{if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}while(right1==0 || right2==0){if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}while(front==1){go(15,12);}TR0=0;stop();delay(1000);/*****左转进入Ⅱ区**************/TR0=1;go(-20,20);delay(4);TR0=0;stop();delay(1000);TR0=1;tracking_stop(); //打开循迹,当3个红外同检测到黑线时TR0=0;stop();k=100; //停留5 秒,并发出断续声光报警。

用ESP8266+android,制作自己的WIFI小车(Android软件)

用ESP8266+android,制作自己的WIFI小车(Android软件)

⽤ESP8266+android,制作⾃⼰的WIFI⼩车(Android软件)先说⼀下这篇⽂章⾥⾯的内容:TCP 客户端, ⾃定义对话框, ⾃定义按钮, ProgressBar竖直显⽰, 重⼒感应传感器,⼿机返回键新开启界⾯的问题(返回上次的界⾯),数据保存软件的通信是配合软件的第⼀个界⾯就⼀个按钮点击按钮弹出⼀个⾃定义的对话框连接的时候连接上其实⼀开始想多加⼀些功能,,不过后来想了想复杂了反⽽不利于学习.........我会从⼀开始做到结束都写清楚,如果有⼤神看到哪地⽅不合理请指教哈,,,,,好现在开始做APP⼀路Next就⾏...您会发现⾃⼰的按钮是圆边的其实是⾃⼰⾃定义了⼀些参数新建⼀个⽂件夹存储咱们⾃定义的⼀些东西对了为什么名字是drawable其实是官⽅提供的,,然后呢各个参数后⾯都有具体解释有些⼩伙伴⼀看....英⽂的............⼤哥下⼀个有道翻译或者别的翻译软件翻译⼀下...................可以⾃⼰搜索⾃⼰想要的好像这些外形啦背景什么的都在授⼈予鱼,也要授⼈予渔;⾸先定义⼀下外形⽅形然后呢描⼀下边框,,,显得是⼀个按钮其实可以官⽅解释然后定义⼀下按钮现在显⽰的颜⾊好现在让它的四个⾓变成圆⾓,,,对于我这个学机械的⽽⾔在solidworks⾥⾯应该叫做倒⾓,,,,有没有学机械的看到这篇⽂章哈...记得曾经遇到⼀个⼈和我正好相反,,我是报的机械专业,⾃学的电⽓,,,,,,⽽另⼀个⼈是报的电⽓却喜欢机械........兴趣.........好啦拖⼀个按钮过来,放到中⼼.....您也可以在布局⽂件⾥⾯⾃⼰写哈......我是怎样⽅便怎样弄,,我⽤的是相对布局保存⼀下现在看效果好现在再定义⼀个按钮按下时的外表⽂件private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};package com.wificardemo;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.Button;public class MainActivity extends Activity {Button buttonconnect1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件}private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}现在编译⼀下运⾏到⼿机看⼀下我是直接⽤的⾃⼰的⼿机,,没有仿真,,现在我的电脑⽤仿真可是不得了......平时的状态按下后⾃⼰看着改改⼤⼩和显⽰咱们现在要做的是其实这个是⾃⼰⾃定义的⼀个界⾯对了设置⼀下主题风格...感觉这种风格挺好的图⽚可以在我源码⾥⾯找,也可以⾃⼰弄⾃⼰的对了,,,,位置还有名字什么的⾃⼰看着修改哈整体界⾯呢,,,<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:background="@android:color/white"android:id="@+id/textView22"android:layout_width="wrap_content"android:layout_height="2dip"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_below="@+id/imageView21"android:layout_marginTop="15dp" /><TextViewandroid:id="@+id/textView21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"android:layout_marginLeft="19dp"android:layout_toRightOf="@+id/imageView21"android:text="连接"android:textAppearance="?android:attr/textAppearanceLarge"android:textColor="@android:color/white" /><TextViewandroid:id="@+id/textView23"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_below="@+id/textView22"android:layout_marginTop="23dp"android:text="IP地址:" /><EditTextandroid:id="@+id/editText21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/textView23"android:layout_alignBottom="@+id/textView23"android:layout_alignLeft="@+id/textView21"android:ems="10"android:text="192.168.4.1" /><ImageViewandroid:id="@+id/imageView21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="14dp"android:src="@drawable/image1" /><TextViewandroid:id="@+id/textView24"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/editText22"android:layout_alignBottom="@+id/editText22"android:layout_alignParentLeft="true"android:text="端⼝号:" /><EditTextandroid:id="@+id/editText22"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/editText21"android:layout_below="@+id/editText21"android:layout_marginTop="10dp"android:ems="10"android:text="8080" /><Buttonandroid:id="@+id/button21"android:layout_width="80dp"android:layout_height="40dp"android:layout_alignParentRight="true"android:layout_below="@+id/editText22"android:layout_marginRight="10dp"android:background="@drawable/butonup"android:text="连接" /><Buttonandroid:id="@+id/Button22"android:layout_width="80dp"android:layout_height="40dp"android:layout_alignBottom="@+id/button21"android:layout_alignTop="@+id/button21"android:layout_marginLeft="10dp"android:background="@drawable/butonup"android:text="取消" /><ProgressBarandroid:id="@+id/progressBar21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@+id/textView23"android:layout_centerHorizontal="true" /></RelativeLayout>好了现在点击主界⾯的按钮把这个界⾯当做提⽰框显⽰出来package com.wificardemo;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮 cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条 progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"}/**** 主界⾯连接服务器按钮*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在呢就缺少显⽰了...我们在主按钮的点击事件中调⽤显⽰函数package com.wificardemo;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮 cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条 progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"}/**** 主按钮点击事件*/private OnClickListener buttonconnect1Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubAlertDialog21.show();}};/**** 主界⾯连接服务器按钮背景改变*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在安装到⼿机上看⼀下---界⾯还可以做这个简单的取消事件连接按钮呢!!我先说⼀下思路,,,按下连接按钮是启动⼀个连接任务,然后呢还要启动⼀个倒计时器(3S),,,控制这个连接任务执⾏的时间,还要显⽰进度条,,如果3S内连接上了,,那么在连接的后⾯关掉进度条,结束这个连接任务,取消定时器,关闭对话框,然后进⼊控制界⾯,,如果3S 内没有连接上,也关闭连接任务,关掉进度条,同时显⽰连接失败.现在的package com.wificardemo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .InetAddress;import .Socket;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.os.CountDownTimer;import android.renderscript.Mesh.Primitive;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"String Ipstring="";//记录IP地址int portint=0;//记录端⼝号boolean ConnectFlage=true;int ShowPointSum=0;//显⽰点的数量,连接中.....(后⾯的点)Socket socket = null;//定义socketInetAddress ipAddress;OutputStream outputStream=null;//定义输出流InputStream inputStream=null;//定义输⼊流@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"cancelbutton22.setOnClickListener(cancelbutton22Click);//对话框取消事件connectbutton21.setOnClickListener(connectbutton21Click);//对话框连接按钮点击事件 }/**** 对话框连接按钮点击事件*/private OnClickListener connectbutton21Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIpstring = iPEditText.getText().toString().replace("", "");portint = Integer.valueOf(portEditText.getText().toString().replace("", ""));progressBar21.setVisibility(0);//显⽰进度条tcpClientCountDownTimer.cancel();tcpClientCountDownTimer.start();ConnectFlage = true;ShowPointSum = 0;ConnectSeverThread connectSeverThread = new ConnectSeverThread();connectSeverThread.start();}};/***** @author 连接服务器任务**/class ConnectSeverThread extends Thread{public void run(){while(ConnectFlage){try{ipAddress = InetAddress.getByName(Ipstring);socket = new Socket(ipAddress, portint);ConnectFlage = false;tcpClientCountDownTimer.cancel();runOnUiThread(new Runnable(){public void run(){progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭提⽰框}});inputStream = socket.getInputStream();//获取输⼊流}catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}/**** 对话框取消按钮事件*/private OnClickListener cancelbutton22Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubConnectFlage = false;//取消连接任务tcpClientCountDownTimer.cancel();//结束定时器progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭对话框}};/**** 延时3s的定时器*/private CountDownTimer tcpClientCountDownTimer = new CountDownTimer(3000,200) { @Overridepublic void onTick(long millisUntilFinished) {//每隔200ms进⼊if (ConnectFlage){ ShowPointSum ++;switch (ShowPointSum%9){ case0:titleEditText.setText("连接中");break;case1:titleEditText.setText("连接中.");break;case2:titleEditText.setText("连接中..");break;case3:titleEditText.setText("连接中...");break;case4:titleEditText.setText("连接中....");break;case5:titleEditText.setText("连接中.....");break;case6:titleEditText.setText("连接中......");break;case7:titleEditText.setText("连接中.......");break;case8:titleEditText.setText("连接中........");break;default:break;}}}@Overridepublic void onFinish() {//3s后进⼊(没有取消定时器的情况下)if (ConnectFlage){ ConnectFlage = false;progressBar21.setVisibility(-1);//关闭滚动条titleEditText.setText("连接服务器失败!!");}tcpClientCountDownTimer.cancel();}};/**** 主按钮点击事件*/private OnClickListener buttonconnect1Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtitleEditText.setText("连接");AlertDialog21.show();}};/**** 主界⾯连接服务器按钮背景改变*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在加上权限然后连接WIFI模块测试⼀下哈<uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><uses-permission android:name="android.permission.VIBRATE" />连接模块的⽆线然后会发现对话框消失了因为咱们⾃⼰设置的消失现在让它连接后打开控制界⾯还是先把IP和端⼝号的信息做成能够保存的吧咱们就⽤SharedPreferences可以看⼀下这篇⽂章的介绍得到SharedPreferences对象然后那么⼀开始运⾏就要检测是不是记录了,,如果记录了就取出来记录的数据然后显⽰在对应的⽂本框中整体的代码package com.wificardemo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .InetAddress;import .Socket;import android.app.Activity;import android.app.AlertDialog;import android.content.SharedPreferences;import android.os.Bundle;import android.os.CountDownTimer;import android.preference.PreferenceManager;import android.renderscript.Mesh.Primitive;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"String Ipstring="";//记录IP地址int portint=0;//记录端⼝号boolean ConnectFlage=true;int ShowPointSum=0;//显⽰点的数量,连接中.....(后⾯的点)Socket socket = null;//定义socketInetAddress ipAddress;OutputStream outputStream=null;//定义输出流InputStream inputStream=null;//定义输⼊流private SharedPreferences sharedPreferences;//存储数据private SharedPreferences.Editor editor;//存储数据@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"cancelbutton22.setOnClickListener(cancelbutton22Click);//对话框取消事件connectbutton21.setOnClickListener(connectbutton21Click);//对话框连接按钮点击事件sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);boolean issave = sharedPreferences.getBoolean("save", false);//得到save⽂件存的值,得不到会返回false if (issave){String Ipstring = sharedPreferences.getString("Ipstring", "192.168.4.1");//取出ip,不存在返回192.168.4.1 String portint = sharedPreferences.getString("portint", "8080");//取出端⼝号,不存在返回8080iPEditText.setText(Ipstring);portEditText.setText(portint);}}/**** 对话框连接按钮点击事件*/private OnClickListener connectbutton21Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIpstring = iPEditText.getText().toString().replace("", "");portint = Integer.valueOf(portEditText.getText().toString().replace("", ""));progressBar21.setVisibility(0);//显⽰进度条tcpClientCountDownTimer.cancel();tcpClientCountDownTimer.start();ConnectFlage = true;ShowPointSum = 0;ConnectSeverThread connectSeverThread = new ConnectSeverThread();connectSeverThread.start();editor = sharedPreferences.edit();editor.putString("Ipstring", Ipstring);//记录ipeditor.putString("portint", portEditText.getText().toString());//记录端⼝号editor.putBoolean("save", true);//写⼊记录标志mit();}};/***** @author 连接服务器任务**/class ConnectSeverThread extends Thread{public void run(){while(ConnectFlage){try{ipAddress = InetAddress.getByName(Ipstring);socket = new Socket(ipAddress, portint);ConnectFlage = false;tcpClientCountDownTimer.cancel();runOnUiThread(new Runnable(){public void run(){progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭提⽰框}});inputStream = socket.getInputStream();//获取输⼊流}catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}/**** 对话框取消按钮事件*/private OnClickListener cancelbutton22Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubConnectFlage = false;//取消连接任务tcpClientCountDownTimer.cancel();//结束定时器progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭对话框}};/**** 延时3s的定时器*/private CountDownTimer tcpClientCountDownTimer = new CountDownTimer(3000,200) { @Overridepublic void onTick(long millisUntilFinished) {//每隔200ms进⼊if (ConnectFlage){ ShowPointSum ++;switch (ShowPointSum%9){ case0:titleEditText.setText("连接中");break;case1:titleEditText.setText("连接中.");break;case2:titleEditText.setText("连接中..");break;case3:titleEditText.setText("连接中...");break;case4:titleEditText.setText("连接中....");break;case5:titleEditText.setText("连接中.....");break;case6:titleEditText.setText("连接中......");break;case7:titleEditText.setText("连接中.......");break;case8:titleEditText.setText("连接中........");break;default:break;}}}@Overridepublic void onFinish() {//3s后进⼊(没有取消定时器的情况下)if (ConnectFlage){ ConnectFlage = false;progressBar21.setVisibility(-1);//关闭滚动条titleEditText.setText("连接服务器失败!!");}tcpClientCountDownTimer.cancel();}};/**** 主按钮点击事件*/private OnClickListener buttonconnect1Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtitleEditText.setText("连接");AlertDialog21.show();}};/**** 主界⾯连接服务器按钮背景改变*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() { @Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown); }if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在做控制界⾯<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:background="@android:color/background_dark"android:id="@+id/textView31"android:layout_width="wrap_content"android:layout_height="2dp"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_centerVertical="true" /><ImageButtonandroid:background="@android:color/transparent"android:layout_marginBottom="20dp"android:id="@+id/imageButton31"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/textView31"android:layout_alignParentLeft="true"android:layout_marginLeft="35dp"android:src="@drawable/qianjin" /><ImageButtonandroid:background="@android:color/transparent"android:layout_marginTop="20dp"android:id="@+id/imageButton32"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/imageButton31"android:layout_below="@+id/textView31"android:src="@drawable/houtui" /><ImageButtonandroid:background="@android:color/transparent"android:id="@+id/imageButton33"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="10dp"android:src="@drawable/youzhuan" /><ImageButtonandroid:background="@android:color/transparent"android:id="@+id/imageButton34"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginRight="30dp"android:layout_toLeftOf="@+id/imageButton33"android:src="@drawable/zuozhuan" /><CheckBoxandroid:id="@+id/checkBox31"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="开重感" /></RelativeLayout>这个ProgressBar默认是,,⽔平的要改成竖直的其实就是⾃⼰写⼀个外观和变化的⽂件,然后调⽤,,,,,就像咱们⾃定义按钮样式⼀样然后呢在⾥⾯加上<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android" >。

基于donkeycar无人驾驶巡逻智能小车的设计

基于donkeycar无人驾驶巡逻智能小车的设计

基于 donkeycar无人驾驶巡逻智能小车的设计摘要:donkeycar无人驾驶巡逻智能小车是集无人驾驶、微信报警、远程监控、避障、北斗定位多功能一体的巡逻智能车,其终极目标是为校园、企业等封闭环境下的安防市场需求提供更经济、智能化的解决方案,通过AI机器学习技术,实现无终端控制和手机端的自主识别报警。

由于donkeycar的无人驾驶巡逻智能小车是在以树莓派wifi控制小车技术为核心的技术扩展,本文旨在通过基于树莓派4B主板的wifi小车的硬件设计、程序设计及基本工作原理,制造出拥有自主学习功能的巡逻智能小车,并对实物进行测试,使其达到稳定、可控的状态。

关键词:树莓派,自动驾驶,微信报警,智能车一、无人驾驶巡逻智能车研究背景在自动驾驶全面实现之前,智能辅助驾驶已经商用,且将进一步普及。

目前以ADAS(先进驾驶辅助系统)为代表的高新技术装备在车辆上的渗透率正在大幅提升,有望在2021年迎来爆发。

德国等汽车工业发达国家ADAS已经普及,中国渗透率较低,因此存在巨大市场空间。

ADAS应用了传感器、图像识别等人工智能技术,给了人类眼观八方的能力、提醒人类不要犯类似于疲劳驾驶的错。

事实上部分ADAS已实现Ll级别的自动驾驶,例如特斯拉的AutoPi10t已实现级别的自动驾驶,人工智能辅助人类驾驶已经成为现实。

随着现代信息技术的快速发展和智能时代的推进,树莓派这种微型且多功能系统在科学研究领域被广泛应用。

该项目利用树莓派进行远程控制智能小车,基于人脸识别和智能安防系统,将自动驾驶与邮箱报警进行充分融合。

同时,ADAS (先进驾驶辅助系统)应用传感器和图像识别等人工智能技术,在汽车驾驶方面,给人类最安全的保障。

基于大数据的发展,ADAS在未来小车应用领域会更有发展,智能家居、货物搬运、医疗物资运输等方面,智能车将会带动这些行业快速发展,未来无人驾驶有可能代替人工驾驶,提高效率,促进产业的优化和升级。

二、小车总体设计传统树莓派3B的wifi小车基于wifi网络,以树莓派作为下位机,以虚拟机作为上位机,采用单向通信的方式,在远程控制,双向数据传输,扩展性以及AI赋能,图像识别方面有所欠缺。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

由于今年组委会光电管和摄像头分开比赛。

所以传感器部分我们选择了光电管,比赛以小车的速度记成绩,为了让小车更快更稳得跑完全程,传感器的探测距离必须要远,既要有大的前瞻,普通的红外对管由于功率较小,探测距离增大时,干扰严重,所以我们自制了大功率对管,同时采用了程序控制脉冲发光的办法,有效的降低了发热,提高了系统的稳定性。

系统采用采用了7.2V 2000mAh Ni-Cd蓄电池作为系统能源,并且通过稳压电路分出6伏,5伏已分别给舵机和单片机供电。

直流电机驱动模块接收速度控制信号控制驱动电机运行,达到控制车速目的。

转向伺服模块控制舵机转向,进而控制智能车转弯。

速度测量模块实时测量智能车车速,用于系统的车速闭环控制,以精确控制车速。

系统充分使用了MC9S12DG128单片机的外围模块,具体使用到的模块包括:ADC模拟数字转换模块、定时器模块、PWM脉冲宽度调制模块、中断模块、I/O 端口和实时时钟模块等。

系统调试过程中,使用了组委会提供的代码调试环境CodeWarrior IDE,同时使用了清华的软件进行了仿真试验。

图1.1 系统结构框图3.1舵机部分为了使转弯更加灵活,对舵机相关部分作了部分改动。

首先,我们将舵机力臂加长85mm。

这样,对于同样的转弯角度值,只需更小的舵机转角,减小了舵机转弯时惯性带来的弊端。

其次,我们将舵机反装,使舵机连杆水平,因为此时舵机提供的力全部用在转弯上。

3.2前轮部分为了增加前轮转弯时的稳定性,对前轮相关部分进行了部分改动。

首先,更改前后垫片的数量,使前轮主销后倾,这样,车轮具有更好的自动回正功能。

其次,更改连杆的长度,使车轮外倾,车轮转弯时,前半部分重心上移,促使赛车转弯更加稳定。

再次,我们通过更改舵机连杆的长度,增加前轮前束,同样增加了前轮的稳定性。

3.3底盘部分为了提高赛车运行时的稳定性,对地盘相关部分作了部分改动。

首先,前轮相关位置加垫片,降低了前轮重心。

其次,更改后轮车轴处的调节块,使后轮重心升高,这样,车身前倾,一定程度上,增加了车的稳定性。

3.4后轮部分首先,更换后轮轮距调节块,使后轮两轮之间间距加大。

这样,车在转弯时不容易产生侧滑。

其次,调节后轮差速,使赛车转弯更加灵活。

4.1电源部分为了能使智能车系统能正常工作,就需要对电池电压调节。

其中,单片机系统、车速传感器电路需要5V 电压,路径识别的光电传感器和接收器电路电压工作为5V 、伺服电机工作电压范围4.8V 到6V(或直接由电池提供),直流电机可以使用7.2V 2000mAh Ni-cd 蓄电池直接供电。

考虑到由于驱动电机引起的电压瞬间下降的现象,因此采用低压降的三端稳压器成为必然。

我们在采用lm7805,和lm7806作为稳牙芯片。

经试验电压纹波小,完全可以满足要求。

电池(7.2v ) 2000mAh Ni-cd稳压电路电机图4.1系统电压调节图5V对管单片机舵机测速板6V7.2V图4.2 7805电路图图4.3 电源模块示意图4.2电机驱动电路电机驱动使用飞思卡尔专用电机驱动芯片MC33886。

驱动电路如图4.4 所示。

为了增大驱动能力,减少单片发热量,电路采用两片MC33886 并联的方案。

系统使用PWM 控制电机转速,充分利用单片机的PWM 模块资源。

电机PWM 频率设定为8KHz。

MC33886芯片的工作电压为5-40V,导通电阻为140毫欧姆,PWM频率小于10KHz ,具有短路保护、欠压保护、过温保护等功能。

电机驱动芯片安装在制作的电机驱动PCB 板上,在PCB 板设计时,考虑到芯片散热问题,在芯片腹部设计了方型的通孔,实际运行效果表明芯片散热均匀,设计合理。

为了防止电动机突然停止时产生的电磁干扰,在电动机的两端焊接了一个0.1μF 滤波电容。

AGND 1FS2IN13V+4V+5OUT16OUT17DNC 8PGND 9PGND 10PGND 11PGND 12D213OUT214OUT215V+16Ccp 17D118IN219DNC 20U3MC33886AGND 1FS2IN13V+4V+5OUT16OUT17DNC 8PGND 9PGND 10PGND 11PGND 12D213OUT214OUT215V+16Ccp 17D118IN219DNC 20U5MC338861.3KR4Res21.3KR7Res247pFC12Cap 47pFC14Cap VCCPWM5PWM312P14Header 2DS2LED21KR5Res2231S2SW-SPDT+7.2V1KR10Res21KR15Res2图4.4 两片MC33886并联使用图4.5 两片MC33886并联使用的实物图在图中可以看到,我们使用PWM23和PWM45作为电机驱动PWM 信号,两个PWM 通道级联可以使其输出更加精确。

在程序中,我们把PWM 值直接转换成了以米/秒为单位的绝对速度,这样使智能车的速度更加直观切易于调试。

4.3测速电路由于考虑到成本需要,我们采用了红外对管和黑白码盘作为测速模块的硬件构成。

其中码盘为32格的黑白相间圆盘,如下图所示:图4.5 码盘红外传感器安装在正对码盘的前方,虽然这样做精度比编码器要低很多,但是成本低廉制作容易,如果智能车速度较快,可以考虑再减少码盘上黑白色条的数量即可。

当圆盘随着齿轮转动时,光电管接收到的反射光强弱交替变化,由此可以得到一系列高低电脉冲。

设置9S12 的ECT 模块,同时捕捉光电管输出的电脉冲的上升沿和下降沿。

通过累计一定时间内的脉冲数,或者记录相邻脉冲的间隔时间,可以得到和速度等价的参数值。

测速电路使用自行研制的红外反射式光电测速传感器。

速度测量电路使用红外反射式光电对管RPR220,自行制作的编码盘,比较电路等组成。

速度测量电路图2.8所示。

红外反射式光电对管的光敏三极管信号通过比较器处理后输入单片机的计数器模块,利用单片机的输入捕捉功能,处理智能车速度信息。

自制的编码盘有24道黑色条纹,电机旋转一周将产生24次输入捕捉中断。

单片机记录两次中断的时间间隔T。

两次中断对应于智能车前进的距离S为:16.5/24 cm,300VCC33K32184ALM35810K5.1KVCCVCC5.1KIOC0 RPR220图4.6测速电路即0.6875cm ,其中16.5cm 为智能车后轮实测周长[7]。

智能车实时速度V(cm/s)的计算公式如下:s cm TT T S V /6875.024/5.16===4.4红外对管检测电路由于我们采用了大功率对管,所以红外对管的电路是整个电路中要求最高的,不紧要保证对管正常工作,而且还要考虑整个电路的能耗和发热问题。

经测试我们发现单个对管在通以100mA 到170mA 电流时可以。

保证抬高20到30厘米的距离。

此时每个对管的管压降为1.2到1.5伏。

为了进一步加大发光量,我们采用了双发射管的办法,即一个接受管对应两个发射管。

为了降低整体的能耗。

我们让同一对的发射管串联,14对发射管再并联。

同时使用了irf540进行开关控制。

控制对管脉冲发光。

开关频率为200HZ 。

这样既保证了大前瞻探测的需要,又降低了整体的能耗和对电源的冲击图4.7 先串联再并联的脉冲发光对管电路图。

图4.8对管实物图反面图4.9 对管实物图正面4.5拨码开关电路由于在智能车比赛开始后,不能够对智能车硬件及软件进行修改,在保证了硬件有效可靠的同时,软件有可能不能够适应新场地,所以设计拨码开关对智能车有关参数进行设置也是必要的。

拨码开关电路如下图所示:12345678161514131211109S1SW-DIP8123456789R1Header 9VCC SW0SW1SW2SW3SW4SW5SW6SW7图4.9 拨码开关这是一个八段的拨码开关,我们把它成成上下连个部分,显然,每个部分都有16种状态,前四个来改变舵机参数,后四个改变直流电机参数,这样对于适应新的场地很有好处。

5.1路径搜索算法对于本控制系统采用14对光电对管的方案,单排排列在车体头部10cm处。

编号为6、7的光电对管处于正中央位置。

利用14对传感器进行道路识别。

传感器对白色的反射率比黑色的大。

单片机ADC读入值相应也大。

在程序中对传感器信号进行处理,判断传感器是否检测到黑色引导线。

将单个传感器对白色和黑色路面的ADC值之差分为平均的两段,每次处理实时传感器信号时,判断本次采样的ADC值与黑色路面ADC值之差落在两段中的哪一段。

如果在靠近黑色的一段,则判定该传感器检测到黑线,将该传感器对应的变量置为判定值1;如果在靠近白色的一段,则判定该传感器检测到白线,将该传感器对应的变量置为判定值1;为了增强判断的准确性,在对ADC值采样时,采用了中值滤波方法,以去除瞬间的干扰。

路径检测完后,将测的的路径值暂时存储,然后将路径信息传递给舵机和电机控制部分,以选择给定合适的转角和速度。

5.2舵机、电机的控制智能车的舵机和电机都采用了经典的PID控制方法。

但是由于舵机和电机性能的不同要求,分别对其进行了不同的修改。

PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。

其输入e (t)与输出u (t)的关系为式中积分的上下限分别是0和t因此它的传递函数为:G(s)=U(s)/E(s)=kp(1+1/(TI*s)+TD*s)其中kp为比例系数;TI为积分时间常数;TD为微分时间常数比例KP用来控制当前,误差值和一个负常数P(表示比例)相乘,然后和预定的值相加。

P只是在控制器的输出和系统的误差成比例的时候成立,KP能够快速的跟随变化量。

及时的产生与之相关的调节作用。

但是KP是有差调节,无法消除静态误差。

积分KI来控制过去,误差值是过去一段时间的误差和,然后乘以一个负常数I,然后和预定值相加。

I从过去的平均误差值来找到系统的输出结果和预定值的平均误差。

一个简单的比例系统会振荡,会在预定值的附近来回变化,因为系统无法消除多余的纠正。

通过加上一个负的平均误差比例值,平均的系统误差值就会总是减少。

所以,最终这个PID回路系统会在预定值定下来。

微分KD 来控制将来, 计算误差的一阶导,并和一个负常数D相乘,最后和预定值相加。

这个导数的控制会对系统的改变作出反应。

导数的结果越大,那么控制系统就对输出结果作出更快速的反应。

这个D参数也是PID被成为可预测的控制器的原因。

D参数对减少控制器短期的改变很有帮助。

一些实际中的速度缓慢的系统可以不需要D参数。

舵机PID由于舵机是一个具有大的延迟的执行机构,所以在PID控制中不能加入积分环节。

否则会导致小车震荡。

所以小车采用PD控制。

同时加入一个一阶惯性环节,构成不完全微分,给小车一个超前的调节。

实际使用中,为了减少计算时间,将位置式PID转化为增量式增量式PID公式:电机PID控制小车行使过程中,随着跑道的不同,需要配合不同的速度值,因此对电机的PID是一个给定值不断变化的PID。

相关文档
最新文档