极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9151|回复: 3

关于蓝牙arduino小车只能驱动单电机的求助

[复制链接]
发表于 2013-12-8 21:29:23 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑1122 于 2013-12-10 23:48 编辑

问题:使用蓝牙调试助手专业版(安卓平板),十六进制控制方式。小车只能驱动一只电机,另外一只无反应。hex命令,FF000400FF。。左转。
情况描述:
1、小车部分使用arduino UNO V3,L298电机驱动板,驱动两电机。下位机程序附上,是利用http://www.wifi-robots.com/论坛车友的程序,其中left()中加了两只LED,是为了测试程序运行。
2、上位机,论坛蓝牙控制端程序v1.01,带wifi视频那个版本。
3、我所做的尝试:在单字符方式下双电机控制正常,所以我认为接线及硬件正常。单字符控制程序,使用的arduino pin与HEX规约的完全一样,接线也未改动。
     我将left()函数中,插入了三次LED闪烁,从程序运行看,上位机发来的控制串,下位机已经收到,并且调用了left()函数,LED依次闪烁,明显判断,其中M1电机的
     驱动是空白的,也就是说,该电机未响应。M2电机驱动正常。

请问,应该如何入手检查,请提出宝贵意见,谢谢。

  1. #include <Servo.h>
  2. Servo servo1;
  3. //Servo servo2;
  4. int E1 = 11;
  5. int E2 = 10;
  6. int M1_1 = 8;
  7. int M1_2 = 9;
  8. int M2_1 = 6;
  9. int M2_2 = 7;
  10. //int LED = 13;
  11. int buffer[3];
  12. int Serial_flag;
  13. int date_index=0;
  14. void setup()
  15. {
  16.   //pinMode(13,OUTPUT);
  17.   servo1.attach(4);//定义舵机控制口
  18. // servo2.attach(10);
  19.   Serial.begin(9600);
  20.   pinMode(M1_1,OUTPUT);
  21.   pinMode(M2_2,OUTPUT);
  22.   pinMode(E1,OUTPUT);
  23.   pinMode(M2_1,OUTPUT);
  24.   pinMode(M2_2,OUTPUT);
  25.   pinMode(E2,OUTPUT);
  26.    pinMode(5, OUTPUT); //red
  27.   pinMode(12, OUTPUT); //green
  28. }
  29. void Stop(void)
  30. {
  31.   digitalWrite(E1,LOW);
  32.   digitalWrite(E2,LOW);
  33. }
  34. void advance(int x)
  35. {
  36.   analogWrite(E1,x);
  37.   digitalWrite(M1_1,LOW);
  38.   digitalWrite(M1_2,HIGH);
  39.   analogWrite(E2,x);
  40.   digitalWrite(M2_1,LOW);
  41.   digitalWrite(M2_2,HIGH);
  42. }
  43. void back(int x)
  44. {
  45.   analogWrite(E1,x);
  46.   digitalWrite(M1_1,HIGH);
  47.   digitalWrite(M1_2,LOW);
  48.   analogWrite(E2,x);
  49.   digitalWrite(M2_1,HIGH);
  50.   digitalWrite(M2_2,LOW);
  51. }
  52. void left(int x)
  53. {
  54.   digitalWrite(5,LOW);//red flash 200ms -----调试中实际已经闪烁
  55.   delay(800);
  56.   digitalWrite(5,HIGH);   
  57.   analogWrite(E1,x);
  58.   digitalWrite(M1_1,LOW);
  59.   digitalWrite(M1_2,HIGH);
  60.   digitalWrite(12,LOW);//green flash 400ms ---实际已经闪烁,但是M1无响应,这段延时是空白
  61.   delay(800);
  62.   digitalWrite(12,HIGH);  
  63.   analogWrite(E2,x);
  64.   digitalWrite(M2_1,HIGH);
  65.   digitalWrite(M2_2,LOW);
  66.   digitalWrite(5,LOW);//red flash 200ms---实际已闪烁,且M2已经驱动。
  67.   delay(800);
  68.   digitalWrite(5,HIGH);   
  69. }
  70. void right(int x)
  71. {
  72.   analogWrite(E1,x);
  73.   digitalWrite(M1_1,HIGH);
  74.   digitalWrite(M1_2,LOW);
  75.   analogWrite(E2,x);
  76.   digitalWrite(M2_1,HIGH);
  77.   digitalWrite(M2_2,LOW);
  78. }
  79. void Communication_Decode()
  80. {
  81.   if(buffer[0]==0x00)
  82.   {
  83.     switch(buffer[1])
  84.     {
  85.       case 0x01:advance(150);return;
  86.       case 0x02:back(150);return;
  87.       case 0x03:right(150);return;
  88.       case 0x04:left(150);return;
  89.       case 0x00:Stop(); return;
  90.     }
  91.   }
  92.   else if(buffer[0]==0x01)
  93.   {
  94.     if(buffer[2]>180)return;
  95.     switch(buffer[1])
  96.     {
  97.       case 0x01:servo1.write(buffer[2]);return;
  98.     //  case 0x02:servo2.write(buffer[2]);return;
  99.       default:return;
  100.     }
  101.   }
  102. }
  103. void loop()
  104. {
  105.   int temp_char;
  106.   

  107.   
  108.   while(Serial.available() > 0)
  109.   {
  110.     temp_char = Serial.read();
  111.     if(temp_char!=-1)
  112.     {
  113.       
  114.       if(Serial_flag==0)
  115.       {
  116.         if(temp_char==0xff)
  117.         {
  118.           Serial_flag = 1;
  119.         }
  120.       }
  121.       else
  122.       {
  123.         if(temp_char==0xff)
  124.         {
  125.           Serial_flag = 0;
  126.          
  127.           if(date_index==3)
  128.           {
  129.             Communication_Decode();
  130.           }
  131.           date_index = 0;
  132.         }
  133.         else
  134.         {
  135.           buffer[date_index]=temp_char;
  136.           Serial.println(buffer[date_index],HEX);
  137.           date_index++;
  138.         }
  139.       }
  140.     }
  141.   }
  142. }
复制代码
回复

使用道具 举报

发表于 2013-12-9 08:23:42 | 显示全部楼层
沧海要做监控小车?
如果是简单的蓝牙控制小车方向?为啥要用字符串,而不是直接的单字符呢?

如果可以用简单的单字符控制,可以参考下BOXZ的代码
http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:boxz

如果需要走协议的话,我们最近在测试BOXZ的JSON版本(参考论坛那个AJSON库),过段时间会发布
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-9 09:54:35 | 显示全部楼层
@幻生幻灭兄,我需要蓝牙控制+视频回传(使用703N+uvc摄像头)。上位机部分,安卓编程不熟悉,所以先使用成品控制端程序(控制+视频),该程序提供的是协议通信方式,所以我只能先按照此协议对应改arduino下位机。
使用单字符控制已经试过,小车两路电机工作正常,所以我才纳闷,在接线未改,pin定义不变的情况下,为何有一路电机无法驱动。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-10 23:47:36 | 显示全部楼层
本帖最后由 沧海笑1122 于 2013-12-11 00:15 编辑

已经解决了,是舵机库与PWM调速之间的冲突,论坛中绿林网页兄对此进行过测试,可惜以前没有见到这篇帖子。
http://www.geek-workshop.com/for ... thread&tid=1852
将两个调速Pin避开PWM(关键是避开pin9,10,详见舵机库资料),一切正常,双电机驱动正常。谢谢幻生幻灭兄的支持,以及大家的关注。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 18:27 , Processed in 0.061677 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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