极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17840|回复: 12

蓝牙小车,不用测速模块解决小车走直线问题!

[复制链接]
发表于 2015-12-27 21:16:42 | 显示全部楼层 |阅读模式
感谢论坛里的"血阳",在他的贴子里学到了很多。
http://www.geek-workshop.com/for ... hlight=%C0%B6%D1%C0

大家都知道,这种便宜的香蕉直流电机及零件一致性非常差,在相同的电压电流下工作特性也是不一样的,所以造成转速不同。为了解决走直线问题,使用PWM控制电机,多次调节PWM值发现,想调好实在是太难,每次都在改程序——试验——改程序——试验中无限循环还调不好,所以楼主想,PWM用蓝牙控制,而却把值返回给手机,这样等调好了,也知道PWM值是多少的时候它走直线。下图就是左右PWM的返回值。不多说上图。
WM值是多少的时候它走直线。下图就是左右PWM的返回值。不多说上图。



后来发现不行呀,这玩具车是在是太烂了!轱辘与地面的摩擦面太小,全程玩的都是漂移这怎么行。找了几根皮筋解决问题!

大家也发现了我车上放了很多东西吧。对,这是为了配重,一是增加摩擦力,二是为了将重心放在香蕉电机的轴心附近。
----------------------------------------------
电机pwm可调可视已经解决。
摩擦力加皮筋加配重解决。
第三个坑出现——万向轮。
-----------------------------------------------
大家有没有发现,原地转弯后停止,准备瞄准目标走直线的时候,这厮在下车要走时,给你拐个弯,太TMD缺德了,没办法谁叫咱们买的便宜货呢。
继续改造,直接固定死他!用配重的方法,将此万向轮重量移走。




经测试,直线走的那是个标准呀!而且还没用测速模块。


