基于能力风暴机器人的无线通信.docx

上传人:b****6 文档编号:5805946 上传时间:2023-01-01 格式:DOCX 页数:31 大小:1.59MB
下载 相关 举报
基于能力风暴机器人的无线通信.docx_第1页
第1页 / 共31页
基于能力风暴机器人的无线通信.docx_第2页
第2页 / 共31页
基于能力风暴机器人的无线通信.docx_第3页
第3页 / 共31页
基于能力风暴机器人的无线通信.docx_第4页
第4页 / 共31页
基于能力风暴机器人的无线通信.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于能力风暴机器人的无线通信.docx

《基于能力风暴机器人的无线通信.docx》由会员分享,可在线阅读,更多相关《基于能力风暴机器人的无线通信.docx(31页珍藏版)》请在冰豆网上搜索。

基于能力风暴机器人的无线通信.docx

基于能力风暴机器人的无线通信

 

一、概述---------------------------------1

二、正文---------------------------------3

2.1设计的目标和实现的主要功能--------------3

2.1硬件电路设计及描述----------------------4

2.3软件流程图及描述------------------------11

2.4源程序代码------------------------------18

2.5调试结果-------------------------------29

三、课程设计总结

3.1设计中主要问题及最终解决方法-------------30

3.2个人总结---------------------------------32

四、参考文献及资料----------------------35

 

一概述

 

本课题基于广茂达公司生产的能力风暴机器人及其配件。

配件包括小型无线摄像机及无线视频接收器,无线通信模块(两套),灭火配件(只用电风扇及其固定支架)。

通信方式采用串口通信,利用两个微功率无线通讯模块收发指令,一个连接在PC上发射命令,另一个接在能力风暴机器人上,接收PC发来的指令。

机器人根据接收的指令执行各种运动,可以实时控制机器人的运动速度,旋转角度,并能控制电风扇的开关实现灭火功能。

由于没有视频采集卡,加上时间有限,以及本人能力有限等原因,视频模块的功能没有实现(也是本次设计比较遗憾的地方),其余功能都可以实现。

并且可以做到实时接收命令,进而实现了对机器人的实时控制。

 

二正文

 

2.1设计的目标和实现的主要功能

主要功能:

实时采集现场图像信息,通过PC实时控制机器人运行轨迹,可以控制其运动速度,旋转角度以及灭火风扇的开关等功能,可通也可让机器人在场地进行自主漫游(避障运动,录像),

实现示意图:

辅助器件及工具:

1.能力风暴智能机器人;

2.小型无线摄像机及无线视频接收器;

3.无线通讯模块2套;

4.灭火配件一套(电风扇及风扇支架);

5.电焊,接线,万用表及其他工具

2.2设计的描述及硬件电路设计

设计过程:

1.上位机程序的编写

2.上位机程序调试(用串口调试精灵调试)

3.编写单片机收发测试程序

4.上位机与单片机通信调试

5.编写单片机主程序(风扇控制模块先不添加)

6.调试主程序

7.电风扇安装及调试

8.无线通信模块安装及调试

硬件及电路:

1.灭火装置:

灭火风扇电机叶片直流电机

灭火风扇的安装如图,再固定在机器人底盘上

直流电机的引线接法

从上面的电路图可以看出,单片机P3.2引脚(OUT6)接了一个驱动芯片MC2803可提供较大的电流能驱动直流电机。

可将直流电机的两个引脚分别接在DO6的1、3引脚,当P3.2输出高电平时启动电动机,此时发光二极管LD3点亮,输出低电平时关闭电动机,发光二极管熄灭。

应注意,单片机复位后P2.3引脚为高电平。

2.无线通信模块的安装:

由于无线通信模块调试和查找错误都比较麻烦,所以这一步一般要放在最后调试。

也就是确保PC和单片机之间通过串口线可以实现准确的通信。

无线通信模块实物图

排线上A/TX和B/RX可接RS232等,RXD和TXD为TTL电平

的接口。

单片机与无线通信模块的焊接实物图

上面两根线是无线通信模块的电源线和地线,我把两根线分别接在了DO6的2和1引脚,DO6口前面的图上有。

