|
【S093】手机蓝牙控制高射炮装甲车
作品说明 |
作者:崔云飞 许美珍 李文良
单位:内蒙古工业大学
指导老师:武建新
1. 高射炮装甲车设计结构
1.1 高射炮装甲车的结构组成
手机蓝牙控制高射炮装甲车机器人是由主控板、传感器、圆周舵机、标准舵机、电池、支撑架及车轮等组成。
作品说明
装配图1
(高射炮装甲车模型主要亮点:炮筒内的发射杆机构采用凸轮四杆机构)
装配图2
(高射炮装甲车正前方模型图:主要展示该结构炮身的自由度)
实物组装图
1.2 高射炮装甲车设计器材
高射炮装甲车机器人的设计采用履带模块,使用双轮后轮驱动,驱动电机选用两个圆周舵机。选用两块5×7孔平板作为车身底盘,在两平板之间选用两块10mm滑轨连接,这样设计主要是为了使前后两轮之间的履带能拉紧连接。在车身上方是炮台寻标发炮装置、控制装置和监测传感器装置,炮身装置主要采用3个标准舵机、3个固定架以及若干连杆构成;控制装置是由一块控制板、一块电池、一个蓝牙传感器、一个Andriod系统手机;监测装置有声控传感器一个,红外传感器一个,两个触须传感器。
主控板
声控传感器
蓝牙模块
红外避障传感器
触须传感器
圆周舵机
2. 高射炮装甲车设计方案及功能讲解
2.1 蓝牙控制技术
(1)蓝牙控制优点
① 控制范围与遥控器相比,其控制更加方便。
② 蓝牙为新型技术,使用方位较广,而且其控制精度高,各个电机速度由编程控制,各个动作及其运动逻辑简单,适合各种不同功能高精度的动作。
③ 编程简单,每个动作由手机蓝牙助手设置,每个动作的程序互不干涉,编程比较其他的方法更加的简单。
(2)蓝牙控制缺点
① 蓝牙控制与其他的编程相比,其编程过程更难入门,理解运行程序更加困难。
② 蓝牙助手只能适用于andriod系统,手机使用范围较窄。
2.2高射炮装甲车功能介绍
首先通过蓝牙设计六个动作,前进、快进、右转、左转、后退、停止六个动作。前进以标准的、高精度的直线运动,并且在运行过程中,炮台(在67度-170度范围内)不断扫描目标,同时无论什么时候只要有声音信号,声控传感器就会控制炮筒发射子弹,当遇到障碍物时,炮头的红外传感器就接受信号,然后通过手机控制该装置避障。在后退过程中,两电机进行直线后退;在左右转的过程中,以较快速度旋转避障;在快进的工程中,以两倍的前进速度前进;当右侧遇到障碍物,右侧的触须传感器接受触摸信号,开始慢速的左转进行避障;当左侧的触须传感器接收信号后,开始慢慢的右转进行避障;当前方有障碍物时,小车由手机控制后退进行避障。
3. 控制程序
3.1 控制程序流程图
3.2 控制程序
① main.c
#include "config.h" #include "lib_io.h" #include "lib_arm.h" #include "lib_act.h" #include "lib_io_uart_lpc2138.h"
int main(void) { int i=0; Initial_ARM(); UART0_Init(); while(1) {
} return 0; } |
/******************** (C) COPYRIGHT 2012 Robottime ******************** * 文件名 : lib_act.c * 作者 : * 版本 : * 日期 : * 所属产品 : * 功能 : * 舵机接口 : 输出接口1( Servo(1) ): 输出接口2( Servo(2) ): 输出接口3( Servo(3) ): 输出接口4( Servo(4) ): 输出接口5( Servo(5) ): 输出接口6( Servo(6) ): ********************************************************************/
#include "config.h" #include "lib_io.h" #include "lib_arm.h"
/******************************************************************************* * 程序名 : Act_Select * 功能 : 集成并预设动作库文件里的所有动作函数,形成一个个实际的动作,方便调用动作 * 入口参数 : 预设动作序号 * 返回值 : 无 *******************************************************************************/ Act_Select(uint8 i) { switch (i) { case 0x01 : Act_Forward(); break; //动作1 case 0x02 : Act_Backward(); break; //动作2 case 0x03 : Act_TurnLeft(); break; //动作3 case 0x04 : Act_TurnRight(); break; //动作4 case 0x05 : Act_FForward(); break; //动作5 case 0x06 : Act_Stop(); break; //动作6 } }
/******************************************************************************* * 程序名 : Act_Forward * 功能 : 前进 * 入口参数 : 无 * 返回值 : 无 *******************************************************************************/ Act_Forward() { int j,k,m; Servo(1,80); Servo(2,95);
for (j=110;j>=65;j--) { Servo(4,j); Delay(150);
LedIn(2,2);
LedIn(1,2);
} Servo(4,65);
while (1) { for (k=65;k<173;k++) { Servo(3,k); Delay(25); if (Input(4,1)==1)/***检测到声音后声控传感器接受后,转盘开始旋转***/ { for (m=0;m<68;m++) { Servo(5,68-m); Delay(10); } Delay(200); for (m=0;m<68;m++) { Servo(5,m); Delay(2); } LedIn(1,1); LedIn(2,1); LedIn(3,1); LedIn(4,1); } if (Input(3,1)==1) goto loop; //***break;***// } Delay(150); for (k=173;k>65;k--) { Servo(3,k); Delay(30); if (Input(4,1)==1)/***检测到声音后声控传感器接受后,转盘开始旋转***/ { for (m=0;m<68;m++) { Servo(5,68-m); Delay(10); } Delay(200); for (m=0;m<68;m++) { Servo(5,m); Delay(2); } LedIn(1,1); LedIn(2,1); LedIn(3,1); LedIn(4,1); } if (Input(3,1)==1) goto loop; //***break;***// } Delay(100);
if (Input(4,1)==1)/***检测到声音后声控传感器接受后,转盘开始旋转***/ { for (m=0;m<68;m++) { Servo(5,68-m); Delay(10); } Delay(200); for (m=0;m<68;m++) { Servo(5,m); Delay(2); } LedIn(1,1); LedIn(2,1); LedIn(3,1); LedIn(4,1); } Delay(320); if (Input(3,1)==1) goto loop; //***break;***// } loop:
{Servo(1,80); Servo(2,95); Servo(4,65); } } /******************************************************************************* * 程序名 : Act_Backward * 功能 : 前进 * 入口参数 : 无 * 返回值 : 无 *******************************************************************************/ Act_Backward() { Servo(1,100); Servo(2,66); }
/******************************************************************************* * 程序名 : Act_TurnLeft * 功能 : 前进 * 入口参数 : 无 * 返回值 : 无 *******************************************************************************/ Act_TurnLeft() { Servo(1,170); Servo(2,164);
}
/******************************************************************************* * 程序名 : Act_TurnRight * 功能 : 前进 * 入口参数 : 无 * 返回值 : 无 *******************************************************************************/ Act_TurnRight() { Servo(1,7); Servo(2,13); }
/******************************************************************************* * 程序名 : Act_FForward * 功能 : 快速前进 * 入口参数 : 无 * 返回值 : 无 *******************************************************************************/ Act_FForward() { Servo(1,65); Servo(2,123); while (1) { if (Input(1,1)==1) { Servo(1,80); Servo(2,80); } if (Input(2,1)==1) { Servo(1,93); Servo(2,95); } if (Input(4,1)==1) goto loop; } loop: Servo(1,50); Servo(2,132); }
Act_Stop() { PWMTCR = 0x00; } |
#include "config.h" #include "lib_io.h" #include "lib_arm.h" #include "lib_io_uart_lpc2138.h" #include "lib_act.h"
void __irq IRQ_UART0 (void) { int i; UART0_GetBuf(); UART0_Process(); for(i=0;i<4;i++) { LedIn(i+1,0); LedOut(i*2+1,0); LedOut(i*2+2,0); } LedIn(UART0_ReadBuf(7),1); Act_Select(UART0_ReadBuf(7)); }
void __irq IRQ_UART1 (void) { int8 x; x=ReadPC(); IRQ_End(0x00000000); SendPC(x); Servo(1,x); Delay(100); }
void __irq IRQ_Time0(void) { }
void __irq IRQ_Time1(void) { }
void __irq IRQ_Eint0(void) {
}
void __irq IRQ_Eint1(void) {
}
void __irq IRQ_Eint2(void) {
}
void __irq IRQ_Eint3(void) {
} |
#include "config.h" #include "lib_irq.h"
typedef struct UartMode { uint8 datab; uint8 stopb; uint8 parity; }UARTMODE;
uint8 rcv_buf[8]; volatile uint8 rcv_new;
void UART0_SendByte(uint8 dat) { U0THR = dat; }
void UART0_SendBuf() { uint8 i; for(i=0;i<8;i++) UART0_SendByte(rcv_buf[i]); while((U0LSR & 0X20) == 0); }
int8 UART0_Set(uint32 baud, UARTMODE set) { uint32 bak; if((baud==0)||(baud>115200)) return(0); if((set.datab<5)||(set.datab>8)) return(0); if(set.parity>4) return(0); U0LCR = 0x80; bak = (Fpclk >> 4) / baud; U0DLM = bak >> 8; U0DLL = bak & 0XFF; bak = set.datab - 5; if(set.stopb == 2) bak |= 0x04; if(set.parity != 0) { set.parity = set.parity - 1; bak |= 0x08; } bak |= set.parity << 4; U0LCR = bak; return(1); }
void UART0_GetBuf() { uint8 i; if((U0IIR & 0x0f) == 0x04) rcv_new = 1; for(i=0;i<8;i++) rcv_buf[i] = U0RBR; VICVectAddr = 0x00; }
int8 UART0_Init() { UARTMODE set; set.datab = 8; set.stopb = 1; set.parity = 0; PINSEL0 = (PINSEL0 & (~0X0F)) | 0x05; rcv_new = 0;
UART0_Set(9600,set); U0FCR = 0x81; U0IER = 0x01; IRQEnable(); VICIntSelect = 0x00000000; VICVectCntl0 = 0x20 | 0x06; VICVectAddr0= (uint32)IRQ_UART0; VICIntEnable = 1 << 0x06; }
uint8 UART0_ReadBuf(uint8 i) { return(rcv_buf[i]); }
void UART0_Process() { if(rcv_new == 1) { rcv_new = 0; UART0_SendBuf(); } } |
② lib_irq.c
③ Lib_io_uarb_lpc2138.c
④ Lib_act.c
4. 结论
基于ARM7的嵌入式运动控制系统集成了计算机技术、ARM技术、运动控制芯片技术、嵌入式操作系统技术等为一体的技术含量高的控制系统。控制单元具有低功耗、高性能等优点,也便于以后机器人功能的扩展,同时嵌入式系统具有良好的实时性,可实现多任务的调度,这就使机器人具有良好的实时性、可靠性及抗干扰性。
本项目的设计创新点:将嵌入式技术应用到机器人的研究之中,使机器人硬件结构简单化,并对以后的功能扩展提供了理论基础,这为研究其他类型的机器人提供了新的研究思路。探索者开放了包括控制器和 9 种传感器在内的所有电子部件 I/O 接口,并提供所有电子元件电路图,供用户学习使用,可进行单片机、传感器、数字/模拟电路等课程的各种实验,极大的方便了有二次开发需求的用户。在创作过程中,我们遇到了很多问题,在老师同学的帮助下以及小组成员的共同努力下都一一解决,增强了我们的动手能力以及创新能力。本项目中的机器人可以应用于清理道路上的垃圾,也可用于其它东西的抓取,这个创新设计能够减轻环卫工人的劳动量,也可以替他们做一些危险任务,保障了他们的人身安全。
* 本项目未获得作者开源授权,无法提供资料下载。