搜档网
当前位置:搜档网 › 蓝牙智能小车

蓝牙智能小车

蓝牙智能小车
蓝牙智能小车

燕山大学

课程设计说明书题目:蓝牙智能小车

学院(系):电气工程学院

年级专业:10级过控2班

学号:

学生姓名:

指导教师:

目录

摘要 (4)

第一章智能蓝牙小车简介 (5)

第二章系统硬件设计 (5)

第三章系统软件设计 (8)

第四章心得与体会 (14)

参考资料 (15)

摘要

本文的主要工作是基于STM32蓝牙智能小车的设计,随着越来越多的高科技产品逐渐融入了日常生活中,步进电机控制系统发生了巨大的变化。单片机、C语言等前言学科的技术日趋成熟与实用化,使得步进电机的控制系统有了新的研究方向与意义。本文描述了一个由STM32微处理器、步进电机、键盘等模块构成的,提供基于STM32的PWM细分技术的步进电机控制系统。该系统采用STM32微处理器为核心,在MDK环境下进行编程,根据键盘的输入,使STM32产生周期性的PWM信号,用此信号对步进电机的速度及转动方向进行控制。结果表明该系统具有结构简单、工作可靠、精度高等特点。

关键词:STM32微处理器;蓝牙智能小车;PWM信号;细分技术

第一章蓝牙智能小车简介

机器人可以分为三部分——传感器部分、控制器部分、执行器部分。

控制器部分:接收传感器部分传递过来的信号,并根据事前写入的决策系统(软件程序),来决定机器人对外部信号的反应,将控制信号发给执行器部分。好比人的大脑。

执行器部分:驱动机器人做出各种行为,包括发出各种信号(点亮发光二极管、发出声音)的部分,并且可以根据控制器部分的信号调整自己的状态。对机器人小车来说,最基本的就是轮子。这部分就好比人的四肢一样。

传感器部分:机器人用来读取各种外部信号的传感器,以及控制机器人行动的各种开关。好比人的眼睛、耳朵等感觉器官。

无线部分:用蓝牙从机的TTL接口接收信号反馈给单片机,还可以通过电脑的无线局域网网卡来控制路由器的TTL串口来控制单片机的状态。由于蓝牙模块容易得到且接口方便,电压可以用+5V控制,携带方便,便于在小车上安装。

电机驱动:电机驱动需要大电流,较高的电压,考虑到单片机的负载能力,用L298N驱动模块来驱动电机,单片机输出逻辑信号控制L298N模块输出正反向电压,由此控制电机的正反转。

第二章系统硬件设计

1.小车底盘

小车底盘是机器人最重要的载体,相当于人体的驱干,ZK-4WD 小车平台采用差速转弯非常灵活可以实现原地打转。小车平台大小刚好,可以承载一些如驱动器,控制器,电池,传感器等。

2.驱动器

小车直流电机工作电流一般是200-400MA 有些更大,如果一个小车是二个轮子,那么总的电流在400-800MA 左右,这些电机轮子都是要接受单片机指令执行相应的动作,而市面有的单片机IO 口一般只能提供5MA 到10MA 的电流,直接驱动不了电机,所以需要搞一个驱动模块。放大电流。

驱动采用专业的L298N,L293D 驱动芯片。

3.控制器

STM32单片机控制器:这款控制器主控芯片是STC89C52 属标准的51 核的单片机,也可以用增强型51 单片机芯片,STC12C5A60S2 内带PWM,AD ,1T 运行速度(主流),集成USB转串可以直接用USB 下载程序。集成数码管,舵机,红外避障,12864,1602,无线模块,等接口,板载输入按键。控制板休积小,非常适用于小车。在不用的时候可作用学习板使用。

4.小车所需的能源

可以用普通的AA5 号电池,但一般采用低内阻的充电电池,充电电池

套装。

5.蓝牙无线传感器

可以用Android 智能手机控制小车运行(我们有配套的Android 软

件),Android 手机用内置蓝牙与蓝牙无线模块配对,发出指令,蓝牙无线

模块接收其指令。当单片机接收到蓝牙无线模块传来的指令,执行相应解码动作,从而控制小车。

第三章系统软件设计

一、所包含的头文件:

#include "stm32f10x.h"

#include "usart1.h"

#include "timer4.h"

#include "adc1.h"

#include "key.h"

二、外设的初始化和设置

本节按步骤描述了如何初始化和设置任意外设。这里PPP代表任意外设。

1、在主应用文件中,声明一个结构PPP_InitTypeDef,例如:

PPP_InitTypeDef PPP_InitStructure;

这里PPP_InitStructure是一个位于内存中的工作变量,用来初始化一个或者多个外设PPP。

2、为变量PPP_InitStructure的各个结构成员填入允许的值。可以采用以下2种方式:

a)按照如下程序设置整个结构体

