小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 8515|回复: 15

手机能收到视频,但是控制不了小车。

[复制链接]
发表于 2013-6-30 17:03:32 | 显示全部楼层 |阅读模式

求好心人帮忙,第一次搞单片机,刚入门,不想第一次尝试就失败,太打击了。如果有偿帮忙的话也可以站内信联系我。


历经1星期把车组好,刷好路由器(刷的也是论坛上弄好的3点多M那个系统,wifi连上可以看到视频了)

如果用串口直接连,然后发送1,2,3,4等可以控制小车前句后退了。

但是如果用 安卓控制端(WIFIRobotV1.05_for_Android2.3.3)连上wif后发送前进后退什么的都没反应。

把手机端的前进改成1,然后用手机点了下前进发送,用STL的串口助手收到的是01 00 FF 00 00 FF,
改成2,就变成 02 00 FF 00 00 FF

我就发现应该是下位机代码和上位机(手机)不匹配的问题。

然后在论坛找了1个同样问题的哥们发的贴子,他给出了他的上位机手机端和下位机代码,刷进去。

发现接到开发板上后按前进后退能控制相应的灯,

但是用手机只能控制我小车的1个车灯了,其他依旧没反应。

求大家帮忙看看,或者求一套 安卓上位机 和 配对的下位机代码


========== 基本配置 =============

2个电机 接 一个L298N驱动板 然后接 51最小系统,再通过LM1117-5V稳压,用4节干电池供电

1个703N路由 的USB接摄像头,TTL接51最小系统,用移动电源供电(输出5v,1A)

最小系统里面刷的也是论坛上的代码 pwm.c

==========

搜索了1天,了解到有2种通信协议:
1.单字符 2.通信包的

是不是我的51只能支持单字符的。跪求一个单字符的安卓上位机,论坛里面的附件全部不能下载了。我的邮箱wsxzh@qq.com。如果有对应的单字符下位机代码也顺便发给我

回复

使用道具 举报

 楼主| 发表于 2013-6-30 17:09:27 | 显示全部楼层
我的小车就只需要 前进后退停止功能,没舵机没其他东西,摄像头已经搞定了。
就差最后1步控制了。
用串口连小车发送1就能控制小车了。
但为什么用wifi连上就不能了,上位机安卓端的问题?
回复 支持 反对

使用道具 举报

