DIY手机遥控小车

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/cjnewstar111/article/details/52079505

项目背景

大家好,我是小疯。最近一位朋友的孩子在视频网站看到了手机遥控小车,喜欢的不得了,缠着小疯的朋友做一个。可是小疯的朋友早就把这些知识还给大学老师了,哪里做的出来哦。于是来向小疯求助。小疯花了一些时间,动手做了一个手机遥控小车送给朋友的孩子。孩子非常高兴,小疯的朋友也非常的感激。小疯顺便把整个过程详细记录下来,给需要的朋友们做一个参考。

项目成果

         小疯先给大家看看做好后的手机遥控小车的成果。如果你心动了,那就跟着小疯一起DIY吧。下面是腾讯视频中的项目成果。

http://static.video.qq.com/TPout.swf?vid=e0317coesev&auto=0

http://v.qq.com/x/page/e0317coesev.html

项目原理

手机遥控小车最关键的其实是数据的通信。那么目前主流的手机和单片机通信方法其实也就是蓝牙和wifi两种方式。wifi就是通过网络来传输数据,这种方式可以传输比较大的数据量,适合视频啊、音频之类的。而蓝牙相对轻量级一点,一般近距离的传输心灵以及小数据量的传输比较方便。另外就是wifi的配置相对复杂一些,而且还得需要一个无线路由器才能够做数据通信,所以最终小疯选择了蓝牙方式。一方面蓝牙的硬件成本较低,使用简单,比较适合应用于我们的手机遥控小车项目。由于手机自带蓝牙功能,所以手机这边不需要增加硬件。而小车那边需要接受蓝牙,那么需要一个蓝牙模块,小疯选择了蓝牙串口模块,该模块可以将蓝牙数据转换为串口数据和单片机通信,非常的方便单片机接收。下面这张图就是整个手机遥控小车的原理图了。

         另外,我们需要制定以下蓝牙的控制指令。只有约定好了控制指令,单片机才能按照手机的目的,正确的驱动小车运动。比如可以约定“0”表示停止;“1”表示前进等等。为了增强指令的抗干扰性以及后期的扩展,小疯制定了8个字节的指令控制码,具体来说就是:

“00000000”:停止运动

“00010000”:停止前进或者后退

“00020000”:前进

“00030000”:后退

“00040000”:停止左转或者右转

“00050000”:左转

“00060000”:右转

项目材料

了解了项目的原理之后,就可以开始准备材料了。好兴奋哦!我们需要小车底盘一个,某宝上面多的是哦;电池模块(小疯喜欢使用充电宝,容量大,充电快,吼吼);单片机开发板(51、avr、auduino通通都可以啦);电机驱动模块(LM298、911也都可以);蓝牙串口模块(就是用来手机和小车通信的哦!)。下图是小疯使用的原材料。由于小疯之前做过“wifi视频小车的时候”,焊接过一块51单片机和电机驱动的集成板,所以这里就没有再使用单片机开发板加电机驱动模块了,但是编写代码都是一样的。

项目代码

在屡清思路以及准备好材料之后,就可以开始快乐的编程了。首先从简单的单片机编程开始吧。小疯用的是51单片机。蓝牙模块通过串口单片机连接,电机驱动模块通过P3-2、P3-3、P3-4、P3-5四个IO口控制两个电机。总的来说单片机这块的代码还是比较简单的,主要是一个蓝牙的指令接收和执行。这里只贴出主流程代码,详细代码请从后面的“项目资源”中下载。

void main()

{

char szCommd[16]={0};//命令字符串

unsignedint iCommdType =0;  //命令类型

unsignedint iCommdValue =0;//命令值

char cRet =0;

 

UART_INIT();   //串口初始化

CarInit_PWM();//小车控制初始化

CarStop_PWM();//先让小车停止运动

 

while(1)

{

//获取串口传来的命令(蓝牙模块接受到的命令)

while( WaitForChars(8,szCommd)==0);

//从串口命令中解析出命令号

iCommdType = GetCmdType(szCommd);

//根据命令号控制小车运动

switch(iCommdType)

{

//前进命令处理

case   CMD_GO_FORWARD :

CarGoForward_PWM();

break;

//后退命令处理

case   CMD_GO_BACK :

CarGoBack_PWM();

break;

//左转命令处理处理

case CMD_TURN_LEFT:

CarLeft_PWM();

break;

//右转命令处理

case CMD_TURN_RIGHT:

CarRight_PWM();

break;

//停止命令处理

case CMD_STOP_ALL:

CarStop_PWM();

break;

}

}   

}

下面开始编写手机端的代码喽!小疯是个屌丝程序员,一直都没有用过iphone手机,所以下面的代码是小疯编写的android手机操作端,如果是iphone手机的朋友,就只能请大牛来了(吼吼,好凄凉的程序猿!!!)。手机端其实也不复杂,就是判断手机的按键,然后按照事先约定的蓝牙指令发送蓝牙指令就可以了。小疯还是贴出主要流程的代码。

/*触摸屏处理流程*/

@Override

publicboolean onTouchEvent(MotionEvent event)

{

  float PushX = event.getX();

  float PushY = event.getY();

 

  if(event.getAction()==0)//手按下

  {

    //获取当前手指触摸的位置

    m_iBtnPushDetect =

    TouchScreen.PushDetect(

      m_Activity,m_iWhichWidget,

      PushX,

      PushY);

       

    //判断手指触摸的是哪个区域

    switch(m_iBtnPushDetect)

    {

      //前进按钮

      case TouchScreen.PUSH_GO:

        m_Activity.m_BTServer.BTS_SendDates("00020000");

        break;

      //后退按钮

      case TouchScreen.PUSH_BACK:

        m_Activity.m_BTServer.BTS_SendDates("00030000");

        break;

      //左转按钮

      case TouchScreen.PUSH_LEFT:

        m_Activity.m_BTServer.BTS_SendDates("00050000");

        break;

      //右转按钮

      case TouchScreen.PUSH_RIGHT:

        m_Activity.m_BTServer.BTS_SendDates("00060000");

        break;

      //软件信息按钮

      case TouchScreen.PUSH_MOREINFO:

        m_iWhichWidget = WIDGET_MOREINFO;

        break;

      //退出程序按钮

      case TouchScreen.PUSH_EXIT:

        m_iWhichWidget = WIDGET_EXIT;

        break;

    }

  }

  elseif(event.getAction()==1)//手弹开

  {

    m_iBtnPushDetect = TouchScreen.PUSH_NONE;

    m_Activity.m_BTServer.BTS_SendDates("00000000");

    postInvalidate();

  }

  returntrue;

}

 

项目资源

好了,上面就是整个手机遥控小车的DIY过程了。单片机源码以及手机控制app小疯已经放在了百度云盘上面了。有需要的可以下载来试试哦!

http://pan.baidu.com/s/1eR3v51g

解压密码为15158106211

猜你喜欢

转载自blog.csdn.net/cjnewstar111/article/details/52079505