PPP_InitStructure.member1 = val1;

PPP_InitStructure.member2 = val2;

PPP_InitStructure.memberN = valN;

/* where N is the number of the structure members */

以上步骤可以合并在同一行里,用以优化代码大小:

PPP_InitTypeDef PPP_InitStructure = { val1, val2,.., valN}

b)仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他成员的值(多为缺省值)被正确填入。PPP_StructInit(&PPP_InitStructure);

PP_InitStructure.memberX = valX;

PPP_InitStructure.memberY = valY;

/*where X and Y are the members the user wants to configure*/

3.调用函数PPP_Init(..)来初始化外设PPP。

4.在这一步,外设PPP已被初始化。可以调用函数PPP_Cmd(..)来使能之。PPP_Cmd(PPP, ENABLE);

可以通过调用一系列函数来使用外设。每个外设都拥有各自的功能函数。更多细节参阅Section3 外设固件概述。

注:1. 在设置一个外设前,必须调用以下一个函数来使能它的时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ENABLE);

2.可以调用函数PPP_Deinit(..)来把外设PPP的所有寄存器复位为缺省值:PPP_DeInit(PPP)

3.在外设设置完成以后,继续修改它的一些参数,可以参照如下步骤:PPP_InitStucture.memberX = valX;

PPP_InitStructure.memberY = valY; /* where X and Y are the only members that user wants to modify*/

PPP_Init(PPP, &PPP_InitStructure);

1)此次课设中GPIO的配置

void STEPMotor_GPIO_Config(void )

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_12 |GPIO_Pin_13;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&GPIO_InitStruct);

}

选用端口为PB的PB0, PB1, PB12, PB13。

频率为50MHz,

输出模式为推挽输出。

2)主程序

#include"stm32f10x.h" //头文件

void GPIO_Config(void);//声明函数

void Usart_Config(void);//声明函数

void delay(uint16_t z);//声明函数

void NVIC_Config(void);//声明函数

u8 Receive;

int main()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB 2Periph_GPIOA

|RCC_APB2Periph_GPIOB

|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE ); //打开相应的时钟使能

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE ); //打开TIM4的时钟使能

GPIO_Config();//调用函数

Usart_Config();//调用函数

GPIO_Config();//调用函数

NVIC_Config();//调用函数

while(1)

{

}

}

void delay(uint16_t z) //延时函数

{

uint16_t i=0;

while(z--)

{

for(i=0;i<1000;i++); //1毫秒

}

}

void Usart_Config(void) //设置串口

{

USART_InitTypeDef USART_InitStruct; //声明结构体

USART_https://www.sodocs.net/doc/c48578244.html,ART_BaudRate=9600;//给结构体赋值

USART_https://www.sodocs.net/doc/c48578244.html,ART_WordLength=USART_WordLength_8b;

USART_https://www.sodocs.net/doc/c48578244.html,ART_StopBits=USART_StopBits_1;

USART_https://www.sodocs.net/doc/c48578244.html,ART_Parity=USART_Parity_No;

USART_https://www.sodocs.net/doc/c48578244.html,ART_Mode=USART_Mode_Rx|USART_Mode _Tx;

USART_https://www.sodocs.net/doc/c48578244.html,ART_HardwareFlowControl=USART_Hardwar eFlowControl_None;

USART_Init(USART1,&USART_InitStruct); //初始化

USART_Cmd(USART1, ENABLE); //使能

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//中断

}

void GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPI O_Pin_9;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void NVIC_Config(void) //设置中断

{

NVIC_InitTypeDef NVIC_InitStruct;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(& NVIC_InitStruct);

}

中断it.c里面的程序

void SysTick_Handler(void)

{

}

uint8_t dat = 0;

uint8_t flag = 0;

void USART1_IRQHandler(void)

{

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

dat=USART_ReceiveData(USART1);

if((dat == 'O')&&(flag == 0))

{

flag++;

}

if((dat == 'N')&&(flag == 1))

{

flag++;

}

if(flag == 2)

{

switch(dat)

{

case 'A':GPIO_Write(GPIOD,0XAA00); break;//实现前进后退等四个方向.前进

case 'B':GPIO_Write(GPIOD,0X5500); break;//后退

case 'C':GPIO_Write(GPIOD,0X8800); break;//左转

case 'D':GPIO_Write(GPIOD,0X2200); break;//右转

case 'F':GPIO_Write(GPIOD,0x0000); break;////停止

default:break;/////灯翻转

}

flag = 0;

}

}

第四章心得与体会

为期一周的创新学分训练马上就要结束了,此次实训我做的题目是蓝牙智能小车。简单地说就是通过STM32微控制器通过蓝牙控制小车运动。

实现这个功能主要是通过编写单片机程序然后传送到STM32芯片中,控制电机的运动。所以此次实训的主要目的就是编写程序然后调试程序。

