• 发文
  • 评论
  • 微博
  • 空间
  • 微信

(喜欢的动动手)Android手机蓝牙遥控赛车

新能源电动汽车 2019-11-05 09:38 发文

声明:本公众号仅做交流学习,不作为商业用途,如有侵权请告知,谢谢!


如果小编一段时间没有更新,

请您不要离开,

小编一定是在寻找资源,

给您呈现更精彩的文章。


本文首发于《无线电》杂志 

        这篇文章已经记不起是13年还是12年,闲着没事,写的一篇玩的,里面附有原理图和程序源码,采用的51单片机,程序也很短,动手能力强的可以做给孩子玩,挺好玩的。压缩包里还有一个APP。不知道现在还能不能装在安卓手机里。排版有点乱,也就不修改了.

    一直都非常喜欢电子,也是无线电的忠实读者,这是我第一次写东西,希望Android手机蓝牙遥控赛车能够给大家带来乐趣。


设计之初

前些时候,我的老师抱了一辆很大的玩具车给我说,你改装改装这辆车,让它能够用电脑键盘的上下左右键来控制它,我就开始找这方面的资料,上位机,以及无线模块NRF24L01,第一次用NRF24L01最后折腾了一星期,没有眉目,就放弃了,无意中找到了蓝牙模块,通过将近两周的摸索,将老师那辆车改装好了,改好之后想到,要是有一款手机上的软件来控制赛车那就更好了,这样玩起来感觉会更爽,所以我就又在淘宝上花几十块钱买了辆玩具车。因为水平有限,手机端的控制软件不会编写,也是无意中发现360手机助手上有这么一款免费软件,蓝牙小车,所以我就拿这个软件来作为控制软件。

赛车以及内部(内部比较混乱,纯手工的,大家将就着看吧)



功能描述

赛车不仅可以用触屏来控制赛车的前后左右运动,还可以通过手机的重力感应来控制,以前我们用手机玩赛车游戏,而现在通过玩重力感应蓝牙遥控赛车有种让我们身临其境的感觉,并且原来车上自带的遥控器电路我没有拆除,既可以用手机控制又可以用遥控器控制。

结构设计

蓝牙遥控赛车主要用到一下器件:

器件

数量

安卓智能手机

一部

360手机助手里面的蓝牙小车软件

一个

蓝牙接收模块(HC-06)

一块

51单片机最小系统

一块

直流电机驱动(L298)

一块

玩具车模型

一辆

在这些器件中,电机驱动大家可以选择自己手头有的驱动模块,自己焊接的时候一定考虑好驱动和单片机用同一电源的干扰,51最小系统可以自己焊接,不需要串口,玩具车模型尽量大一点,方便把这些模块放在里面,玩具车前面必须可以转向的,并且最好是带锂电池,这样方便供电,蓝牙模块如图一和图二


图一HC-06(正面)


图二(反面)

淘宝上有好多,大家可以自己选择。在蓝牙小车软件中有刹车,加速,减速,四个方向键,以及点击功能键的时候有三个选择键,打开重力感应,关闭重力感应,连接小车。

 

蓝牙小车软件使用方法:(图三、四、五、六)

1:给蓝牙接收模块供电,打开手机蓝牙并且扫描设备进行配对;

2:配对成功后,打开蓝牙小车软件选择连接小车,配对成功就可以操作了。

3:选择打开重力感应,这样我们就能用重力感应来控制小车了。


图三


图四


图五


图六

 

51单片机最小系统电路图(图七),L298驱动电路图(图八),网上有很多,大家可以参考我的也可以参考网上的,有条件的话,可以自己制作一个PCB板这样能节省很多空间,驱动电路最小系统连接好后,再将蓝牙模块与单片机连接就行了,蓝牙模块RXD接单片机TXD口,蓝牙模块TXD接单片机RXD口,这样整个蓝牙赛车的硬件就搭建完毕,下面我将程序给大家,我的程序里面没有将加速和减速写进去,所以软件的加速和减速键是不能用的,如果想用的话自己再加到程序里面

图七

图八


程序设计

#include<reg52.h>

#include<math.h>

#define uchar unsigned char

#define uint unsigned int

uchar Buffer[10] = {1}; //从串口接收的数据

uint i,j;

sbit en1=P2^4; /* L298的Enable A */

sbit en2=P2^5; /* L298的Enable B */

sbit s1=P2^0; /* L298的Input 1 */

sbit s2=P2^1; /* L298的Input 2 */

sbit s3=P2^2; /* L298的Input 3 */

sbit s4=P2^3; /* L298的Input 4 */

uchar t=0; /* 中断计数器 */

uchar m1=0; /* 电机1速度值 */

uchar m2=0; /* 电机2速度值 */

uchar tmp1,tmp2; /* 电机当前速度值 */

/********************************************************************

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

***********************************************************************/

void Delay_1ms(uint i)//1ms延时

{

uchar x,j;

for(j=0;j<i;j++)

for(x=0;x<=148;x++);

}

/********************************************************************

* 名称 : Init()

* 功能 : 初始化,晶振11.0592,波特率9600,使串口中断,同时定时器0控制PWM

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Init(void)

{

TMOD = 0x22;

PCON = 0x00;

SCON = 0x50;

TH0=0x9b;

TL0=0x9b;

TH1 = 0xFd; //设置波特率 9600

TL1 = 0xFd;

TR1 = 1; //启动定时器1

ET0=1;

TR0=1;

ES = 1; //开串口中断

EA = 1; //开总中断

}

void motorL( char speed)

{

   m1=abs(speed); /* 取速度的绝对值 */

        if(speed>0)

                  {

s1=0;

                  s2=1;

                    }

     else

              {

s1=1;

                   s2=0;

                    } 

}

void motorR( char speed)

{

 

         m2=abs(speed); /* 电机2的速度控制 */

         if(speed>0)

                 {

s3=0;

                  s4=1;

                    }

         else

                    {     

s3=1;

                            s4=0;

                    } 

}

void GO(void)

{

         {

    motorL(100);

         motorR(100);

         }

}

void BACK()

{

          {

    motorL(-100);

         motorR(-100);

          }

}

void TR(void)

{       

          {

         motorL(-20);

         motorR(20);

     }

}

void TL(void)

{       

   {

         motorL(20);

         motorR(-20);

   }

}

 

void STOP(void)

{

   {

         s1=1;

         s2=1;

         s3=1;

         s4=1;

         }

}

void main()

{

         Delay_1ms(100);

         Init();//初始化

         while(1)

         {

                   switch(Buffer[0])

                   {

                   case 1:STOP(); break;        //

                   case 4:GO(); break; 

                   case 5:TL(); break;  //

                   case 7:BACK();break;//

                   case 6:TR();  break;  //

                   default:break;

                   }

         }

}

void Com_Int(void) interrupt 4

{

         EA = 0;

         if(RI == 1) //当硬件接收到一个数据时,RI会置位

         {

                   Buffer[0] =SBUF - 0;

                   RI = 0;

         }

         EA = 1;

}

void timer0() interrupt 1 /* T0中断服务程序 */

{

         if(t==0) /* 1个PWM周期完成后才会接受新数值 */

         {       tmp1=m1;

                   tmp2=m2;

         }

         if(t<tmp1) en1=1;else en1=0; /* 产生电机1的PWM信号 */

         if(t<tmp2) en2=1;else en2=0; /* 产生电机2的PWM信号 */

         t++;

         if(t>=100) t=0; /*1个PWM信号由100次中断产生 */

}                                   

结束语

Android手机蓝牙遥控赛车硬件和软件都不算太难,制作下来成本也不贵,如果有现成的玩具车,50块钱就能搞定,但是可玩性比较高,有人会问有遥控器用着,干嘛非要拿着手机玩,但我想说的是我们喜爱电子,通过DIY,我们喜欢这种成功的乐趣。我也希望更多爱好者能改进,使可玩性进一步提高。我则希望有做软件的将蓝牙小车这个软件在进行改进,现在这个软件点一下前进按纽就一直前进,如果点一下就能动一下,手离开屏幕小车就停止,这样体验会更好一些。如果谁有同样的软件只需要将主函数里面的switch语句和Buffer[0] = SBUF - 0; 稍微修改就能用自己的软件来控制,希望能给爱好者们带来乐趣。


关注本公众号将得到各系列车型电控电机拆解报告的PDF文档

转发并回复:“电控”将得到宝马、奥迪、特斯拉等拆解报告的PDF文档

转发并回复:“功能安全”将得到功能安全相关资料

转发并回复:“成本分析”将得到多家电机电控的成本分析报告

转发并回复:“蓝牙赛车”将得到本文相关程序源码和app安装包


未完待续……




声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    新能源电动汽车

    新能源国内外电机、电控、DCDC...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码