您的位置:首页 > 其它

DIY手机遥控小车

2016-07-31 17:02 183 查看
项目背景

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

 

项目成果

         小疯先给大家看看做好后的手机遥控小车的成果。如果你心动了,那就跟着小疯一起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

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息