刚开始的时候,老师就带着我们熟悉编程序的软件,并且告诉我们一定要养成良好的代码风格,并且让我们熟悉掌握外设的初始化和设置,这个是编写程序的基础吧,如果不按照外设初始化和设置的步骤来编写程序,程序就无法正常运行,就算运行了也无法实现正确的功能,所以对于我这个初学者来说,这是很好的经历,可以在调试程序或者是修改程序的时候少走弯路。老师给我们讲解了流水灯,中断,串口等等程序之后,我对编写程序也比较熟练了,然后就是自己把程序下载到单片机上,让小车去寻迹,根据小车出现的问题去改变参数,调试程序,最后让小车可以稳定的运行。在硬件系统设计成功的前提下,通过分析步进电机的工作特点及STM32产生PWM信号的原理,系统通过不断调整控制各步进电机的PWM信号的频率,实现了多步进电机在目标位置不同的情况下,能够同时启动、加速、高速、减速及制动的同步协调工作,达到了系统的要求。

此次课设基本要求实现了,并且锻炼了自己的动手能力,养成了良好的代码风格,对于STM32也有了一定的了解,可以编写一些简单的程序了,对于我来说这是很大的一个突破。在编写程序时,也学会了看参考手册,以及查找相应参数的方法。这次实训学到了不少东西,这和我自己的努力有关,这个更离不开老师们的细心指导和教学,在此感谢指导我一个月的两位学长,你们辛苦了,非常感谢。

基于单片机的红外遥控智能小车设计报告

基于单片机的红外遥控智能小车设计报告

毕业设计(论文)题目:基于单片机的红外遥控智能小车

西安邮电学院 毕业设计(论文)任务书 学生姓名指导教师职称工程师学院电子工程学院系部光电子技术 专业光电信息工程 题目基于单片机的红外遥控智能小车 任务与要求 任务:以51单片机为控制核心,实现具有自动避障、加速、减速等功能的红外遥控智能小车。 要求:1 搜集资料,熟悉单片机开发流程;熟悉红外传感器等相关器件; 掌握单片机接口和外围电路应用;具备一定的单片机开发经 验。 2 学会电路设计、仿真等相关软件的使用; 3 具备一定的硬件调试技能。 4 学会查阅资料; 5 学会撰写科技论文。 开始日期2010年3月22日完成日期2010年6月27日主管院长(签字) 年月日

西安邮电学院 毕业设计 (论文) 工作计划 学生姓名赵美英指导教师崔利平职称工程师学院电子工程学院系部光电子技术 专业光电信息工程 题目基于单片机的红外遥控智能小车 工作进程

主要参考书目(资料) 1、何立民,单片机应用系统设计,北京:航天航空大学出版社; 2、李广弟,单片机基础,北京:北京航空航天大学出版社,2001; 3、何立民,MCS-51系列单片机应用系统设计系统配置与接口技术,北 京航空航天大学出版社,1990.01; 4、赵负图,传感器集成电路手册,第一版,化学工业出版社,2004; 5、Atmel.AT89S51数据手册.https://www.sodocs.net/doc/c48578244.html, 主要仪器设备及材料 1.普通计算机一台,单片机开发环境; 2.电路安装与调试用相关仪器和工具。 (如示波器、万用表、电烙铁、镊子、钳子等)。 论文(设计)过程中教师的指导安排 每周四进行交流与总结;其余时间灵活安排,及时解决学生问题。 对计划的说明 依学生实际情况,适当调整工作进度。

成功实现手机蓝牙控制智能小车机器人!视频+程序源代码(Android)

上次成功实现了通过笔记本电脑蓝牙来控制智能小车机器人的运动,但是通过电脑控制毕竟不方便,于是乎~本人打算将控制程序移植到手机上。 目前主流的手机操作系统有塞班、安卓(Android)、Windows Mobile,对比了一下,首先,塞班是用C++写的,这么多门语言我唯独看到C++就头大···,放弃了···,Windows Moblie 其实和之前发的电脑端程序基本是一样的,也就没什么意思了,最后决定选择目前正火的Android手机作为控制平台。 Android是个开源的应用,使用Java语言对其编程。于是这次的开发我选用Eclipse作为开发工具,用Java语言开发手机端的控制程序,由于之前对Android的蓝牙通信这块涉及不多,一开始感觉有点小茫然,而网上也少有这方面的例程,有少数人做出了类似的东西,但是只传了个视频装X!雪特···· 经过几天的研究,最终确定了手机蓝牙通信其实就是Socket编程,再经过一番编写和调试,昨晚终于大功告成! 这是视频: 下面开始介绍Android手机端控制程序的编写: 首先打开Eclipse,当然之前的Java开发环境和安卓开发工具自己得先配置好,这里就不多说了,网上教程一大摞。 然后新建一个Android项目,修改布局文件main.xml,代码如下: