OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4581|回复: 3

我们的蓝牙小车

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-5-8
在线时间
0 小时
发表于 2016-5-8 12:26:53 | 显示全部楼层 |阅读模式

   燕山大学第四届DIY达人赛

              作

              品

              报
   
              告

                          作品名称:我们的蓝牙小车
                          队名:手机远程遥控电子四驱
                               车四人研究小组
                          队长:娄轶麟
                          队员:李池、宋子琛、王雅婷



目录:


一、设计背景    ································· 1

二、设计思路    ································· 1

三、原理分析    ································· 2

四、制作过程    ································· 2

五、心得体会    ································· 3

六、展望未来    ································· 4







一、设计背景
     新的学期意味着新的开始,新的生活,新的挑战。值此新旧交替之时,无线电爱好者协会第四届DIY达人赛悄然拉开了帷幕。四个心中怀揣梦想的人,因缘际会的聚在了一起。我们挑战自己,突破自己。
面对比赛给出的电子设计、软件开发、网站设计、机械设计、影音特效等选择,爱动手的我们选择了机械设计。决定自己动手制作一台蓝牙小车。

二、设计思路
小车的行走要采用遥控的方法,这就要求小车要具有接收装置----蓝牙设备,用于接受人通过机器发出的指令。
那么用什么来发出指令呢?最初的设想是自己动手制作一个遥控器,但由于时间有限,再加上遥控器制作较为繁琐,而且,我们在上网学习的过程中发现了一款可以向小车发出指令的软件,综合以上三点原因,我们选择了用手机软件向小车发出指令。
接下来要考虑的就是如何将蓝牙接收到的指令转化成小车的运行方式了。我们选择将蓝牙与单片机相连,单片机与驱动相连,蓝牙将收到的信号发送到单片机上,单片机再将信号发送给驱动,由驱动控制小车的运行。
最后要考虑的是供电问题,最初的设想是用干电池给驱动供电,再由驱动输出5V的电压给单片机供电,即集体供电,但实际操做中, 这样会导致实际电流较小,导致车轮无法转动。最终我们选择了用充电宝给51单片机供电,再由单片机给驱动和蓝牙模块供电。

三、原理分析   
用无线串口蓝牙模块HC-06,将接收到的蓝牙信号化为串口信号并通过TXD引脚传出,单片机通过RXD接受蓝牙模块的串口信号,再根据程序输出相应的串口信号。驱动接收单片机发出的串口信号。单片机最小系统通过控制使能端控制小车的运行,使能端的电流的大小决定小车的速度,使能端通过控制小车左右两边的转速差来控制小车的左右转速。

连线:
蓝牙模块:蓝牙模块的TXD接51单片机的P3.0口,RXD接51单片机的P3.1口,其电源接单片机的电源。
电机驱动:8个控制端接51单片机的P0口,驱动PWM使能端连接51单片机的P2.0--P2.3。
51单片机的代码见附录;
原理图;
   





四、制作过程
1、制作前期
小组讨论确定制作目标,一周的时间各自上网寻找相关资料,学习相关知识,及时交流各自寻找到的资料,通过商讨确定网上购买零件的型号。学习单片机编程以及串口设置和烧录软件。
2、制作中期
    (1)、线将小车的基本零件装好
(2)、测试蓝牙
(3)、将程序烧录到单片机中
(4)、将蓝牙、单片机、驱动、电源连接起来
(5)、调试轮子的转动
(6)、安装软件,测试小车
3、制作后期
     (1)、回顾制作历程,总结遇到的困难。
     (2)、总结作品的优点和缺点。
     (3)、展望未来,寻找可以改进的地方。
     (4)、自我总结,总结自己在这次活动中的得失。

五、心得体会
    人多力量大,面对困难,只要齐心协力,各抒己见就一定可以完成。每个人都发表自己的意见,就会有意想不到的发现。
要善于提问,在制作过程中,遇到不懂得地方,我们会在组内商量,会向淘宝客服寻求帮助,而且会去实验室请教师兄。无论是师兄还是客服都十分耐心的教导我们,甚至会时不时的主动询问我们的作品的进展。
世上无难事,只怕有心人。最初选择做蓝牙小车的时候,我们每一个人的心中都充满了不确定,不确定我们是否能做出一辆蓝牙小车。但事实上,我们做到了。在这个过程中我们不仅学会了许多知识,收获了友谊,还明白了只要你去做,只要你努力,一切不可能最终都会变成可能。

六、展望未来
1、优点:采用手机软件控制,与传统遥控器相比,简单便捷,易于操作,经济实惠。
2、缺点:车体外观不够美观;电池电流较低,车速较小。
3、完善方向:改进车架设计,如使用四驱车型外壳;提高电流,提高车速;改善供电方法。














附录
单片机代码
#include <reg51.h>
sbit PWM1 = P2^0;//右后轮电机驱动使能
sbit PWM2 = P2^1;//左后轮电机驱动使能
sbit PWM3 = P2^2;//右前轮电机驱动使能
sbit PWM4 = P2^3;//左前轮电机驱动使能

sbit motor_control_1 = P0^0;//右后轮后退
sbit motor_control_2 = P0^1;//右后轮前进
sbit motor_control_3 = P0^2;//左后轮后退
sbit motor_control_4 = P0^3;//左后轮前进
sbit motor_control_5 = P0^4;//右前轮后退
sbit motor_control_6 = P0^5;//右前轮前进
sbit motor_control_7 = P0^6;//左前轮后退
sbit motor_control_8 = P0^7;//左前轮前进
unsigned char ucBluetoothData = 230;//设置初始速度最大值为255最小为125

unsigned char ucLock = 0;//互斥量,俗称原子锁


unsigned int uiPWMCnt1 = 0;
unsigned int uiPWM1 = 230;
unsigned int uiPWMCnt2 = 0;
unsigned int uiPWM2 = 230;
unsigned int uiPWMCnt3 = 0;
unsigned int uiPWM3 = 230;
unsigned int uiPWMCnt4 = 0;
unsigned int uiPWM4 = 230;

unsigned char ucTempPWM;//设置中间变量



void initial_myself();
void initial_peripheral();
void T0_time();
void usart_service(void);
//void usart_send(unsigned char ucSendData);
void delay_long(unsigned int uiDelayLong);
void go_forward(void);//前进
void fall_back(void);//后退
void turn_left(void);//左转
void turn_right(void);//右转
void stop();//刹车

void main()
{
        initial_myself();
        delay_long(100);
        initial_peripheral();
        while(1)
        {
                usart_service();
               
//                delay_long(500);
               
        
        }

}
//串口服务函数
void usart_service()
{
               
                switch(ucBluetoothData)
                {
                        case 0x04://前进
                                ucBluetoothData = 0x02;//避免一直触发
                                go_forward();
                                ucLock = 1;
                                uiPWM1 = uiPWM2 = uiPWM3 = uiPWM4 = ucTempPWM;
                                ucLock = 0;
                                break;
                        case 0x05://左转
                            ucBluetoothData = 0x02;//避免一直触发
                                turn_left();
                                ucLock = 1;
                                uiPWM2 = uiPWM4= ucTempPWM / 4;
                                uiPWM3 =uiPWM1 = ucTempPWM;
                                ucLock = 0;
                                break;
                        case 0x06://右转
                                ucBluetoothData = 0x02;//避免一直触发
                                turn_right();
                                ucLock = 1;
                                uiPWM2 = uiPWM4 = ucTempPWM;
                                uiPWM3 =uiPWM1 = ucTempPWM / 4;
                                ucLock = 0;
                                break;
                        case 0x07://后退
                                ucBluetoothData = 0x02;//避免一直触发
                                fall_back();
                                ucLock = 1;
                                uiPWM1 = uiPWM2 = uiPWM3 = uiPWM4 = ucTempPWM;
                                ucLock = 0;
                                break;
                        case 0x01:
                                ucBluetoothData = 0x02;//避免一直触发
                                stop();        
                                ucLock = 1;
                                uiPWM1 = uiPWM2 = uiPWM3 = uiPWM4 = ucTempPWM;
                                ucLock = 0;
                                break;
                        case 0x00:
                                ucBluetoothData = 0x02;//避免一直触发
                                stop();
                                ucLock = 1;
                                uiPWM1 = uiPWM2 = uiPWM3 = uiPWM4 = ucTempPWM;
                                ucLock = 0;
                                break;
                        default :
                                break;
        
                }
                delay_long(100);
//                usart_send(ucBluetoothData);
                //速度调节的数据
                if(ucBluetoothData!=0x00&&ucBluetoothData!=0x01 && ucBluetoothData!=0x02 &&  ucBluetoothData!=0x04 && ucBluetoothData!=0x05 && ucBluetoothData!=0x06 && ucBluetoothData!=0x07)
                {
                        ucLock = 1;
                        ucTempPWM = uiPWM1 = uiPWM2 = uiPWM3 = uiPWM4 = ucBluetoothData;
                        ucLock = 0;
                }

}
void T0_time() interrupt 1
{
        TF0 = 0;//清除中断标志
        TR0 = 0;//关定时器
        uiPWMCnt1 ++;
        uiPWMCnt2 ++;
        uiPWMCnt3 ++;
        uiPWMCnt4 ++;
        if(ucLock == 0)
        {
                if(uiPWMCnt1 > 255)
                {
                        uiPWMCnt1 = 0;
                }
                if(uiPWMCnt1 < uiPWM1)
                {
                        PWM1 = 1;
                        
                }
                else
                {
                        PWM1 = 0;
                }
        
                if(uiPWMCnt2 > 255)
                {
                        uiPWMCnt2 = 0;
                }
                if(uiPWMCnt2 < uiPWM2)
                {
                        PWM2 = 1;
                        
                }
                else
                {
                        PWM2 = 0;
                }
        
                if(uiPWMCnt3 > 255)
                {
                        uiPWMCnt3 = 0;
                }
                if(uiPWMCnt3 < uiPWM3)
                {
                        PWM3 = 1;
                        
                }
                else
                {
                        PWM3 = 0;
                }
        
                if(uiPWMCnt4 > 255)
                {
                        uiPWMCnt4 = 0;
                }
                if(uiPWMCnt4 < uiPWM4)
                {
                        PWM4 = 1;
                        
                }
                else
                {
                        PWM4 = 0;
                }
        
        
        }

        TH0 = 0xff;
        TL0 = 0x28;
        TR0 = 1;///开定时器

}

