swfzz 发表于 2014-1-5 19:52:19

蓝牙小车代码求助!

各位,大神以下代码,用手机的蓝牙串口和电脑的串口都一样,Q 和E键都没有任何反应!然后A,D都是向一边转,请各位给看一下代码哪里的问题?
请无视中代码中的中文部分

char val;
int pwm1=9;
int pwm2=10;
int en1=5;
int pwm3=11;
int pwm4=12;
int en2=6;
void setup()
{
Serial.begin(9600);//初始化蓝牙
pinMode(pwm1,OUTPUT);//定义该接口为输出接口
pinMode(pwm2,OUTPUT);


pinMode(pwm3,OUTPUT);//定义该接口为输出接口
pinMode(pwm4,OUTPUT);
}



void loop()
{

val=Serial.read();
//前进部分代码
if(val=='w')
{
   analogWrite(pwm1,240);//输入模拟值进行设定速度
      delay(20);
      analogWrite(pwm2,LOW);//使直流电机顺时针转

      analogWrite(pwm3,240);
      delay(20);
      analogWrite(pwm4,LOW);
//backup
}else if(val=='s'){
   analogWrite(pwm2,240);//输入模拟值进行设定速度
delay(20);
analogWrite(pwm1,LOW);//使直流电机n时针转

analogWrite(pwm4,240);
delay(20);
analogWrite(pwm3,LOW);

}

//left   
elseif(val=='a')   {
   analogWrite(pwm1,60);
delay(20);
   analogWrite(pwm2,LOW);
delay(20);
   

    analogWrite(pwm3,240);
delay(20);
    analogWrite(pwm4,LOW);
//right
}else if(val=='d'){
    analogWrite(pwm1,240);//输入模拟值进行设定速度
delay(20);
analogWrite(pwm2,LOW);//使直流电机顺时针转


delay(20);
analogWrite(pwm3,60);
delay(20);
analogWrite(pwm4,LOW);
//xindi left
}else if(val=='q'){
    analogWrite(pwm1,LOW);//输入模拟值进行设定速度
delay(20);
analogWrite(pwm2,100);//使直流电机顺时针转


delay(20);
analogWrite(pwm3,240);
delay(20);
analogWrite(pwm4,LOW);
}
// xindiright
       else if(val=='e'){
    analogWrite(pwm1,240);//输入模拟值进行设定速度
delay(20);
analogWrite(pwm2,LOW);//使直流电机顺时针转


delay(20);
analogWrite(pwm3,LOW);
delay(20);
analogWrite(pwm4,100);
}
//stop
else {
   analogWrite(pwm1,LOW);//输入模拟值进行设定速度
delay(20);
analogWrite(pwm2,LOW);//使直流电机顺时针转

analogWrite(pwm3,LOW);
delay(20);
analogWrite(pwm4,LOW);

}

}

沧海笑1122 发表于 2014-1-6 14:09:14

本帖最后由 沧海笑1122 于 2014-1-6 14:22 编辑

1、用的什么电机驱动板,接线示意图,包括驱动板上的跳线,+5V怎么提供的,都说明一下,才好判断。
2、建议程序重新写,前后左右几个动作单独定义成函数,然后在主程序中调用,这样看起来直观,也容易判断问题。IF嵌套太多,又没有好的缩进习惯,容易出现逻辑错误,还不好判断。
3、建议先不要接电机驱动板,可以用四只LED,对你定义的四个端子的输出进行检验,然后再带电机驱动板。问题一步步查。以分辨是电机驱动板的问题,还是程序的问题,直觉是程序的问题。
4、习惯问题,如果你的端口足够,用EN1,2调速可能更加直观(你的EN1,2虽然定义了,但没使用,可见不是端口资源问题,而是你直接引用别人的代码,自己又做了修改,可能会有冲突),另外两对端子控制电机正反转即可。这个每个人习惯不同,我习惯这么写。

swfzz 发表于 2014-1-6 15:01:28

