小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 8487|回复: 7

【求助】arduino四驱小车转向问题

[复制链接]
发表于 2013-7-31 10:42:43 | 显示全部楼层 |阅读模式
本帖最后由 ylsmwj 于 2013-7-31 10:43 编辑

本人小白一枚,最近DIY了一个四驱小车,用的驱动板是这个
T2gcOOXcVbXXXXXXXX_!!58343593.jpg
主控板用ARDUINO最小系统版制作,驱动四个直流电机,前进,后退都正常,转弯的时候是控制一侧的两个电机正传,另一侧的两个电机反转,实现转弯,就是转弯的时候感觉阻力非常大,好像后轮是被前轮硬拽过来的一样,后来在坛子里看到一个帖子说小车的轴距过大会出现该问题(原帖地址:轮式小车[轮距]与[轴距]关系的简单分析),于是重新安装四个电机,将轴距缩成最小,该问题有所改善,但还是比较明显,我看到网上别人做的四驱小车视频转弯非常流畅毫无阻塞,甚至可以原地旋转,而且从视频中看,别人的小车轴距也不是特别短。

这是小车照片,因为还在测试阶段,所以找了块塑料版充当地盘,电机原来是按照长的那个方向安装的,后来为了缩小轴距把板子横了过来
171506wxtj9btjx3sxit1w.jpg
下面是原程序,各位大大帮我看看问题出在什么地方?
此程序由OPENJUMER的小车控制程序修改而来
  1. String inString = ""; // string to hold input
  2. String inStr = "";
  3. int i;
  4. /*------------------------------------------------------------------
  5. define motor
  6. ------------------------------------------------------------------*/
  7. #define FORWARD 1
  8. #define BACKWARD 2
  9. #define BRAKE 3
  10. #define RELEASE 4
  11. int motor_speed = 200; //[modifid]motor speed 150-200,---min:100;max:255
  12. int motor_delay = 400; //[modifid]delay time in step
  13. /*------------------------------------------------------------------
  14. main program
  15. ------------------------------------------------------------------*/
  16. void setup()
  17. {
  18. Serial.begin(9600);
  19. motorInit();
  20. b_motor_stop();
  21. delay(1000); //waiting time
  22. Serial.println("Hello! WangJun!");
  23. }

  24. void loop()
  25. {
  26. while (Serial.available() > 0)
  27. {
  28. int inChar = Serial.read();
  29. if (inChar != '\n')
  30. {
  31. inString += (char)inChar;
  32. }
  33. if (inChar == '\n')
  34. {
  35. wifi_bt_car();
  36. inString = "";
  37. }
  38. }
  39. }
  40. void wifi_bt_car() {
  41. int num,number;
  42. num = 0;
  43. number = 0;
  44. for(i=0 ;i < inString.length() ;i++ )
  45. {
  46. if(inString[i] == 'W' || inString[i] == 'w'
  47. || inString[i] == 'S' || inString[i] == 's'
  48. || inString[i] == 'A' || inString[i] == 'a'
  49. || inString[i] == 'D' || inString[i] == 'd'
  50. || inString[i] == ' ')
  51. {
  52. Serial.println(inString[i]);
  53. b_motor_com(inString[i]);
  54. i++;
  55. }
  56. }
  57. }
  58. /*------------------------------------------------------------------
  59. motorInit();//initial motorL&motorR;
  60. motorLrun(cmd,spd);//cmd for BOXZ's action,spd for motorL speed;
  61. motorRrun(cmd,spd);//cmd for BOXZ's action,spd for motorR speed;
  62. b_motor_stop();//stop motorL&motorR;
  63. b_motor_com(keyword);//keyboard "w,a,s,d" for action;space for stop;
  64. ------------------------------------------------------------------*/
  65. void motorInit(){
  66. pinMode(2,OUTPUT);//L1
  67. pinMode(3,OUTPUT);//L1 PWM
  68. pinMode(4,OUTPUT);//Control DC motor L L2
  69. pinMode(5,OUTPUT);//PWM to control speed of DC motor L L2
  70. pinMode(7,OUTPUT);//Control DC motor R R1
  71. pinMode(6,OUTPUT);//PWM to control speed of DC motor R R1
  72. pinMode(8,OUTPUT);//R2
  73. pinMode(9,OUTPUT);//R2 PWM
  74. }
  75. void motorLrun(int cmd,int spd){ //cmd for FORWARD BACKWARD BRAKE(stop);
  76. switch (cmd){ //spd for control PWM and motor speed;
  77. case FORWARD:
  78. digitalWrite(2,HIGH);
  79. digitalWrite(3,LOW);
  80. digitalWrite(4,HIGH);
  81. digitalWrite(5,LOW);
  82. //analogWrite(5,LOW);
  83. break;
  84. case BACKWARD:
  85. digitalWrite(2,LOW);
  86. digitalWrite(3,HIGH);
  87. digitalWrite(4,LOW);
  88. digitalWrite(5,HIGH);
  89. //analogWrite(5,spd);
  90. break;
  91. case BRAKE:
  92. digitalWrite(2,LOW);
  93. digitalWrite(3,LOW);
  94. digitalWrite(4,LOW);
  95. digitalWrite(5,LOW);
  96. //analogWrite(5,spd);
  97. break;
  98. default :
  99. return;
  100. }
  101. }

  102. void motorRrun(int cmd,int spd){
  103. switch (cmd){
  104. case FORWARD:
  105. digitalWrite(7,HIGH);
  106. digitalWrite(6,LOW);
  107. //analogWrite(6,spd);
  108. digitalWrite(8,HIGH);
  109. digitalWrite(9,LOW);
  110. break;
  111. case BACKWARD:
  112. digitalWrite(7,LOW);
  113. //analogWrite(6,spd);
  114. digitalWrite(6,HIGH);
  115. digitalWrite(8,LOW);
  116. digitalWrite(9,HIGH);
  117. break;
  118. case BRAKE:
  119. digitalWrite(7,LOW);
  120. digitalWrite(6,LOW);
  121. //analogWrite(6,spd);
  122. digitalWrite(8,LOW);
  123. digitalWrite(9,LOW);
  124. default :
  125. return;
  126. }
  127. }

  128. void b_motor_stop(){
  129. motorLrun(BRAKE,0);
  130. motorRrun(BRAKE,0);
  131. }

  132. void b_motor_com(int keyword){
  133. switch (keyword){
  134. case 'w':
  135. motorLrun(FORWARD,motor_speed);
  136. motorRrun(FORWARD,motor_speed);
  137. Serial.println("FORWARD");
  138. break;
  139. case 's':
  140. motorLrun(BACKWARD,motor_speed);
  141. motorRrun(BACKWARD,motor_speed);
  142. Serial.println("BACKWARD");
  143. break;
  144. case 'a':
  145. motorLrun(BACKWARD,motor_speed);
  146. motorRrun(FORWARD,motor_speed);
  147. Serial.println("LEFT");
  148. break;
  149. case 'd':
  150. motorLrun(FORWARD,motor_speed);
  151. motorRrun(BACKWARD,motor_speed);
  152. Serial.println("RITGHT");
  153. break;
  154. case 'W':
  155. motorLrun(FORWARD,motor_speed);
  156. motorRrun(FORWARD,motor_speed);
  157. Serial.println("StepF");
  158. delay(motor_delay);
  159. b_motor_stop();
  160. break;
  161. case 'S':
  162. motorLrun(BACKWARD,motor_speed);
  163. motorRrun(BACKWARD,motor_speed);
  164. Serial.println("StepB");
  165. delay(motor_delay);
  166. b_motor_stop();
  167. break;
  168. case 'A':
  169. motorLrun(BACKWARD,motor_speed);
  170. motorRrun(FORWARD,motor_speed);
  171. Serial.println("StepL");
  172. delay(motor_delay);
  173. b_motor_stop();
  174. break;
  175. case 'D':
  176. motorLrun(FORWARD,motor_speed);
  177. motorRrun(BACKWARD,motor_speed);
  178. Serial.println("StepR");
  179. delay(motor_delay);
  180. b_motor_stop();
  181. break;
  182. case ' ':
  183. Serial.println("STOP");
  184. b_motor_stop();
  185. break;
  186. default :
  187. Serial.println("STOP");
  188. b_motor_stop();
  189. return;
  190. }
  191. }