void initial_myself()
{
        TMOD = 0x01;//设置定时器0为工作方式1
        TH0 = 0xff;
        TL0 = 0x28;

        //配置串口
        SCON = 0x50;
        TMOD = 0x21;
        TH1 = TL1 = -(11095200L/12/32/9600);
        IP = 0x10;
        stop();
        PWM1 = 1;
        PWM2 = 1;
        PWM3 = 1;
        PWM4 = 1;

}

void initial_peripheral()
{
        EA = 1;//开总中断
        ES = 1;//允许串口中断
        ET0 = 1;//允许定时器中断
        TR0 = 1;//启动定时器
        TR1 = 1;//
}
void usart_receive(void) interrupt 4
{

        if(RI == 1)
        {
                RI = 0;
                ucBluetoothData = SBUF;
//                uiSendCnt = 0;
        }

        else
        {
                TI = 0;
        }

}
//void usart_send(unsigned char ucSendData)
//{
//        ES = 0;
//        TI = 0;
//        SBUF = ucSendData;
//        TI = 0;
//        ES = 1;
//
//}
void delay_long(unsigned int uiDelayLong)
{
        unsigned int i;
        unsigned int j;
        for(i = 0 ; i < uiDelayLong ; i++)
        {
                for(j = 0; j < 500; j++);
        
        }

}
void stop()//停止
{
        motor_control_1 = 0;
        motor_control_2 = 0;
        motor_control_3 = 0;
        motor_control_4 = 0;
        motor_control_5 = 0;
        motor_control_6 = 0;
        motor_control_7 = 0;
        motor_control_8 = 0;
}
void fall_back()
{
        motor_control_1 = 1;
        motor_control_2 = 0;
        motor_control_3 = 1;
        motor_control_4 = 0;
        motor_control_5 = 1;
        motor_control_6 = 0;
        motor_control_7 = 1;
        motor_control_8 = 0;
}
void go_forward()
{
        motor_control_1 = 0;
        motor_control_2 = 1;
        motor_control_3 = 0;
        motor_control_4 = 1;
        motor_control_5 = 0;
        motor_control_6 = 1;
        motor_control_7 = 0;
        motor_control_8 = 1;
}
void turn_left()//左转
{
        motor_control_1 = 0;
        motor_control_2 = 1;
        motor_control_3 = 0;
        motor_control_4 = 1;
        motor_control_5 = 0;
        motor_control_6 = 1;
        motor_control_7 = 0;
        motor_control_8 = 1;
        
}
void turn_right()//右转
{
        motor_control_1 = 0;
        motor_control_2 = 1;
        motor_control_3 = 0;
        motor_control_4 = 1;
        motor_control_5 = 0;
        motor_control_6 = 1;
        motor_control_7 = 0;
        motor_control_8 = 1;
}
图片1.png

最小系统

最小系统

驱动模块

驱动模块

蓝牙模块

蓝牙模块

电源(充电宝)

电源(充电宝)
图片7.png
图片8.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

284

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
916
金钱
916
注册时间
2015-12-25
在线时间
277 小时
发表于 2016-5-8 22:07:07 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2016-5-8 12:45:36 | 显示全部楼层

不错,要顶。

回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-5-8 12:48:15 | 显示全部楼层
好家伙
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表