谢谢回复:
1,用的什么飞思卡尔的驱动板,本来是MEGA2560供的电,但是这样不行小车就一个劲的叫,不动的,然后弄了个降低模块,降到5V,拖了两个头一个接2560板,一个接驱动板。
2,程序嘛,目前就是随便写一下的(菜鸟),有打算定义成函数,另请问“IF嵌套太多,又没有好的缩进习惯,容易出现逻辑错误,还不好判断。”这个怎么理解?
3,这个我有点不明白,理论上来说,我定义W,S,A,D,Q,W要么都不能动,应该不会其它能动就Q,W不能动吧?
4,卖板子的说,EN1,EN2,就一使能功能,控制的话,就我程序里那个,程序就开始套了个模式,后面都自己写的(不然就不会这么弱了),电机应该无非就是个正反转的问题?线一开始我就反接过了!

沧海笑1122 发表于 2014-1-6 16:14:44

1、飞思卡尔没用过,调速有两种方法,一种是EN调速,这样比较清晰,一种是直接在端子上调,我感觉你的代码有混起来的感觉。关于飞思卡尔,因为没用过,所以不好给你更多建议,建议你看店家提供的数据表。
2、“IF嵌套太多,又没有好的缩进习惯,容易出现逻辑错误,还不好判断。”这段话的意思是,你对控制指令的判断,是用一连串IF---ELSE---ENDIF的嵌套完成的,但是没有缩进,不易看出层次,检查起来很不方便。
希望能帮到你。

沧海笑1122 发表于 2014-1-6 16:33:02

本帖最后由 沧海笑1122 于 2014-1-6 16:34 编辑

这是一个蓝牙车的代码,你可以借鉴一下。基于L298的驱动板。//Arduino蓝牙遥控可编程智能车程序:
//*******************************
int MotorRight1=8;
int MotorRight2=9;
int MotorLeft1=10;
int MotorLeft2=11;


void setup()
{
Serial.begin(9600);
pinMode(MotorRight1, OUTPUT);// PIN 8 (PWM)
pinMode(MotorRight2, OUTPUT);// PIN 9 (PWM)
pinMode(MotorLeft1,OUTPUT);// PIN 10 (PWM)
pinMode(MotorLeft2,OUTPUT);// PIN 11 (PWM)
}

void go()// 前进
{
      digitalWrite(MotorRight1,LOW);
      digitalWrite(MotorRight2,HIGH);
      digitalWrite(MotorLeft1,LOW);
      digitalWrite(MotorLeft2,HIGH);
      
}

void left() //右转
{
      digitalWrite(MotorRight1,HIGH);
      digitalWrite(MotorRight2,LOW);
      digitalWrite(MotorLeft1,LOW);
      digitalWrite(MotorLeft2,HIGH);

}
void right() //左转
{
      digitalWrite(MotorRight1,LOW);
      digitalWrite(MotorRight2,HIGH);
      digitalWrite(MotorLeft1,HIGH);
      digitalWrite(MotorLeft2,LOW);
   
}
void stop() //停止
{
   digitalWrite(MotorRight1,LOW);
   digitalWrite(MotorRight2,LOW);
   digitalWrite(MotorLeft1,LOW);
   digitalWrite(MotorLeft2,LOW);
   
}
void back() //后退
{
      digitalWrite(MotorRight1,HIGH);
      digitalWrite(MotorRight2,LOW);
      digitalWrite(MotorLeft1,HIGH);
      digitalWrite(MotorLeft2,LOW);;
      
}
      
void loop()
{
char val = Serial.read();
Serial.write(val);
if (-1 != val) {
    if ('W' == val)
    go();
    else if ('A' ==val)
    left();
    else if ('D' == val)
    right();
    else if ('S' == val)
    back();
    else if ('Q' == val)
      stop();
    delay(500);
    }
else
{
    //stop();
    delay(500);
}
}

swfzz 发表于 2014-1-7 10:01:21

感谢你的热心帮助,不知道是不是没有加ENDIF,造成的,晚上回去再试一下!
昨天晚上回家重新改了一下程序,当然还是抄的BOX那个版块的,自己修改了一下,用的电脑上的串口助手,各个键都能正常工作,代码如下:
# define go 1
# define back 2
# define stops 3
int pwm1=9; // motor line
int pwm2=10; //motor line
int en1=5;   //en1
int pwm3=11; //motor line
int pwm4=12; //motor line
int en2=6;//en2

