houliji 发表于 2016-8-15 19:07:12

请高手看看为什么左轮不转

大家好,我是新人,刚学ARDUINO,改了一个小车程序,但是右轮怎么都不转,研究了两天了,实在研究不出来,还请高价指点。//小车前后左右PWM Arduino 程序:
// R是右(right),L是左(left)          人与小车同一方向时 分的左右
#include <IRremote.h>
int RECV_PIN=7;
int MotorLeft1=14; //A0 IN1
int MotorLeft2=15; //A1 IN2
int MotorRight1=16;//A2 IN3
int MotorRight2=17;//A3 IN4
int MotorLPWM=5;//PWM5
int MotorRPWM=3;//PWM 3

int LSpeed=0;        //左轮速度
int RSpeed=0;        //右轮速度
int LAdjust=0;//调整左轮速度,使两轮速度一致
int Gear=50;//定义一个档差
int MaxSpeed=240;//定义最大速度
int MinSpeed=50;//定义最小速度
int Temp ;//定义临时变量
int Signal;//定义接收到的信号
int Direct=0;//定义方向,“1”为前进,“0”为停止,“-1”为后退,“2”为右前左后,“3”为右后左前,"4"为向后转

IRrecv irrecv(RECV_PIN);
decode_results results;
#define QianJin -24481
#define HouTui 24735
#define ZuoZhuan -8161
#define YouZhuan 4335
#define Ting 8415
#define Xiangzuozhuan -30601
#define Xiangyouzhuan 18615
#define Xianghouzhuan -14281

void setup()
{
Serial.begin(9600);
pinMode(RECV_PIN, INPUT);   
pinMode(MotorRight1, OUTPUT);
pinMode(MotorRight2, OUTPUT);
pinMode(MotorLeft1,OUTPUT);
pinMode(MotorLeft2,OUTPUT);
pinMode(MotorLPWM,OUTPUT);
pinMode(MotorRPWM,OUTPUT);
irrecv.enableIRIn(); // Start the receiver
}


void advance()   // 前進or加速
{
Direct=1;
/***************************前进调速***************************/
if (LSpeed==RSpeed)//IF直行,THEN调高一档
{
    LSpeed=LSpeed+Gear;
    RSpeed=RSpeed+Gear;
    if (RSpeed>=MaxSpeed) //将速度限定在最大速度之内
    {
      LSpeed=MaxSpeed-LAdjust;
      RSpeed=MaxSpeed;
    }
}   
else //IF拐弯,THEN使直行
{
    Temp=(LSpeed+RSpeed)/2;
    LSpeed=Temp-LAdjust;
    RSpeed=Temp;
}
/***************************前进调速***************************/

if(RSpeed<MinSpeed)
{
    RSpeed=MinSpeed;
    LSpeed=MinSpeed-LAdjust;
}
}

void right()      //右轉(單輪)
{
if(Direct!=0) RSpeed=RSpeed-Gear;
}

void left()         //左轉(單輪)
{
if(Direct!=0) LSpeed=LSpeed-Gear;
}

void turnR()      //右轉(雙輪)
{
Direct=3;
}

void turnL()      //左轉(雙輪)
{
Direct=2;
}   

void turnBack()      //向后转
{
Direct=4;
}

void stopp()         //停止
{
Direct=0;
}

void back()          //後退 后退
{
if (Direct==1)
{
    LSpeed=LSpeed-Gear;
    RSpeed=RSpeed-Gear;
    if (RSpeed<MinSpeed) Direct=0;//速度小于最小速度时停止
}
else
{
    Direct=-1;//如果停止或者后退状态,挂倒档
}
}

