|
大家好,我是新人,刚学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; //PWM 5
- 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的值进行操作****************************
- }
复制代码 |
|