IT技术互动交流平台

基于launchpadG2553的wifi视频小车

作者:lanchaohuan  发布日期:2013-09-25 10:20:34

1.引言

本项目的产品是以launchpad作为控制核心的wifi视频小车。可以通过上位机操作实现小车的前进后退左转右转等基本动作,车上搭载的摄像头能够将小车的监控画面实时传回上位机。在该小车的基础上加以扩展和改装,可将小车实际运用于火灾、毒气等危险环境中。

2.系统方案

 

 

160825372.png

 

 

 

 

 

 

3.系统硬件设计

一.主控制模块

155540993.jpg

 

本系统使用的芯片板为TI公司的launchpad G2系列,搭载芯片为MSP430G2553,除了接收和处理指令,小车大部分时间处在等待指令的状态,所以可以充分利用MSP430芯片超低功耗的特点,将芯片在等待指令的阶段进入休眠状态,大大降低了芯片耗能,延长了电池使用时间。此外,launchpad小巧轻便的设计也能相当方便地搭载在小车上。

 

二.Wifi模块

155547119.jpg

 

Wifi模块由TP-link703n路由器改装,可以刷入openwrt系统(介绍见附录1),在系统中装入摄像头驱动和安装ser2net服务,即可支持视频传输和TTL指令传输。其特点是小巧便携,方面安装在小车上,且自带USB接口供摄像头接入。

 

三.电机模块

 

电机模块原理图

155550539.jpg

 

155555459.png

1.驱动芯片:L298N双H桥驱动芯片

2.驱动部分端子供电范围VMS:+5V~+35V

3.驱动部分峰值电流Io:2A/桥

4.逻辑部分端子供电范围Vss:4.5-5.5V

5.逻辑部分工作电流范围:0~36mA

6.控制信号输入电压范围:高电平4.5-5.5V 低电平0V
7.最大功耗:20W

 

四.电源模块

 

本模块中提供三档电源给系统供电,7.5V给电机供电,5VL298N和路由器供电,3.6Vlaunchpad供电。

电源有一对2700mah16850电池组组成,输出电压为7.5V,用LM317可调节降压降至5V,再用两个IN4007二极管将5V降至3.6V

LM317原理图如下:

155557561.png

五.车体部分

车体底盘采用透明亚克力板,车轮由两个直流电机和一个万向轮组成,电机由L298N电机模块驱动,三轮结构使小车运动更加灵活。

155601376.jpg

 

 

4.系统软件设计

 


 

下位机部分:

155604137.png

 

 

 

 

 

 

指令格式为416进制数,其中包括开始位,类型位,数据位和结束位,具体格式如下:

/**************************************************************
协议规定:
包头类型位数据位结束位
0XFF 1 1 0XFF
各命令说明:
类型位数据位功能
0X00 0X01 前进
0X00 0X02 后退
0X00 0X03 左转
0X00 0X04 右转
0X00 0X00 停止
0X01 0X00 LED1
0X01 0X01 LED1
**************************************************************/

如前进指令为FF0001FF,单片机每次接收一位数据则进入一次中断,将接收的数据进行存储,当收到结束位FF时,四次所接收的数据进行打包并执行动作控制外围设备做出相应动作。

下位机完整代码见附录2.

 

 

上位机部分

上位机分为PC端和手机端,PC端在windows系统中运行,手机端在android中运行。

PC控制端可拓展功能多,便于调试。

以下为软件界面:

155610275.png

155612685.png

手机安卓控制端支持自定义指令,当按下按键时发送动作指令,松开按键时发送停止指令,支持重力感应控制。

软件界面如下:

155615232.jpg

 

PS:上位机程序源代码均源自网络。

5.系统创新

u采用wifi信号传输,相比于蓝牙,传输速度更快,距离更远。

u搭载了高清摄像头,可实时监控小车画面。

u采用通信协议数据包格式,易于扩展更多功能。

u运用了MSP430低功耗的特点,使芯片大部分时间处于休眠状态,延长系统的续航时间。

u利用了手机重力感应的功能,增强了小车的趣味性。

 

6 产品演示视频


 



附录

1.openwrt

 

OpenWrt的被描述为一个嵌入式设备的Linux发行版,而不是试图建立一个单一的,静态的固件,OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序通过使用包。对于开发人员,OpenWrt的是框架来构建应用程序,而无需建立一个完整的固件左右;对于用户来说,这意味着完全定制的能力,从来没有预想的方式使用该设备。

简单来说,openwrt是一个主要以网络为基础并拓展应用的系统,可以安装订制新功能,当然也可以删除不需要的功能。本项目中在openwrt系统中安装了摄像头驱动和ser2net,用于摄像头画面传输和指令传输。

 

