沧海笑1122 发表于 2013-12-8 21:29:23

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

本帖最后由 沧海笑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电机驱动正常。

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

#include <Servo.h>
Servo servo1;
//Servo servo2;
int E1 = 11;
int E2 = 10;
int M1_1 = 8;
int M1_2 = 9;
int M2_1 = 6;
int M2_2 = 7;
//int LED = 13;
int buffer;
int Serial_flag;
int date_index=0;
void setup()
{
//pinMode(13,OUTPUT);
servo1.attach(4);//定义舵机控制口
// servo2.attach(10);
Serial.begin(9600);
pinMode(M1_1,OUTPUT);
pinMode(M2_2,OUTPUT);
pinMode(E1,OUTPUT);
pinMode(M2_1,OUTPUT);
pinMode(M2_2,OUTPUT);
pinMode(E2,OUTPUT);
   pinMode(5, OUTPUT); //red
pinMode(12, OUTPUT); //green
}
void Stop(void)
{
digitalWrite(E1,LOW);
digitalWrite(E2,LOW);
}
void advance(int x)
{
analogWrite(E1,x);
digitalWrite(M1_1,LOW);
digitalWrite(M1_2,HIGH);
analogWrite(E2,x);
digitalWrite(M2_1,LOW);
digitalWrite(M2_2,HIGH);
}
void back(int x)
{
analogWrite(E1,x);
digitalWrite(M1_1,HIGH);
digitalWrite(M1_2,LOW);
analogWrite(E2,x);
digitalWrite(M2_1,HIGH);
digitalWrite(M2_2,LOW);
}
void left(int x)
{
digitalWrite(5,LOW);//red flash 200ms -----调试中实际已经闪烁
delay(800);
digitalWrite(5,HIGH);   
analogWrite(E1,x);
digitalWrite(M1_1,LOW);
digitalWrite(M1_2,HIGH);
digitalWrite(12,LOW);//green flash 400ms ---实际已经闪烁,但是M1无响应,这段延时是空白
delay(800);
digitalWrite(12,HIGH);
analogWrite(E2,x);
digitalWrite(M2_1,HIGH);
digitalWrite(M2_2,LOW);
digitalWrite(5,LOW);//red flash 200ms---实际已闪烁,且M2已经驱动。
delay(800);
digitalWrite(5,HIGH);   
}
void right(int x)
{
analogWrite(E1,x);
digitalWrite(M1_1,HIGH);
digitalWrite(M1_2,LOW);
analogWrite(E2,x);
digitalWrite(M2_1,HIGH);
digitalWrite(M2_2,LOW);
}
void Communication_Decode()
{
if(buffer==0x00)
{
    switch(buffer)
    {
      case 0x01:advance(150);return;
      case 0x02:back(150);return;
      case 0x03:right(150);return;
      case 0x04:left(150);return;
      case 0x00:Stop(); return;
    }
}
else if(buffer==0x01)
{
    if(buffer>180)return;
    switch(buffer)
    {
      case 0x01:servo1.write(buffer);return;
    //case 0x02:servo2.write(buffer);return;
      default:return;
    }
}
}
void loop()
{
int temp_char;



while(Serial.available() > 0)
{
    temp_char = Serial.read();
    if(temp_char!=-1)
    {
      
      if(Serial_flag==0)
      {
      if(temp_char==0xff)
      {
          Serial_flag = 1;
      }
      }
      else
      {
      if(temp_char==0xff)
      {
          Serial_flag = 0;
         
          if(date_index==3)
          {
            Communication_Decode();
          }
          date_index = 0;
      }
      else
      {
          buffer=temp_char;
          Serial.println(buffer,HEX);
          date_index++;
      }
      }
    }
}
}

幻生幻灭 发表于 2013-12-9 08:23:42

沧海要做监控小车?
如果是简单的蓝牙控制小车方向?为啥要用字符串,而不是直接的单字符呢?

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

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

沧海笑1122 发表于 2013-12-9 09:54:35

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

沧海笑1122 发表于 2013-12-10 23:47:36

本帖最后由 沧海笑1122 于 2013-12-11 00:15 编辑

已经解决了,是舵机库与PWM调速之间的冲突,论坛中绿林网页兄对此进行过测试,可惜以前没有见到这篇帖子。
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1852
将两个调速Pin避开PWM(关键是避开pin9,10,详见舵机库资料),一切正常,双电机驱动正常。谢谢幻生幻灭兄的支持,以及大家的关注。
页: [1]
查看完整版本: 关于蓝牙arduino小车只能驱动单电机的求助