复制代码

回复

使用道具 举报

发表于 2013-7-31 11:52:01 | 显示全部楼层
和程序没有关系,还是结构设计问题。轮轴距比例接近1:1是最好的。另外可以加大输出电压,转向问题也可以改善。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-31 16:49:50 | 显示全部楼层
liuviking 发表于 2013-7-31 11:52
和程序没有关系,还是结构设计问题。轮轴距比例接近1:1是最好的。另外可以加大输出电压,转向问题也可以改善 ...

通过调速,可否在一定程度上解决该问题?比如转弯时靠内的轮子速度慢,而考外的速度快
回复 支持 反对

使用道具 举报

发表于 2013-7-31 17:35:05 | 显示全部楼层
ylsmwj 发表于 2013-7-31 16:49
通过调速,可否在一定程度上解决该问题?比如转弯时靠内的轮子速度慢,而考外的速度快

因为我们的驱动板就有这个功能,所以也试验过,转向的半径太大了。
回复 支持 反对

使用道具 举报

发表于 2013-8-4 23:32:35 | 显示全部楼层
改车体吧,一眼就看的不协调,,,
回复 支持 反对

使用道具 举报

发表于 2013-8-5 11:35:19 | 显示全部楼层
楼主是否可以考虑把小车前后轴安装的时候,各自增加一点前束角呢?其实就是少量牺牲直行时的车轮对直方向,来满足转向时的圆周运动轨迹。

另外,是否可以用圆柱面轮胎替换这种平面轮胎,平面轮胎在这种简单的车体上,如果附着力不同时,必然会看到某一个或某几个轮子出现拖行的现象。而非理想状态下,附着力不同几乎是百分之百必然出现的情况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 11:01:12 | 显示全部楼层
下一页 发表于 2013-8-4 23:32
改车体吧,一眼就看的不协调,,,

已经按1:1重新设计,但还没有着手制作
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 11:17:17 | 显示全部楼层
muyl 发表于 2013-8-5 11:35
楼主是否可以考虑把小车前后轴安装的时候,各自增加一点前束角呢?其实就是少量牺牲直行时的车轮对直方向, ...

圆柱面轮胎,这个建议不错,应该能减小摩擦,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-23 09:51 , Processed in 1.115736 second(s), 22 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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