void loop()
{
//Dingyi xinhao laiyuan.
if (irrecv.decode(&results))
{
    Signal=results.value;
    Serial.println(Signal);
    switch(Signal)
    {/*8种信号,分别为前进、后、左、右、停、向左转、向右转、向后转*/
    case QianJin:
      advance();
      break;
    case HouTui:
      back();
      break;
    case ZuoZhuan:
      left();
      break;
    case YouZhuan:
      right();
      break;
    case Ting:
      stopp();
      break;
    case Xiangzuozhuan:
      turnL();
      break;
    case Xiangyouzhuan:
      turnR();
      break;
    case Xianghouzhuan:
      turnBack();
    }
    irrecv.resume();
}
//***************************依据Direct的值进行操作****************************
if (Direct==-1) //倒档
{
    digitalWrite(MotorRight1,LOW);
    digitalWrite(MotorRight2,HIGH);
    analogWrite(MotorRPWM,RSpeed);

    digitalWrite(MotorLeft1,HIGH);
    digitalWrite(MotorLeft2,LOW);
    analogWrite(MotorLPWM,LSpeed+LAdjust);
}
else if(Direct==0)
{
    digitalWrite(MotorRight1,LOW);
    digitalWrite(MotorRight2,LOW);

    digitalWrite(MotorLeft1,LOW);
    digitalWrite(MotorLeft2,LOW);
}
else if(Direct==1)
{
    digitalWrite(MotorRight1,HIGH);//IN3 右电机 高电平正转
    digitalWrite(MotorRight2,LOW);//IN4 右电机 高电平反转
    analogWrite(MotorRPWM,RSpeed);

    digitalWrite(MotorLeft1,LOW);//IN1 左电机 高电平反转
    digitalWrite(MotorLeft2,HIGH);//IN2 左电机 高电平正转
    analogWrite(MotorLPWM,LSpeed+LAdjust);
}
else if(Direct==2)
{
    digitalWrite(MotorRight1,HIGH);
    digitalWrite(MotorRight2,LOW);
    analogWrite(MotorRPWM,130);

    digitalWrite(MotorLeft1,HIGH);
    digitalWrite(MotorLeft2,LOW);
    analogWrite(MotorLPWM,130);
    delay(100);//这个数值还有待商榷
    Direct=1;
}
else if(Direct==3)
{
    digitalWrite(MotorRight1,LOW);
    digitalWrite(MotorRight2,HIGH);
    analogWrite(MotorRPWM,130);

    digitalWrite(MotorLeft1,LOW);
    digitalWrite(MotorLeft2,HIGH);
    analogWrite(MotorLPWM,130);
    delay(100);//这里需要填入数值使小车向右转90度
    Direct=1;
}
else
{
    digitalWrite(MotorRight1,LOW);
    digitalWrite(MotorRight2,HIGH);
    analogWrite(MotorRPWM,130);

    digitalWrite(MotorLeft1,LOW);
    digitalWrite(MotorLeft2,HIGH);
    analogWrite(MotorLPWM,130);
    delay(300);//这里需要填入数值使小车向后转
    Direct=1;
}
//***************************依据Direct的值进行操作****************************
}


houliji 发表于 2016-8-15 20:34:33

是右轮,我的题目写错了

Albert,_Einste 发表于 2016-8-16 14:22:45

你用的什么驱动板?硬件是否是好的建议你检查一下

pumpitup 发表于 2016-8-16 22:00:42

你编写一个让右轮转的程序,才能帮你看啊

pumpitup 发表于 2016-8-16 22:04:12

感觉蛮乱的
是我水平低么?

houliji 发表于 2016-8-17 12:49:22

Albert,_Einste 发表于 2016-8-16 14:22 static/image/common/back.gif
你用的什么驱动板?硬件是否是好的建议你检查一下

硬件没有问题,如果把左轮的PWM去掉,那么就成光左轮转,右轮不转了。

Albert,_Einste 发表于 2016-8-19 17:56:13

请问,驱动板?

houliji 发表于 2016-8-19 23:13:21

Albert,_Einste 发表于 2016-8-19 17:56 static/image/common/back.gif
请问,驱动板?

ARDUINO UNO

Albert,_Einste 发表于 2016-8-20 22:45:54

电机驱动板,难不成你用io口直接驱动。。。。。

houliji 发表于 2016-8-21 19:25:06

Albert,_Einste 发表于 2016-8-20 22:45 static/image/common/back.gif
电机驱动板,难不成你用io口直接驱动。。。。。

电机驱动板是网上买的慧净的底盘
页: [1]
查看完整版本: 请高手看看为什么左轮不转