由上面这张电路图可以看出JP1的2,3引脚分别接在了串口电平转换MAX232AESE芯片上,所以可以将无线通信模块的A/TX引线接在USB口的3引脚,B/RX引线接USB的2引脚,焊接时注意,需要实际的测试USB的2,3引脚与单片机引脚的链接方式,以防出错。

上位机与无线通信模块的连接

连接时只需将RS232与3对应的引线接在无线通信模块的B/RX端,与2对应的引线接A/TX端。

另外,要为无线通信模块提供3.6—5V的电源。

在调试无线通信模块时关于ABC跳线的选择一定要先断掉电源,不然,跳线不会起作用,因为,无线通信模块的单片机只在接通电源初始化时去读取ABC的值。

最后,我把单片机的外接12MHZ晶振换成了11.0592MHZ才最终实现了无线通信,换晶振时要注意,一定要非常小心,不然可能会弄坏主板。

最终实物图

 

 

2.3软件流程及描述

上位机程序(VB编写):

PC控制界面效果图(VB编写)

可实现模块及各模块功能

1.运行模式模块

机器人两种工作方式,一种是自动运行,此时可以自行进行壁障运动,并拍摄录像(这里只是设想);第二种方式为远程控制,接到此命令后机器人即停止自动运行模式,准备接受命令。

2.运动控制模块

该模块包括前进,停止,后退,左转和右转功能。

点击前进按钮,上位机给机器人发送前进指令同时发送前进时的转速,后退时同理。

转弯按钮后的列表框的内容为“”“10”“20”“50”“90”,第一个表示让机器人一直转,直到接到新的指令,其余4项分别代表旋转的角度。

该列表框只能选择不能输入。

3.现场参数模块

该模块为前进和后退提供转速,列表框提供了30到100不等的转速,与转弯列表框不同的是该列表框可以通过键盘直接输入数值。

4.灭火控制模块

该模块两个功能按钮,分别命令机器人开启灭火风扇和关闭灭火风扇。

5.视频设置模块

没有视频采集卡,而且感觉难度应该挺大。

时间有限不做要求。

6.通信设置模块

此处只做标示示用,因为单片机的程序要提前写入,修改其波特率虽然可以实现,但是用途不是很大,此处只是为了让界面更美观一些。

 

主要控件的属性

控件类型

名称

属性

Form

Form

默认

 

CommandButton

Goahead

Caption=前进

Stop

Caption=停止

Goback

Caption=后退

Turnleft

Caption=左转弯

Turnright

Caption=右转弯

Openfan

Caption=灭火

Stopfan

Caption=停止

Quit

Caption=退出

TextBox

Text1

用于显示发送的命令

MSComm

MSComm1

默认

Timer

Timer1

定时时间500ms

Timer2

定时时间10ms

OptionButton

Automove

Caption=自动运行

Controlmove

Caption=远程控制

ListBox

Leftangle

Caption=角度

Rightangle

Caption=角度

ComboBox

Combogoahead

Caption=前进转速

Combogoback

Caption=后退转速

通信规则:

上位机发送一个字符"S"表示通信开始,这时单片机准备接受命令,500ms后上位机发送命令内容,发送一个”E”表示本次通信结束。

控制命令有两种格式,一种为只有一个字符的命令,另一种是一个字符+运行参数(参数以字符格式发送)

各字符含义如下表

字符

O

T

A

C

G

P

B

L

R

Q

命令

开风扇

关风扇

自动运行

远程控制

前进

停止

后退

左转弯

又转弯

待机命令

注:

当上位机程序关闭时,程序退出前自动给机器人发送一个字符“Q”(该命令不是以“S”开头,“E”结尾),接到此字符,机器人将停止一切活动,进入待命状态。

以后还可以发送其他指令使机器人运行。

 

单片机程序

程序流程图

 

2.4源程序代码

上位机源程序代码(VB):

Constcon_openfanAsString="O"'开风扇命令字符O

Constcon_stopfanAsString="T"'关风扇命令字符T

Constcon_automoveAsString="A"'自动运行命令字符A

Constcon_controlmoveAsString="C"'控制运动命令字符C

Constcon_goaheadAsString="G"'前进命令字符G

Constcon_stopAsString="P"'停止命令字符P

