极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18795|回复: 9

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

[复制链接]
发表于 2016-8-15 19:07:12 | 显示全部楼层 |阅读模式
大家好,我是新人,刚学ARDUINO,改了一个小车程序,但是右轮怎么都不转,研究了两天了,实在研究不出来,还请高价指点。
  1. //小车前后左右PWM Arduino 程序:
  2. // R是右(right),L是左(left)          人与小车同一方向时 分的左右
  3. #include <IRremote.h>
  4. int RECV_PIN=7;
  5. int MotorLeft1=14; //A0 IN1
  6. int MotorLeft2=15; //A1 IN2
  7. int MotorRight1=16;  //A2 IN3
  8. int MotorRight2=17;  //A3 IN4
  9. int MotorLPWM=5;  //PWM  5
  10. int MotorRPWM=3;  //PWM 3

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

  20. IRrecv irrecv(RECV_PIN);
  21. decode_results results;
  22. #define QianJin -24481
  23. #define HouTui 24735
  24. #define ZuoZhuan -8161
  25. #define YouZhuan 4335
  26. #define Ting 8415
  27. #define Xiangzuozhuan -30601
  28. #define Xiangyouzhuan 18615
  29. #define Xianghouzhuan -14281

  30. void setup()
  31. {
  32.   Serial.begin(9600);
  33.   pinMode(RECV_PIN, INPUT);   
  34.   pinMode(MotorRight1, OUTPUT);
  35.   pinMode(MotorRight2, OUTPUT);
  36.   pinMode(MotorLeft1,  OUTPUT);
  37.   pinMode(MotorLeft2,  OUTPUT);
  38.   pinMode(MotorLPWM,  OUTPUT);
  39.   pinMode(MotorRPWM,  OUTPUT);
  40.   irrecv.enableIRIn(); // Start the receiver
  41. }


  42. void advance()     // 前進or加速
  43. {
  44.   Direct=1;
  45.   /***************************前进调速***************************/
  46.   if (LSpeed==RSpeed)//IF直行,THEN调高一档
  47.   {
  48.     LSpeed=LSpeed+Gear;
  49.     RSpeed=RSpeed+Gear;
  50.     if (RSpeed>=MaxSpeed) //将速度限定在最大速度之内
  51.     {
  52.       LSpeed=MaxSpeed-LAdjust;
  53.       RSpeed=MaxSpeed;
  54.     }
  55.   }   
  56.   else //IF拐弯,THEN使直行
  57.   {
  58.     Temp=(LSpeed+RSpeed)/2;
  59.     LSpeed=Temp-LAdjust;
  60.     RSpeed=Temp;
  61.   }
  62.   /***************************前进调速***************************/

  63.   if(RSpeed<MinSpeed)
  64.   {
  65.     RSpeed=MinSpeed;
  66.     LSpeed=MinSpeed-LAdjust;
  67.   }
  68. }

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

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

  77. void turnR()        //右轉(雙輪)
  78. {
  79.   Direct=3;
  80. }

  81. void turnL()        //左轉(雙輪)
  82. {
  83.   Direct=2;
  84. }   

  85. void turnBack()        //向后转
  86. {
  87.   Direct=4;
  88. }

  89. void stopp()         //停止
  90. {
  91.   Direct=0;
  92. }

  93. void back()          //後退 后退
  94. {
  95.   if (Direct==1)
  96.   {
  97.     LSpeed=LSpeed-Gear;
  98.     RSpeed=RSpeed-Gear;
  99.     if (RSpeed<MinSpeed) Direct=0;//速度小于最小速度时停止
  100.   }
  101.   else
  102.   {
  103.     Direct=-1;//如果停止或者后退状态,挂倒档
  104.   }
  105. }

  106. void loop()
  107. {
  108.   //Dingyi xinhao laiyuan.
  109.   if (irrecv.decode(&results))
  110.   {
  111.     Signal=results.value;
  112.     Serial.println(Signal);
  113.     switch(Signal)
  114.     {/*8种信号,分别为前进、后、左、右、停、向左转、向右转、向后转*/
  115.     case QianJin:
  116.       advance();
  117.       break;
  118.     case HouTui:
  119.       back();
  120.       break;
  121.     case ZuoZhuan:
  122.       left();
  123.       break;
  124.     case YouZhuan:
  125.       right();
  126.       break;
  127.     case Ting:
  128.       stopp();
  129.       break;
  130.     case Xiangzuozhuan:
  131.       turnL();
  132.       break;
  133.     case Xiangyouzhuan:
  134.       turnR();
  135.       break;
  136.     case Xianghouzhuan:
  137.       turnBack();
  138.     }
  139.     irrecv.resume();  
  140.   }
  141.   //***************************依据Direct的值进行操作****************************
  142.   if (Direct==-1) //倒档
  143.   {
  144.     digitalWrite(MotorRight1,LOW);
  145.     digitalWrite(MotorRight2,HIGH);
  146.     analogWrite(MotorRPWM,RSpeed);

  147.     digitalWrite(MotorLeft1,HIGH);
  148.     digitalWrite(MotorLeft2,LOW);
  149.     analogWrite(MotorLPWM,LSpeed+LAdjust);  
  150.   }
  151.   else if(Direct==0)
  152.   {
  153.     digitalWrite(MotorRight1,LOW);
  154.     digitalWrite(MotorRight2,LOW);

  155.     digitalWrite(MotorLeft1,LOW);
  156.     digitalWrite(MotorLeft2,LOW);
  157.   }
  158.   else if(Direct==1)
  159.   {
  160.     digitalWrite(MotorRight1,HIGH);//IN3 右电机 高电平正转
  161.     digitalWrite(MotorRight2,LOW);//IN4 右电机 高电平反转
  162.     analogWrite(MotorRPWM,RSpeed);

  163.     digitalWrite(MotorLeft1,LOW);//IN1 左电机 高电平反转
  164.     digitalWrite(MotorLeft2,HIGH);//IN2 左电机 高电平正转
  165.     analogWrite(MotorLPWM,LSpeed+LAdjust);
  166.   }
  167.   else if(Direct==2)
  168.   {
  169.     digitalWrite(MotorRight1,HIGH);
  170.     digitalWrite(MotorRight2,LOW);
  171.     analogWrite(MotorRPWM,130);

  172.     digitalWrite(MotorLeft1,HIGH);
  173.     digitalWrite(MotorLeft2,LOW);
  174.     analogWrite(MotorLPWM,130);
  175.     delay(100);//这个数值还有待商榷
  176.     Direct=1;
  177.   }
  178.   else if(Direct==3)
  179.   {
  180.     digitalWrite(MotorRight1,LOW);
  181.     digitalWrite(MotorRight2,HIGH);
  182.     analogWrite(MotorRPWM,130);

  183.     digitalWrite(MotorLeft1,LOW);
  184.     digitalWrite(MotorLeft2,HIGH);
  185.     analogWrite(MotorLPWM,130);
  186.     delay(100);//这里需要填入数值使小车向右转90度
  187.     Direct=1;
  188.   }
  189.   else
  190.   {
  191.     digitalWrite(MotorRight1,LOW);
  192.     digitalWrite(MotorRight2,HIGH);
  193.     analogWrite(MotorRPWM,130);

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


复制代码
回复

使用道具 举报

 楼主| 发表于 2016-8-15 20:34:33 来自手机 | 显示全部楼层
是右轮,我的题目写错了
回复 支持 反对

使用道具 举报

发表于 2016-8-16 14:22:45 | 显示全部楼层
你用的什么驱动板?硬件是否是好的建议你检查一下
回复 支持 反对

使用道具 举报

发表于 2016-8-16 22:00:42 | 显示全部楼层
你编写一个让右轮转的程序,才能帮你看啊
回复 支持 反对

使用道具 举报

发表于 2016-8-16 22:04:12 | 显示全部楼层
感觉蛮乱的
是我水平低么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-17 12:49:22 | 显示全部楼层
Albert,_Einste 发表于 2016-8-16 14:22
你用的什么驱动板?硬件是否是好的建议你检查一下

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

使用道具 举报

发表于 2016-8-19 17:56:13 | 显示全部楼层
请问,驱动板?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-19 23:13:21 | 显示全部楼层
Albert,_Einste 发表于 2016-8-19 17:56
请问,驱动板?

ARDUINO UNO
回复 支持 反对

使用道具 举报

发表于 2016-8-20 22:45:54 | 显示全部楼层
电机驱动板,难不成你用io口直接驱动。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 19:25:06 | 显示全部楼层
Albert,_Einste 发表于 2016-8-20 22:45
电机驱动板,难不成你用io口直接驱动。。。。。

电机驱动板是网上买的慧净的底盘
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 15:00 , Processed in 0.040247 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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