2.MSP430G2553完整代码


#include "msp430g2553.h"
#define uchar unsigned char
#define uint unsigned int
int i=0,j,n=1,URTAReceivedCount=0;
uchar Tempdatatable[4];
uchar CommandData[4];


//延时子函数
void Delay_1ms(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++); 
}


/*****************************************
以下五个子函数分别为前进、后退、左转、右转动作指令
*****************************************/
void Moto_Forward()
{ 


P2OUT=0x0a;
// Delay_1ms(100);


}
void Moto_Backward()
{


P2OUT|=BIT0+BIT2 ;
P2OUT|=~BIT1+~BIT3;
// Delay_1ms(100);
}
void Moto_TurnLeft()
{ 


P2OUT=0x02;
// Delay_1ms(100);
}
void Moto_TurnRight()
{ 


P2OUT|=BIT1+BIT3 ;
P2OUT|=~BIT0+~BIT2;


// Delay_1ms(100);
}
void Moto_Stop()
{ 


P2OUT&= 0x00;
//Delay_1ms(100);
}
/**************************************************************
数据打包完毕后执行RunCommand函数进行对接收的数据包进行解析并转向相应的动作函数
**************************************************************/
void RunCommand(void)
{
if(CommandData[0]==0xff && CommandData[3]==0xff)
{
switch(CommandData[1]) //判断类型位,00为电机动作,01为LED1动作
{
case 0x00:
switch(CommandData[2])
{
case 0x00:
Moto_Stop();
break;
case 0x01:
Moto_Forward();
break;
case 0x02:
Moto_Backward();
break;
case 0x03:
Moto_TurnLeft();
break;
case 0x04:
Moto_TurnRight();
break;
}
break;
case 0x01:
switch(CommandData[2])
{
case 0x00:
P1OUT|=BIT0; //LED1亮
break;
case 0x01:
P1OUT&=~BIT0; //LED1灭
break;
default: break;
}
break;
default: break;
}
}
}


/*******************************************************************
以下为数据回传函数,用于测试程序,小车成功运行后可不执行


void Send_Data(uchar type,uchar cmd)
{
uchar Buffer[4];
intx=0;
uint SendCount=0;
Buffer[0]=0xff;
Buffer[1]=type;
Buffer[2]=cmd;
Buffer[3]=0xff;
while(1)
{
if(Buffer[x]==0xff)
{
SendCount++;
}
UCA0TXBUF=Buffer[x];
x++;
if(SendCount==2)
{
break;
} 
} 
}
**************************************************************/


void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗
UCA0CTL1 |= UCSWRST; // USCI_A0 进入软件复位状态
UCA0CTL1 |= UCSSEL_2; //时钟源选择 SMCLK
BCSCTL1 = CALBC1_1MHZ; //设置 DCO 频率为 1MHz
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1DIR |= BIT0;
P1OUT&=~BIT0;
P2DIR|=0xff;
P2OUT=0X00;
UCA0BR0 = 0x68; //时钟源 1MHz 时波特率为9600
UCA0BR1 = 0x00; //时钟源 1MHz 时波特率为9600
UCA0MCTL = UCBRS0; //小数分频器
UCA0CTL1 &= ~UCSWRST; //初始化 USCI_A0 状态机
IE2|= UCA0RXIE; //使能 USCI_A0 接收中断
_EINT(); //开总中断


while(1)
{
LPM1; //进入低功耗模式1
}
}
#pragma vector = USCIAB0RX_VECTOR //接收中断
__interrupt void USCI0RX_ISR(void)
{


LPM1_EXIT; //退出低功耗模式
IE2&=~ UCA0RXIE; //关闭中断,禁止中断被嵌套
while ( !(IFG2&UCA0TXIFG) ); 


uchar temp;






temp=UCA0RXBUF;
if(temp==0x00&&URTAReceivedCount==0)
{;}
else
{
if(temp==0xff&&URTAReceivedCount<2)
{
Tempdatatable[0]=0xff;
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
}
if(URTAReceivedCount>1)
{
Tempdatatable[0]=0xff;
Tempdatatable[3]=0xff;
n=1;
URTAReceivedCount=0;
CommandData[0]=Tempdatatable[0];
CommandData[1]=Tempdatatable[1];
CommandData[2]=Tempdatatable[2];
CommandData[3]=Tempdatatable[3];


//Send_Data(CommandData[1],CommandData[2]); //指令回传,测试使用
RunCommand();


}
}
IE2|= UCA0RXIE; 开启中断
}

 

延伸阅读:

Tag标签: launchpadG2553  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规