基于能力风暴机器人的无线通信.docx
- 文档编号:5805946
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:31
- 大小:1.59MB
基于能力风暴机器人的无线通信.docx
《基于能力风暴机器人的无线通信.docx》由会员分享,可在线阅读,更多相关《基于能力风暴机器人的无线通信.docx(31页珍藏版)》请在冰豆网上搜索。
基于能力风暴机器人的无线通信
一、概述---------------------------------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();
}
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 能力 风暴 机器人 无线通信