机器谱

S093】手机蓝牙控制高射炮装甲车

图文展示3264(1)

图文展示3264(1)

副标题

作品说明

作者:崔云飞 许美珍 李文良

单位:内蒙古工业大学

指导老师:武建新

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 接口,并提供所有电子元件电路图,供用户学习使用,可进行单片机、传感器、数字/模拟电路等课程的各种实验极大方便了有二次开发需求的用户。在创作过程中,我们遇到了很多问题,在老师同学的帮助下以及小组成员的共同努力下都一一解决,增强了我们的动手能力以及创新能力。本项目中的机器人可以应用于清理道路上的垃圾,也可用于其它东西的抓取这个创新设计能够减轻环卫工人的劳动量,也可以替他们做一些危险任务,保障了他们的人身安全。

* 本项目未获得作者开源授权,无法提供资料下载

© 2022 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用