Constcon_gobackAsString="B"'后退命令字符B

Constcon_turnleftAsString="L"'左转命令字符L

Constcon_turnrightAsString="R"'右转命令字符R

Constcon_startAsString="S"'开始接受命令的标志

Constcon_endAsString="E"'命令发送完毕的标志

Constcon_quitAsString="Q"s'上位机程序关闭,命令机器人停止一切活动

PrivatecommandsAsString'要发送的命令及参数

PrivateSubForm_Load()

MSComm1.Settings="9600,n,8,1"'设置数据传输率和发送字符格式

MSComm1.CommPort=1'设置通讯串口

MSComm1.OutBufferSize=512'设置发送缓冲区512Byte

MSComm1.OutBufferCount=0

EndSub

PrivateSubSendMessage()'定义发送子过程

IfNotMSComm1.PortOpenThen'如果没有开串口则打开串口

MSComm1.PortOpen=True

EndIf

MSComm1.Output=con_start'发送开始命令标志

Timer1.Enabled=True'打开定时器

EndSub

PrivateSubAutomove_Click()'自动运行

commands=con_automove'需要发送的命令送commands

CallSendMessage'发送命令

Text1.Text=con_start&commands&con_end'显示发送字符串的内容

EndSub

PrivateSubControlmove_Click()'人工控制运行

commands=con_controlmove

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubOpenfan_Click()'开风扇命令

commands=con_openfan

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubStopfan_Click()'关闭风扇命令

commands=con_stopfan

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubGoahead_Click()'前进命令

commands=con_goahead&Combogoahead.Text

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubStop_Click()'停止命令

commands=con_stop

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubGoback_Click()'后退命令

commands=con_goback&Combogoback.Text

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubTurnleft_Click()'左转命令

commands=con_turnleft&Leftangle.Text

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubTurnright_Click()'右转命令

commands=con_turnright&Rightangle.Text

CallSendMessage

Text1.Text=con_start&commands&con_end

EndSub

PrivateSubTimer1_Timer()

MSComm1.Output=commands&con_end'发送命令以及命令结束标志

Timer1=False

EndSub

PrivateSubQuit_Click()'发送待机命令,并在timer2里推出程序

IfNotMSComm1.PortOpenThen'如果没有开串口则打开串口

MSComm1.PortOpen=True

EndIf

MSComm1.Output=con_quit'发送上位机程序关闭命令

Timer2.Enabled=True

EndSub

PrivateSubTimer2_Timer()

UnloadMe

EndSub

单片机源程序:

#include"M51Robot.H"//头文件定义,请勿删除

#include"reg51.h"

#include

#include

typedefunsignedcharBYTE;

typedefunsignedshortWORD;

sbitOUT6=P3^2;//电扇控制0关闭,1启动

conststart_receive='S';//开始接受命令标示符

constopen_fan='O';//开启风扇命令

conststop_fan='T';//关闭风扇命令

constcontrol_move='C';//远程控制命令

constauto_move='A';//自动控制命令

constgo_ahead='G';//前进命令

constgo_back='B';//后退命令

conststop_move='P';//停止命令

constturn_left='L';//左转命令

constturn_right='R';//右转命令

constend_receive='E';//命令结束标示符

constwait_orders='Q';//停止一切动作等待命令,待机

BYTEReceive();//接受一个字符,接到字符才返回

BYTEBumper();//返回碰撞方向

voidAutoMove();//避障运动

voidControlFan(intx);//电扇控制,x=0关闭,x=1开启

voidGoAhead(intx);//前进

voidStop();//停止

voidGoBack(intx);//后退

voidTurnLeft(intx);//左转,x为转角

voidTurnRight(intx);//右转,x为转角

voidWaitOrders();//上位机程序退出时,停止一切正在进行的动作,待机可以接受命令

voidSerial_Set(WORDiBaud);//设置串口波特率(0,9600,0,8,1)

BYTEtemp;//全局变量接受命令

externcharxdataShowBuf[33];//在扩展数据中声明一个数组,用来显示

voidmain()