发表于 2013-6-30 17:12:18 | 显示全部楼层
代码发一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-30 17:16:21 | 显示全部楼层
liuviking 发表于 2013-6-30 17:12
代码发一下。
  1. #include<reg52.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar Buffer[4] = {0};      //从串口接收的数据
  6. uint i,j;
  7. sbit LeftLight=P2^1;
  8. sbit RightLight=P2^2;

  9. /********************************************************************
  10. * 名称 : Delay_1ms()
  11. * 功能 : 延时子程序,延时时间为 1ms * x
  12. * 输入 : x (延时一毫秒的个数)
  13. * 输出 : 无
  14. ***********************************************************************/
  15. void Delay_1ms(uint i)//1ms延时
  16. {
  17.         uchar x,j;
  18.         for(j=0;j<i;j++)
  19.         for(x=0;x<=148;x++);       
  20. }
  21. /********************************************************************
  22. * 名称 : Com_Int()
  23. * 功能 : 串口中断子函数
  24. * 输入 : 无
  25. * 输出 : 无
  26. ***********************************************************************/
  27. void Com_Int(void) interrupt 4
  28. {
  29.        
  30.         EA = 0;
  31.         if(RI == 1)   //当硬件接收到一个数据时,RI会置位
  32.         {
  33.                 Buffer[0] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
  34.                 RI = 0;  
  35.                
  36.         }
  37.         EA = 1;
  38. }

  39. /********************************************************************
  40. * 名称 : Com_Init()
  41. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
  42. * 输入 : 无
  43. * 输出 : 无
  44. ***********************************************************************/
  45. void Com_Init(void)
  46. {
  47.      TMOD = 0x20;
  48.      PCON = 0x00;
  49.      SCON = 0x50;                       
  50.      TH1 = 0xFd;    //设置波特率 9600
  51.      TL1 = 0xFd;
  52.      TR1 = 1;                //启动定时器1
  53.          ES = 1;                //开串口中断
  54.          EA = 1;                //开总中断               
  55. }
  56. /********************************************************************
  57. * 名称 :Moto_Forward()
  58. * 功能 : 电机1、2启动,都是前进,整车表现为前进。
  59. * 输入 : 无
  60. * 输出 : 无
  61. ***********************************************************************/
  62. void Moto_Forward()
  63. {  
  64.    
  65.            P1= 0x06;

  66.    Delay_1ms(100);

  67. }

  68. /********************************************************************
  69. * 名称 :Moto_Backward()
  70. * 功能 : 电机1、2启动,都是后退,整车表现为后退。
  71. * 输入 : 无
  72. * 输出 : 无
  73. ***********************************************************************/
  74. void Moto_Backward()
  75. {
  76.    
  77.     P1= 0x05;
  78.          Delay_1ms(100);
  79. }

  80. /********************************************************************
  81. * 名称 :Moto_TurnLeft()
  82. * 功能 : 电机1后退,电机2前进,整车表现为左转。
  83. * 输入 : 无
  84. * 输出 : 无
  85. ***********************************************************************/
  86. void Moto_TurnLeft()
  87. {         
  88.           P1= 0x09;
  89.          Delay_1ms(100);
  90. }
  91. /********************************************************************
  92. * 名称 :Moto_TurnRight()
  93. * 功能 : 电机1前进,电机2后退,整车表现为右转。
  94. * 输入 : 无
  95. * 输出 : 无
  96. ***********************************************************************/
  97. void Moto_TurnRight()
  98. {         
  99.          P1= 0x0A;
  100.          
  101.          Delay_1ms(100);
  102. }
  103. /********************************************************************
  104. * 名称 :Moto_Stop()
  105. * 功能 : 电机1停止,电机2停止,整车表现为停止。
  106. * 输入 : 无
  107. * 输出 : 无
  108. ***********************************************************************/
  109. void Moto_Stop()
  110. {         
  111.          
  112.           P1= 0x00;
  113.    Delay_1ms(100);
  114. }
  115. /********************************************************************
  116. * 名称 :LightTurnOn()
  117. * 功能 : 打开车灯。
  118. * 输入 : 无
  119. * 输出 : 无
  120. ***********************************************************************/
  121. void LightTurnOn()
  122. {         
  123.          
  124.            
  125.    LeftLight=0;   
  126.    RightLight=0;
  127.        
  128. }

  129. /********************************************************************
  130. * 名称 :LightTurnOff()
  131. * 功能 : 关闭车灯。
  132. * 输入 : 无
  133. * 输出 : 无
  134. ***********************************************************************/
  135. void LightTurnOff()
  136. {         
  137.          
  138.    LeftLight=1;   
  139.    RightLight=1;
  140.        
  141. }
  142. void main()
  143. {
  144.     Delay_1ms(100);
  145.         Com_Init();//串口初始化
  146.   
  147.   
  148.   while(1)
  149.   {
  150.          switch(Buffer[0])
  151.            {
  152.              case 0:  Moto_Stop(); break;
  153.                     case 1:  Moto_Forward(); break;
  154.                  case 2:  Moto_Backward();        break;
  155.                  case 3:  Moto_TurnLeft();         break;
  156.                  case 4:  Moto_TurnRight();          break;
  157.                  case 8:  LightTurnOn();  break;
  158.                  case 9:  LightTurnOff();  break;
  159.                  default:break;         
  160.            }
  161.           
  162.   }
  163. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-6-30 17:22:24 | 显示全部楼层
那么上位机发出来的指令是怎样的?用串口助手接一下,我看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-30 17:23:57 | 显示全部楼层
liuviking 发表于 2013-6-30 17:22
那么上位机发出来的指令是怎样的?用串口助手接一下,我看看。

我现在在外面,车子不在身边,等下回去发给你,不好意思。
回复 支持 反对

使用道具 举报

发表于 2013-7-1 12:26:00 | 显示全部楼层
应该是上位机和下位机通讯协议都不一样,最好是把下位机的改下和上位机一样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-3 00:20:54 | 显示全部楼层
liuviking 发表于 2013-6-30 17:22
那么上位机发出来的指令是怎样的?用串口助手接一下,我看看。

king哥。已经搞定了。是干电池供电不住,我换了锂电池就好使了。

你帮我看下代码。这个是我现在用的下位机代码,在论坛上找的。

有1个看不懂的就是那个 向上位机传送字符 void Send_Data(uchar data type,uchar data cmd)

这个函数是不是可以去掉。我用的是tp-link 703N路由,单片机好像不需要发数据给上位机吧?
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uint i=0,j=0,x=0;
  7. uchar data Tempdatatable[4],CommandDatatable[4];//数据包
  8. uint URTAReceivedCount=0,n=1;
  9. //uchar flag=0;
  10. uchar Buffer =0;          //从串口接收的数据

  11. /******************************************************************
  12.                                                  直流电机管脚配置
  13. ******************************************************************/
  14. sbit IN1=P1^0;
  15. sbit IN2=P1^1;
  16. sbit IN3=P1^2;
  17. sbit IN4=P1^3;

  18. sbit Buzzle=P1^4; //蜂鸣器
  19. sbit MainLight1=P1^5; //主大灯
  20. sbit MainLight2=P1^6; //主大灯
  21. sbit MainLight3=P1^7; //主大灯


  22. void Delay_1ms(uint i)//1ms延时
  23. {
  24.         uchar x,j;
  25.         for(j=0;j<i;j++)
  26.         for(x=0;x<=148;x++);
  27. }

  28. /********************************************************************
  29.                                                                 前进
  30. ***********************************************************************/
  31. void Moto_Forward()
  32. {
  33.         IN1 = 1;
  34.         IN2 = 0;
  35.         IN3 = 1;
  36.         IN4 = 0;
  37.         Delay_1ms(100);

  38. }
  39. /********************************************************************
  40.                                                                 后退
  41. ***********************************************************************/
  42. void Moto_Backward()
  43. {  
  44.         IN1 = 0;
  45.         IN2 = 1;
  46.         IN3 = 0;
  47.         IN4 = 1;
  48.         Delay_1ms(100);
  49. }
  50. /********************************************************************
  51.                                                                 左转
  52. ***********************************************************************/
  53. void Moto_TurnLeft()
  54. {
  55.         IN1 = 1;
  56.         IN2 = 0;
  57.         IN3 = 0;
  58.         IN4 = 1;
  59.         Delay_1ms(50);

  60. }
  61. /********************************************************************
  62.                                                                 右转
  63. ***********************************************************************/
  64. void Moto_TurnRight()
  65. {
  66.         IN1 = 0;
  67.         IN2 = 1;
  68.         IN3 = 1;
  69.         IN4 = 0;
  70.         Delay_1ms(50);
  71. }
  72. /********************************************************************
  73.                                                                 停止
  74. ***********************************************************************/
  75. void Moto_Stop()
  76. {
  77.         IN1 = 0;
  78.         IN2 = 0;
  79.         IN3 = 0;
  80.         IN4 = 0;
  81.         Delay_1ms(100);
  82. }
  83. /********************************************************************
  84.                                                                 前左转
  85. ***********************************************************************/
  86. void qianzuo()
  87. {
  88.         IN1 = 1;
  89.         IN2 = 0;
  90.         IN3 = 0;
  91.         IN4 = 0;
  92.         Delay_1ms(100);
  93. }
  94. /********************************************************************
  95.                                                                 前右转
  96. ***********************************************************************/
  97. void qianyou()
  98. {
  99.         IN1 = 0;
  100.         IN2 = 0;
  101.         IN3 = 1;
  102.         IN4 = 0;
  103.         Delay_1ms(100);
  104. }
  105. /********************************************************************
  106.                                                                 后左转
  107. ***********************************************************************/
  108. void houzuo()
  109. {
  110.         IN1 = 0;
  111.         IN2 = 1;
  112.         IN3 = 0;
  113.         IN4 = 0;
  114.         Delay_1ms(100);
  115. }
  116. /********************************************************************
  117.                                                                 后右转
  118. ***********************************************************************/
  119. void houyou()
  120. {
  121.         IN1 = 0;
  122.         IN2 = 0;
  123.         IN3 = 0;
  124.         IN4 = 1;
  125.         Delay_1ms(100);
  126. }



  127. /********************************************************************
  128.                                                 向上位机传送字符
  129. ***********************************************************************/
  130. void Send_Data(uchar data type,uchar data cmd)
  131. {
  132.         uchar data Buffer[4];           //构建数据包
  133.         uchar *p;
  134.         uint Send_Count=0;
  135.         p = Buffer;
  136.         Buffer[0]=0XFF;
  137.         Buffer[1]=type;
  138.         Buffer[2]=cmd;
  139.         Buffer[3]=0XFF;
  140.      
  141.         while(1)
  142.         {
  143.                 if(*p==0XFF)
  144.                 {
  145.                         Send_Count++;  //0XFF标志统计位
  146.                 }
  147.                 SBUF = *p;  //发送
  148.                 while(!TI)  //如果发送完毕,硬件会置位TI=1,等待发送完毕
  149.                 {
  150.                         nop_();    //延迟
  151.                 }
  152.                 p++;
  153.                 TI = 0;
  154.                 if(Send_Count == 2)  //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环
  155.                 {
  156.                         TI = 0;
  157.                         break;   
  158.                 }     
  159.         }
  160. }

  161. /********************************************************************
  162.                                                  串口中断子函数
  163. ***********************************************************************/
  164. void Com_Int(void) interrupt 4
  165. {
  166.         uchar temp;
  167.         ES=0; //关串口中断(上位机按下键就会产生中断,此时接受到中断后,就关闭中断,防止同时按下其他键,即一次只能处理1个动作)
  168.     RI=0; //软件清除接收中断
  169.         temp=SBUF;
  170.         if(temp==0XFF && URTAReceivedCount<2)
  171.         {
  172.                 Tempdatatable[0]==0XFF;  //包头
  173.                 URTAReceivedCount++;
  174.         }
  175.         else
  176.         {
  177.                 Tempdatatable[n]=temp;
  178.                 n++;   
  179.         }
  180.         if(URTAReceivedCount==2)//包尾
  181.         {
  182.                 Tempdatatable[0]=0XFF;
  183.                 Tempdatatable[3]=0XFF;
  184.                 n=1;
  185.                 URTAReceivedCount=0;  //组包完毕
  186.                 temp="";
  187.   //Send_Data(Tempdatatable[1],Tempdatatable[2]);  //发送组成的数据包回去
  188.         }
  189.         CommandDatatable[0]=Tempdatatable[0];
  190.         CommandDatatable[1]=Tempdatatable[1];
  191.         CommandDatatable[2]=Tempdatatable[2];
  192.         CommandDatatable[3]=Tempdatatable[3];
  193.         ES=1;//开串口中断
  194. }
  195. /********************************************************************
  196.                          串口初始化,晶振11.0592,波特率9600,使能串口中断
  197. ***********************************************************************/
  198. void Com_Init(void)
  199. {
  200.         TMOD = 0x21;
  201.         PCON = 0x00;
  202.         SCON = 0x50;   
  203.         TH1 = 0xFd;    //设置波特率 9600
  204.         TL1 = 0xFd;
  205.         TR1 = 1;  //启动定时器1
  206.   
  207.         ES = 1;  //开串口中断
  208.         EA = 1;  //开总中断
  209.         IT0=0;
  210.         EX0=1;
  211.         }
  212. /********************************************************************
  213. 协议规定:
  214. 包头  类型位  命令位   数据位    结束位
  215. 0XFF   0X00    0X00     0X00      0XFF
  216. 各命令说明:
  217. 类型位    命令位     数据位   功能
  218. 0X00       0X01       0X00    前进
  219. 0X00       0X02       0X00    后退
  220. 0X00       0X03       0X00    左转
  221. 0X00       0X04       0X00    右转
  222. 0X00       0X00       0X00    停止
  223. 0X01       0X02       0X79    上
  224. 0X01       0X02       0X7B    下
  225. 0X01       0X01       0X60    左
  226. 0X01       0X01       0X5E    右
  227. 0X02       0X01       0X00    车灯亮
  228. 0X02       0X00       0X00    车灯灭
  229. ***********************************************************************/
  230. void yunxing(void)
  231. {
  232.         if(CommandDatatable[0]==0XFF && CommandDatatable[3]==0XFF)
  233.                 {  
  234.                         switch (CommandDatatable[1])                          //根据键值不同,执行不同的内容
  235.                         {
  236.                                 case 0X00:  //类型位0X00,表明是直流电机数据包,进入控制直流电机caes   
  237.                                                         switch(CommandDatatable[2])                //根据数据位的值来进行选择执行不同的动作
  238.                                                         {
  239.                                                                 case 0X00:Moto_Stop();break;
  240.                                 case 0X01:Moto_Forward();break;     
  241.                                                                 case 0X02:Moto_Backward();break;         
  242.                                 case 0X03:Moto_TurnLeft();break;            
  243.                                        case 0X04:Moto_TurnRight();break;
  244.                             }         
  245.                                 break;
  246.                                                                                                                                                               
  247.                                 case 0X01:  //类型位0X01,表明是数据包,进入转向case  
  248.                                                         switch(CommandDatatable[2])
  249.                                                         {
  250.                                                                 case 0X01:  //命令位0x01,左右运动                                           
  251.                                                                                         switch(CommandDatatable[3])
  252.                                                                                  {
  253.                                                                                                 case 0X60:qianzuo();break;
  254.                                                                                                 case 0X5e:qianyou(); break;                                         
  255.                                                                                       }
  256.                                             break;                  
  257.                                                                 case 0X02:        //命令位0x02,上下运动
  258.                                                                                         switch(CommandDatatable[3])
  259.                                                                                         {
  260.                                                                                                 case 0X79:houzuo();break;                                                       
  261.                                                             case 0X7b:houyou(); break;                        
  262.                                                                                         }
  263.                                              break;
  264.                                                         }
  265.                                 break;
  266.                                 case 0X02:  //类型位0X02,表明是大灯数据包,进入大灯case
  267.                                                         switch(CommandDatatable[2])
  268.                                                         {
  269.                                                       case 0X01:Buzzle=0;MainLight1=0;MainLight2=0;MainLight3=0;break;
  270.                                                        case 0X00:Buzzle=1;MainLight1=1;MainLight2=1;MainLight3=1;break;
  271.                                                }
  272.                        break;                                                 
  273.                  default :  /*TR0=0;TR2=0;*/ break;            
  274.                         }
  275.                 }
  276. }
  277. void main()
  278. {   
  279.         Delay_1ms(200);
  280.         Com_Init();//串口初始化
  281.         Moto_Stop();
  282.         while(1)
  283.           {
  284.         yunxing();       
  285.         }
  286. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-3 00:28:57 | 显示全部楼层
本帖最后由 wsxzh 于 2013-7-3 00:30 编辑
liuviking 发表于 2013-6-30 17:22
那么上位机发出来的指令是怎样的?用串口助手接一下,我看看。

补充下,旧代码在4楼(地板),新代码在8楼。

新代码比就代码多了的东西有:
void Send_Data(uchar data type,uchar data cmd)//向上位机传送字符
void yunxing(void)

我想问下旧代码和新代码的区别?一个是单字符发送,一个是信号发送?
是不是可以用旧的代码。新的代码多出来这2个函数看不懂。
我的小车的硬件环境在1楼有提到,提点我一下。谢谢你了。
回复 支持 反对

使用道具 举报

发表于 2013-7-3 10:11:22 | 显示全部楼层
1、数据发回上位机这个是测试用的,可以去掉。
2、旧代码是使用ASCII字符来作为命令,新代码是用数据包作为命令。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-5-16 05:45 , Processed in 1.079464 second(s), 18 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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