基于stm32f4的蓝牙控制小车.docx
《基于stm32f4的蓝牙控制小车.docx》由会员分享,可在线阅读,更多相关《基于stm32f4的蓝牙控制小车.docx(22页珍藏版)》请在冰豆网上搜索。
基于stm32f4的蓝牙控制小车
ARM-STM32校园创新大赛
项目报告
题目:
基于stm32f4的蓝牙控制小车
学校:
中南民族大学
指导教师:
视频观看地址:
v.youku./v_show/id_XNjA3NTE4MzU2.html
题目:
基于stm32f4的蓝牙控制小车
关键词:
STM32F4LM2940-5.0L298NFBT06_LPDB蓝牙串口通信androidFBT06_LPDBFBT06_LPDB
摘要
“基于stm32f4的蓝牙控制小车”是一个基于意法半导体与ARM公司生产的STM32F4DISCOVERY开发板的集电机驱动模块、电源管理模块、stm32f4主控模块、蓝牙串口通信模块、android控制端模块。
电机驱动模块使用了两个L298N芯片来驱动4路电机,使能端连接4路来自主控板的PWM波信号,8个输入端接主控板的8个输出端口;电源管理模块使用了LM2940-5.0芯片进行12V到5V的转换,12V用于电机模块的供电,5V用于蓝牙模块、传感器等的供电;主控模块采用了MDK编辑程序,然后下载到主控板,实现硬件与软件的交互;蓝牙串口通信模块则是采用了FBT06_LPDB针插蓝牙模块,与主控板进行串口通信,同时与android手机进行通信;android控制端模块是一个集开启蓝牙、搜索蓝牙、控制小车等功能。
用户可以通过android控制端进行控制小车的运动,实现一些用户需要的功能和服务。
1.引言
蓝牙的创始人是瑞典爱立信公司,蓝牙技术是一种无限数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。
手机之间通过蓝牙实现数据共享成为常理,将手机变为遥控器为人们的生活带来无限方便。
遥控小车在工业、国防、科研等领域应用越来越广泛,例如说:
消防遥控小车、探测小车等。
本文详细阐述了使用蓝牙通信的手机遥控小车前行、倒退、左转、右转和停止等功能的软硬件设计过程。
2.系统方案
该系统分为电机驱动模块、电源管理模块、主控板、蓝牙通信模块、android控制端等5个模块,如图2.1所示:
图2.1系统模块图
3.系统硬件设计
3.1电机驱动模块
3.1.1L298N的封装
H桥电路虽然有着诸多的优点,但是在实际制作过程中,由于元件较多,电路的搭建也较为麻烦,增加了硬件设计的复杂度。
由于H桥电路有诸多的优点,但是在实际制作过程中电路又比较麻烦,因此在本设计中我们采用H桥集成电机驱动芯片L298。
L298N的工作原理和以上介绍的H桥相同,引脚图如图3.1所示:
图3.1L298N封装图
3.1.2L298N的原理图设计
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。
该芯片采用15脚封装。
主要特点是:
工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。
内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。
使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
L298的参考电路图如图3.2所示。
图3.2电机驱动电路原理图
3.1.3电机驱动模块实物
1、控制板内部带5V逻辑电平转换芯片,不需要额外的5V供电。
2、如果EN1、EN2、EN3、EN4不接PWM调速信号,次脚需要和对应的管教短接。
3、GND和12V接电机电源,其中12V可以接7V--24V电平,板子上的电源开关只是控制逻辑5V电平的开关,L298的12V电源不受此开关控制.
4、输出端和输入端一一对应,当输入端为5V时,输出端也为高电平,输入端为低电平时输出亦为低电平。
图3.3L298N电机驱动模块实物图
3.2电源管理模块
3.2.1智能车电源设计要点
电源是整个系统稳定工作的前提,因此必须有一个合理的电源设计,对于小车来说电源设计应
注意两点:
1.与一般的稳压电源不同,小车的电池电压一般在6-8V左右,还要考虑在电池损耗的情况下电压的降低,因此常用的78系列稳压芯片不再能够满足要求,因此必须采用低压差的稳压芯片,在本文中以较为常见的LM2940-5.0为例。
2.单片机必须与大电流器件分开供电,避免大电流器件对单片机造成干扰,影响单片机的稳定运行。
现在各种新型的电源芯片层出不穷,各位读者可以根据自己的需求自行选择电源芯片,对于本设计应该主要注意稳压压差和最大输出电流两个指标能否满足设计要求。
3.2.2低压差稳压芯片LM2940简介
LM2940系列是输出电压固定的低压差三端端稳压器;输出电压有5V、8V、10V多种;最大输出电流1A;输出电流1A时,最小输入输出电压差小于0.8V;最大输入电压26V;工作温度-40~+125℃;
内含静态电流降低电路、电流限制、过热保护、电池反接和反插入保护电路。
同时LM2940价格适中而且较容易购买,非常适合在本设计中使用。
LM2940-5.0封装和实物如图3.4所示。
图3.4LM2940封装和实物图
如图3.5所示,采用两路供电,这样可以使用其中一路单独为STM32F4discovery电路板供电,指示灯等供电。
另外一路提供L298N、舵机、蓝牙的工作电压,L298N的驱动电压由电池不经任何处理直接给出。
舵机可以用6V供电,也可以直接用5V供电。
图3.5电源模块原理图
如图3.6中的PCB图:
图3.6电源模块PCB图
图3.7是运用腐蚀液自制的电源管理模块,具有12v\5v的供电模块,可同时给电机模块和主控板(STM32DISCOVERY)供电:
图3.7电源管理模块实物图
4.系统软件设计
4.1主控板程序设计
4.1.1main程序设计
主函数主要分为延迟时间初始化、串口接收模块程序、电机初始化三部分。
主函数的流程图如图4.1所示:
图4.1主函数流程图
主函数程序代码如下:
intmain(void)
{
delay_init(168);//延迟时间初始化
uart_init(9600);//串口初始化
Direction
(1);//电机初始化
delay_ms(10);//延迟10ms
printf("welcometocontrolthesmartcar!
:
\n\r");//输入语句
while
(1);
}
4.1.2串口接收模块程序
主控板接收到蓝牙从串口传来的数据后存入Res变量,然后通过分支程序来选择执行前进、后退、左转、右转和停止等功能。
该模块的程序流程图如图2所示:
图2串口接收程序流程图
4.1.3修改PWM输出值程序
该程序是基于“4_PWM的实现”中的程序改编的。
代码如下:
voidChange_PWM(intduty1,intduty2,intduty3,intduty4)
{
SCB->AIRCR=0x05AF00;//中断优先级分组抢占:
响应=3:
1
RCC->AHB1ENR|=(1<<2);//打开GPIOC时钟
GPIOC->MODER|=0x000AA000;//pc6789第二功能,推挽输出
GPIOC->OSPEEDR|=0x000FF000;//输出速度为100m
GPIOC->PUPDR|=0x00055000;//上拉
GPIOC->AFR[0]|=0x22000000;//pc6789的第二功能为AF2
GPIOC->AFR[1]|=0x00000022;
RCC->APB1ENR|=(1<<1);//打开TIM3时钟
TIM3->PSC=83;//对84M时钟进行84分频,使得计数频率为1M
TIM3->ARR=10000;//周期为10ms
TIM3->EGR|=1;//产生一次更新时间
TIM3->CCMR1|=0x6060;//PWM模式1
TIM3->CCMR2|=0x6060;//PWM模式2
TIM3->CCR1=duty1;//1路PWM
TIM3->CCR2=duty2;//2路PWM
TIM3->CCR3=duty3;//3路PWM
TIM3->CCR4=duty4;//4路PWM
TIM3->CCER|=0x1111;//使能比较输出
TIM3->CCMR1|=0x0808;//启动预装载
TIM3->CCMR2|=0x8080;
TIM3->CR1|=1;//开始计时
}
4.1.4设置电机转向程序
改程序将电机驱动模块的8个输入端口接到了主控板的8个GPIO口,通过推挽输出,从而控制电机的转向,代码如下:
voidDirection(intdirection)
{
SysTick_Config(SystemCoreClock/1000);//时钟中断设为1ms
RCC->AHB1ENR|=0x00000005;//使能GPIOA和GPIOD时钟
RCC->APB2ENR|=(1<<14);//使能syscfg时钟
if(direction==0)
{
GPIOA->MODER&=0xffff0000;//设置PA0,1,2,3为输出
GPIOA->MODER|=0x00005555;
GPIOA->OTYPER&=0xFFFFff00;//设置PA0,1,2,3为推挽输出
GPIOA->OSPEEDR&=0xffff0000;//设置PA0,1,2,3的输出速度为100M
GPIOA->OSPEEDR|=0x0000ffff;
SYSCFG->CMPCR=0x00000001;//使用IO补偿单元
GPIOA->PUPDR&=0xffffff00;//设置PA0,1,2,3无上拉,无下拉
GPIOA->BSRRH=0x00ff;//复位GPIOA_BSRRH寄存器
GPIOA->BSRRL=0x0055;
}
else
{
GPIOA->MODER&=0xffff0000;//设置PA0,1,2,3为输出
GPIOA->MODER|=0x0000005555;
GPIOA->OTYPER&=0xFFFFff00;//设置PA0,1,2,3为推挽输出
GPIOA->OSPEEDR&=0xffff0000;//设置PA0,1,2,3的输出速度为100M
GPIOA->OSPEEDR|=0x0000ffff;
SYSCFG->CMPCR=0x00000001;//使用IO补偿单元
GPIOA->PUPDR&=0xffffff00;//设置PA0,1,2,3无上拉,无下拉
GPIOA->BSRRH=0x00ff;//复位GPIOA_BSRRH寄存器
GPIOA->BSRRL=0x00AA;
}
}
4.2android客户端程序设计
4.2.1控制界面的布局
控制界面主要运用了线性布局、相对布局和表格布局。
整体采用线性布局,局部采用相对布局,而控制按钮采用了表格布局。
控制界面的布局如图4.1所示:
图4.1控制界面的布局
4.2.2布局的代码如下:
xmlversion="1.0"encoding="utf-8"?
>
android="schemas.android./apk/res/android"
android:
layout_width="wrap_content"
android:
layout_height="fill_parent"
android:
orientation="vertical">
android:
id="+id/container"
android:
orientation="vertical"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
>
android:
layout_width="fill_parent"
android:
layout_height="wrap_content"
android:
id="+id/edit_bottombar"
android:
layout_alignParentBottom="true">
id="+id/btn_disconnect"
android:
layout_width="65dp"
android:
layout_height="wrap_content"
android:
layout_alignParentLeft="true"
android:
text="断开"/>
id="+id/btn_msg_send"
android:
layout_width="65dp"
android:
layout_height="wrap_content"
android:
layout_alignParentRight="true"
android:
text="发送"/>
android:
id="+id/MessageText"
android:
layout_width="98dp"
android:
layout_height="wrap_content"
android:
layout_toRightOf="+id/btn_disconnect"
android:
hint="说点什么呢?
"
android:
textSize="15dip"
/>
android:
id="+id/list"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_above="id/edit_bottombar"
android:
layout_below="id/container"
android:
layout_weight="1.0"
android:
divider="#ffc6c6c6"
android:
scrollingCache="false"
android:
visibility="visible"/>
android:
layout_width="match_parent"
android:
layout_height="wrap_content">
android:
id="+id/tableRow1"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content">
android:
id="+id/tableRow2"
android:
layout_width="wrap_content"
android:
layout_height="0dp"
android:
layout_weight="1">
android:
id="+id/left"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_marginRight="0dp"
android:
text="left"
android:
width="120px"/>
android:
id="+id/stop"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
text="stop"
android:
width="120px"/>
android:
id="+id/right"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
text="right"
android:
width="120px"/>
android:
id="+id/tableRow3"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content">
android:
id="+id/button2"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
text="Button"
android:
visibility="invisible"/>
android:
id="+id/back"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
text="Back"/>
4.2.3android客户端的界面如图4.2所示:
图4.2android控制界面
4.2.4发送按钮的代码
sendButton=(Button)findViewById(R.id.btn_msg_send);
sendButton.setOnClickListener(newOnClickListener(){
Override
publicvoidonClick(Viewarg0){
//TODOAuto-generatedmethodstub
StringmsgText=editMsgView.getText().toString();//获取编辑框内的内容
if(msgText.length()>0){
sendMessageHandle(msgText);//发送编辑框的内容给串口
editMsgView.setText("");//清空编辑框
editMsgView.clearFocus();
//closeInputMethodManager
InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editMsgView.getWindowToken(),0);
}
else
Toast.makeText(mContext,"发送内容不能为空!
",Toast.LENGTH_SHORT).show();
}
});
4.2.5控制按钮的代码
以左转按钮为例:
sendButton=(Button)findViewById(R.id.left);
sendButton.setOnClickListener(newOnClickListener(){
Override
publicvoidonClick(Viewarg0){
StringmsgText="1";//发送左转命令“l”
if(msgText.length()>0){
sendMessageHandle(msgText);//发送“l”给串口
editMsgView.setText("");//清空编辑框
editMsgView.clearFocus();
//closeInputMethodManager
InputMethodManagerimm=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editMsgView.getWindowToken(),0);
}
else
Toast.makeText(mContext,"发送内容不能为空!
",Toast.LENGTH_SHORT).show();
}
});
5.系统创新
自从有了智能手机,机器人的应用也就多了一个新的方向:
手机控制机器人。
2005年日本第二大电信运营商KDDI和机械制造商IBeeKK联合推出了第一款手机控制机器人。
当然了,想要操纵这种机器人,你首先需要使用KDDI网络,并且用户的手机上,本身还需要带有蓝牙功能,然后再通过KDDI提供BREW方式下载机器人的驱动程式和控制系统。
不过这种机器人的价格却相对高昂,预售市价约合人民币15000元。
随着Android系统技术的普及,可以做个基于Android的客户端,在小车上装个接收蓝牙信号的FBT蓝牙接收模块,然后就可以通过客户端发送蓝牙信号,来对蓝牙小车进行控制控制,其接收可达15米,完全能适应对小车的要求。
其中这个FBT蓝牙接收模块是低耗能,这样就把更多的能量用在小车的驱动上。
小车需要很大的马力和很好的灵活性以应对不同的地形。
这辆车的车轮使用四驱的直流电机来驱动的,用PWM波来控制小车的速度,可以很方便的更改其速度,有主控板通过推挽输出来