{

BYTEorders[8];//存储命令字符

unsignedintcount;//字符计数器

unsignedintorderdata;//控制运动参数

unsignedinti;

unsignedintab;

InitRobot();

Serial_Set(9600);//设置波特率为9600晶振频率11.0592MHZ

OUT6=0;//初始化后电扇是开启的,所以首先要关闭电风扇

sprintf(ShowBuf,"HelloPaul!

Let'sGo!

");

PutString(ShowBuf);

while

(1)

{

temp=Receive();

if(temp==wait_orders)

{

WaitOrders();

continue;

}

if(temp==start_receive)

{

//初始化参数

count=-1;

orderdata=0;

ab=1;

while

(1)//接收要执行的命令

{

temp=Receive();//接收到才返回

if(temp==end_receive)break;

count++;

orders[count]=temp;

}

//计算运动参数第一个字符为命令符,将字符参数转换为整型参数

for(i=count;i>0;i--)

{

orderdata=orderdata+(orders[i]-'0')*ab;

ab=10*ab;

}

//sprintf(ShowBuf,"%d",count);//程序调试时用

sprintf(ShowBuf,"%d",orderdata);//程序调试时用

PutString(ShowBuf);

if(orders[0]==open_fan)

{

ControlFan

(1);

}

if(orders[0]==stop_fan)

{

ControlFan(0);

}

if(orders[0]==go_ahead)

{

GoAhead(orderdata);

}

if(orders[0]==go_back)

{

GoBack(orderdata);

}

if(orders[0]==stop_move)

{

Stop();

}

if(orders[0]==turn_left)

{

TurnLeft(orderdata);

}

if(orders[0]==turn_right)

{

TurnRight(orderdata);

}

if(orders[0]==auto_move)

{

AutoMove();

}

if(orders[0]==control_move)

{

Stop();

}

}

}

}

//以下为子函数

//串口工作方式及波特率设置,晶振更换为11.0592MHZ后

voidSerial_Set(WORDiBaud)

{

xdataBYTEbaud;

if(iBaud==9600){baud=0xFA;}//计算过

if(iBaud==19200){baud=0xDC;}//未算

if(iBaud==38400){baud=0xFE;}//未算

if(iBaud==4800){baud=0x70;}//未算

if(iBaud==2400){baud=0xE6;}//未算

if(iBaud==1200){baud=0xCC;}//未算

if(iBaud==600){baud=0x98;}//未算

if(iBaud==300){baud=0x30;}//未算

//初始化串行口和波特率发生器

SCON=0x50;//串口工作方式1,允许接受

PCON=PCON|0x80;//波特率加倍

TMOD=0x20;//定时器T1工作方式2自动重装

TH1=baud;//定时常数

TL1=baud;//定时常数

TR1=1;//启动定时器

TI=0;//发送标志位复位

RI=0;//接受标志位复位

}

//接受命令,接到一个字符才返回

BYTEReceive()

{

xdataBYTEcdata;

while(!

RI);//查询

RI=0;

cdata=SBUF;

returncdata;

}

//返回碰撞方向,左前,右前,前方三个方向参数由试验得出

BYTEBumper()

{

xdataunsignedintbmpr;

bmpr=AI(8);

if(bmpr>=110&&bmpr<=140)return1;//leftfront

if(bmpr>=240&&bmpr<=260)return2;//rightfront

if(bmpr>=370)return3;//front

return0;

}

//电扇控制

voidControlFan(intx)

{

if(x==0)//关闭

{

OUT6=0;

}

if(x==1)//开启

{

OUT6=1;

}

}

//前进

voidGoAhead(intx)

{

Stop();

SetMoto(0,x);

SetMoto(1,x);

}

//后退

voidGoBack(intx)

{

Stop();

SetMoto(0,-x);

SetMoto(1,-x);

}

//后退

voidStop()

{

SetMoto(0,0);

SetMoto(1,0);

}

//左转,对于不同的旋转角度由于电机性能的影响,延时时间不成比例

voidTurnLeft(intx)

{

Stop();

SetMoto(0,-40);

SetMoto(1,40);

if(x==0)return;//如果是0则一直转

elseif(x<=10)

{

wait(0.8);

}

elseif(x<=20)

{

wait(1.3);

}

elseif(x<=50)

{

wait(2.5);

}

elseif(x<=90)

{

wait(4.4);

}

Stop();

}

/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1