int motor_speed = 240;

// init

void setup()
{
Serial.begin(9600);//初始化蓝牙
motorinit(); //system chushihua
motostops();    //初始化停车
}

void loop()
{
      int key;
      if(Serial.available() > 0)//只有接收到数据时才会发送数据
      {
          key = Serial.read();
          if(key >= 30 && key <= 122)
          {
            motorcomm(key);
            
          }
      }
}

void motorinit()//初始化系统
{
    pinMode(pwm1,OUTPUT);
    pinMode(pwm2,OUTPUT);
    pinMode(en1,OUTPUT);
    pinMode(en2,OUTPUT);
    pinMode(pwm3,OUTPUT);
    pinMode(pwm4,OUTPUT);
}

void motorL(int comm,int val) //对左轮电机进行操作
{
    switch (comm)
      {
      case go:            //左轮电机前进
          analogWrite(pwm1,val);//输入模拟值进行设定速度
          delay(20);
          analogWrite(pwm2,LOW);//低电平
          break;
      case back:            //左轮电机后退
         analogWrite(pwm2,val);//输入模拟值进行设定速度
         delay(20);
         analogWrite(pwm1,LOW);//
         break;
      case stops:            //左轮电机停止
            analogWrite(pwm1,LOW);
            delay(20);
            analogWrite(pwm2,LOW);
            break;
      default:
          return;
      }
}

void motorR(int comm, int val)
{
    switch(comm)
      {
      case go:
          analogWrite(pwm3,val);
          delay(20);
          analogWrite(pwm4,LOW);
          break;
      case back:
          analogWrite(pwm4,val);
          delay(20);
          analogWrite(pwm3,LOW);
          break;
      case stops:
          analogWrite(pwm3,LOW);
          delay(20);
          analogWrite(pwm4,LOW);
          break;
      default:
          return;
      }
}

void motostops()    //定义初始化停车
{
    motorL(stops,0);
    motorR(stops,0);
}

void motorcomm(int intputkey)    //定义键盘输入的命令
{
    switch(intputkey)
      {
      case 'w':
          motorL(go,motor_speed);
          motorR(go,motor_speed);
          break;
      case 's':
          motorL(back,motor_speed);
          motorR(back,motor_speed);
          break;
      case 'a':
          motorL(go,motor_speed-160);
          motorR(go,motor_speed);
          break;
      case 'd':
         motorL(go,motor_speed);
         motorR(go,motor_speed-160);
         break;
      case 'q':
            motorL(back,motor_speed);
            motorR(go,motor_speed);
            break;
      case 'e':
             motorL(go,motor_speed);
             motorR(back,motor_speed);
             break;
      case ' ':
            motostops();
          default:
            motostops();
            return;
            
      }
}

这里有两个地方不太清楚还请各位解释一下(本人没有系统学过编程)

1:
   # define go 1
   # define back 2
   # define stops 3
这里定义这三个常量后面的数值是不是仅仅为了满足格式上的需求才这样写的?还是有其它的目的?

2:
          if(key >= 30 && key <= 122)
请问下,这个啥意思啊?真心看不懂,当KEY大于等于30逻辑与KEY且小于等于122?      

swfzz 发表于 2014-1-8 09:42:27

各位,帮个忙回答一下呗!
另外那位帮忙写个10K-20K左右的频率的PWM,我看版主的转过来来的PWM下,三遍了,还是没有什么大的头绪!
先谢谢了!

pierre1993 发表于 2015-8-5 17:25:52

个人意见:
1.第一问中的定义应该是想让motorL,motorR中的switch语句更加形象,一眼就能看懂,没有什么实际作用
2.第二问中的30和122应该是ASCLL码值

zhiqiu1001 发表于 2015-8-10 19:55:43

正在做蓝牙小车收藏中。
页: [1]
查看完整版本: 蓝牙小车代码求助!