http://tieba.baidu.com/p/4215571879?pid=80688046144&cid=0#80688046144 这是楼主改造的电池,动力太强劲了,8V,2A。要知道L298N最大电流2.5A,移动电源也就5V1A。
看上去电池还是底盘悬挂的,有没有特斯拉的赶脚。

  1. char getstr;
  2. int in1=3;
  3. int in2=4;
  4. int in3=7;
  5. int in4=8;
  6. int R=90;//初始PWM值,
  7. int L=90;//初始PWM值,
  8. int inENA=9;
  9. int inENB=10;
  10. int avl_S=5; //修改每次调节PWM时的步长
  11. //上面定义了板上的4个控制端,12一组,34一组
  12. void _mRight(int pin1,int pin2)//当in1和in2中有一个接高位时,电机会向某一方向转动


  13. {
  14. digitalWrite(pin1,HIGH);
  15. digitalWrite(pin2,LOW);
  16. }
  17. void _mLeft(int pin1,int pin2)//同上
  18. {
  19. digitalWrite(pin1,LOW);
  20. digitalWrite(pin2,HIGH);
  21. }
  22. void _mStop(int pin1,int pin2)//紧急制动,实际就是将电机两个端短接了
  23. {
  24. digitalWrite(pin1,HIGH);
  25. digitalWrite(pin2,HIGH);
  26. }
  27. void setup()
  28. {
  29. Serial.begin(9600);
  30. pinMode(in1,OUTPUT);
  31. pinMode(in2,OUTPUT);
  32. pinMode(in3,OUTPUT);
  33. pinMode(in4,OUTPUT);
  34. pinMode(inENA,OUTPUT);
  35. pinMode(inENB,OUTPUT);
  36. //下面程序开始时让控制端都为高电平,电机保持不动。
  37. digitalWrite(in1,HIGH);
  38. digitalWrite(in2,HIGH);
  39. digitalWrite(in3,HIGH);
  40. digitalWrite(in4,HIGH);
  41. }


  42. void loop()
  43. {
  44. analogWrite(9,L);
  45. analogWrite(10,R);


  46. getstr=Serial.read();
  47. if(getstr=='W')
  48. {
  49. Serial.println("go forward!");
  50. _mStop(in1,in2);
  51. _mStop(in3,in4);
  52. _mRight(in1,in2);
  53. _mRight(in3,in4);
  54. }
  55. else if(getstr=='S'){
  56. Serial.println("go back!");
  57. _mStop(in1,in2);
  58. _mStop(in3,in4);
  59. _mLeft(in1,in2);
  60. _mLeft(in3,in4);
  61. }
  62. else if(getstr=='A'){
  63. Serial.println("go left!");
  64. _mStop(in1,in2);
  65. _mStop(in3,in4);
  66. _mRight(in1,in2);
  67. _mLeft(in3,in4);
  68. }
  69. else if(getstr=='D'){
  70. Serial.println("go right!");
  71. _mStop(in1,in2);
  72. _mStop(in3,in4);
  73. _mRight(in3,in4);
  74. _mLeft(in1,in2);
  75. }
  76. else if(getstr=='E'){

  77. R=R+avl_S; //每次累加值为5
  78. Serial.print(R);
  79. Serial.print("R");
  80. Serial.println();
  81. if (R>=255)
  82. R=255;

  83. }
  84. else if(getstr=='C'){

  85. R=R-avl_S;
  86. Serial.print(R);
  87. Serial.print("R");
  88. Serial.println();
  89. if (R<=0)
  90. R=0;

  91. }
  92. else if(getstr=='Q'){

  93. L=L+avl_S; //每次累加值为5
  94. Serial.print(L);
  95. Serial.print("L");
  96. Serial.println();
  97. if (L>=255)
  98. L=255;



  99. }
  100. else if(getstr=='Z'){
  101. L=L-avl_S;
  102. Serial.print(L);
  103. Serial.print("L");
  104. Serial.println();
  105. if (L<=0)
  106. L=0;



  107. }
  108. else if(getstr=='F'){
  109. Serial.println("Stop!");
  110. _mStop(in1,in2);
  111. _mStop(in3,in4);
  112. }
  113. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-12-28 08:51:53 | 显示全部楼层
骚年莫要吐槽,注意言辞哈。
1、PWM的值可以在Arduino上加一个可调电阻,把AD值融到PWM中去,这个不难的;
2、选用好的减速电机,或者采用步进电机也行,伺服电机就没这个必要啦。
3、在现有电机基础上加一个编码器做速度采样,写个PID程序控制转速从而做一个简易的伺服控制器还是不错的。
回复 支持 反对

使用道具 举报

发表于 2015-12-28 10:51:54 | 显示全部楼层
没有测速器,只能搞地磁了,依靠地磁来稳定方向,不过地磁也漂移……
回复 支持 反对

使用道具 举报

发表于 2015-12-29 22:13:33 | 显示全部楼层
本帖最后由 血阳 于 2015-12-29 22:14 编辑

这样的简单小车,误差确实非常大,我自己也试过,曾经还试图算出他的速度和原地转弯角速度。最后发现根本行不通,因为各种因素影响,导致他的这些值波动很大。
感觉,你这样通过物理调节是个不错的想法,和原配比起来更好了。不过觉得这样始终是有一定的误差的。最好是通过内部调节,可以加上些传感器,加反馈啊调PID啊什么的话,应该会好很多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-29 22:44:11 | 显示全部楼层
PINKWALKMAN 发表于 2015-12-28 08:51
骚年莫要吐槽,注意言辞哈。
1、PWM的值可以在Arduino上加一个可调电阻,把AD值融到PWM中去,这个不难的; ...

我之前也想过加可调电阻,但是那样没有蓝牙调的方便。
如果做个好东西确实得用好的电机,我这纯属自娱自乐。
后悔没买测速模块。
回复 支持 反对

使用道具 举报

发表于 2015-12-30 07:59:39 | 显示全部楼层
w01218 发表于 2015-12-29 22:44
我之前也想过加可调电阻,但是那样没有蓝牙调的方便。
如果做个好东西确实得用好的电机,我这纯属自娱自 ...

蓝牙调试的参数在下次重启电源以后参数都没啦,除非把参数放到Eeprom里。
回复 支持 反对

使用道具 举报

发表于 2015-12-30 09:03:05 | 显示全部楼层
用磁场也可,先在场地校准,然后就可以随便沿直线跑了。不过,有时也容易跑偏,受室内电力布线影响。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-30 11:57:19 | 显示全部楼层
PINKWALKMAN 发表于 2015-12-30 07:59
蓝牙调试的参数在下次重启电源以后参数都没啦,除非把参数放到Eeprom里。


这个是调试用的,调好后你的手机蓝牙会收到调好的值如图,LR有返回值,然后把那两个值记住,设置到初始化参数里就OK啦。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-30 14:52:18 | 显示全部楼层
164335413 发表于 2015-12-30 09:03
用磁场也可,先在场地校准,然后就可以随便沿直线跑了。不过,有时也容易跑偏,受室内电力布线影响。

你的意思是用指南针模块?
回复 支持 反对

使用道具 举报

发表于 2015-12-30 17:13:24 | 显示全部楼层
w01218 发表于 2015-12-29 22:44
我之前也想过加可调电阻,但是那样没有蓝牙调的方便。
如果做个好东西确实得用好的电机,我这纯属自娱自 ...

不建议LZ买测速模块,因为本身电机、轮子都是便宜货,测出的值变化太大了,失去了参考意义。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-3 22:45:18 | 显示全部楼层
simple_he 发表于 2015-12-30 17:13
不建议LZ买测速模块,因为本身电机、轮子都是便宜货,测出的值变化太大了,失去了参考意义。

是呀,主要是以学习为目的。
回复 支持 反对

使用道具 举报

发表于 2016-1-4 11:02:09 | 显示全部楼层
如果有条件,可以在小车下面拖个“鼠标”就能够相对定位了……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-10 18:37:49 | 显示全部楼层
wetnt 发表于 2016-1-4 11:02
如果有条件,可以在小车下面拖个“鼠标”就能够相对定位了……

这个想法太帅了!
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 16:42 , Processed in 0.047093 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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