蓝牙小车,不用测速模块解决小车走直线问题!
感谢论坛里的"血阳",在他的贴子里学到了很多。http://www.geek-workshop.com/forum.php?mod=viewthread&tid=14831&highlight=%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。
看上去电池还是底盘悬挂的,有没有特斯拉的赶脚。
char getstr;
int in1=3;
int in2=4;
int in3=7;
int in4=8;
int R=90;//初始PWM值,
int L=90;//初始PWM值,
int inENA=9;
int inENB=10;
int avl_S=5; //修改每次调节PWM时的步长
//上面定义了板上的4个控制端,12一组,34一组
void _mRight(int pin1,int pin2)//当in1和in2中有一个接高位时,电机会向某一方向转动
{
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
}
void _mLeft(int pin1,int pin2)//同上
{
digitalWrite(pin1,LOW);
digitalWrite(pin2,HIGH);
}
void _mStop(int pin1,int pin2)//紧急制动,实际就是将电机两个端短接了
{
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
}
void setup()
{
Serial.begin(9600);
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
pinMode(inENA,OUTPUT);
pinMode(inENB,OUTPUT);
//下面程序开始时让控制端都为高电平,电机保持不动。
digitalWrite(in1,HIGH);
digitalWrite(in2,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in4,HIGH);
}
void loop()
{
analogWrite(9,L);
analogWrite(10,R);
getstr=Serial.read();
if(getstr=='W')
{
Serial.println("go forward!");
_mStop(in1,in2);
_mStop(in3,in4);
_mRight(in1,in2);
_mRight(in3,in4);
}
else if(getstr=='S'){
Serial.println("go back!");
_mStop(in1,in2);
_mStop(in3,in4);
_mLeft(in1,in2);
_mLeft(in3,in4);
}
else if(getstr=='A'){
Serial.println("go left!");
_mStop(in1,in2);
_mStop(in3,in4);
_mRight(in1,in2);
_mLeft(in3,in4);
}
else if(getstr=='D'){
Serial.println("go right!");
_mStop(in1,in2);
_mStop(in3,in4);
_mRight(in3,in4);
_mLeft(in1,in2);
}
else if(getstr=='E'){
R=R+avl_S; //每次累加值为5
Serial.print(R);
Serial.print("R");
Serial.println();
if (R>=255)
R=255;
}
else if(getstr=='C'){
R=R-avl_S;
Serial.print(R);
Serial.print("R");
Serial.println();
if (R<=0)
R=0;
}
else if(getstr=='Q'){
L=L+avl_S; //每次累加值为5
Serial.print(L);
Serial.print("L");
Serial.println();
if (L>=255)
L=255;
}
else if(getstr=='Z'){
L=L-avl_S;
Serial.print(L);
Serial.print("L");
Serial.println();
if (L<=0)
L=0;
}
else if(getstr=='F'){
Serial.println("Stop!");
_mStop(in1,in2);
_mStop(in3,in4);
}
},
骚年莫要吐槽,注意言辞哈。
1、PWM的值可以在Arduino上加一个可调电阻,把AD值融到PWM中去,这个不难的;
2、选用好的减速电机,或者采用步进电机也行,伺服电机就没这个必要啦。
3、在现有电机基础上加一个编码器做速度采样,写个PID程序控制转速从而做一个简易的伺服控制器还是不错的。 没有测速器,只能搞地磁了,依靠地磁来稳定方向,不过地磁也漂移…… 本帖最后由 血阳 于 2015-12-29 22:14 编辑
这样的简单小车,误差确实非常大,我自己也试过,曾经还试图算出他的速度和原地转弯角速度。最后发现根本行不通,因为各种因素影响,导致他的这些值波动很大。
感觉,你这样通过物理调节是个不错的想法,和原配比起来更好了。不过觉得这样始终是有一定的误差的。最好是通过内部调节,可以加上些传感器,加反馈啊调PID啊什么的话,应该会好很多。 PINKWALKMAN 发表于 2015-12-28 08:51 static/image/common/back.gif
骚年莫要吐槽,注意言辞哈。
1、PWM的值可以在Arduino上加一个可调电阻,把AD值融到PWM中去,这个不难的; ...
我之前也想过加可调电阻,但是那样没有蓝牙调的方便。
如果做个好东西确实得用好的电机,我这纯属自娱自乐。
后悔没买测速模块。 w01218 发表于 2015-12-29 22:44 static/image/common/back.gif
我之前也想过加可调电阻,但是那样没有蓝牙调的方便。
如果做个好东西确实得用好的电机,我这纯属自娱自 ...
蓝牙调试的参数在下次重启电源以后参数都没啦,除非把参数放到Eeprom里。 用磁场也可,先在场地校准,然后就可以随便沿直线跑了。不过,有时也容易跑偏,受室内电力布线影响。 PINKWALKMAN 发表于 2015-12-30 07:59 static/image/common/back.gif
蓝牙调试的参数在下次重启电源以后参数都没啦,除非把参数放到Eeprom里。
这个是调试用的,调好后你的手机蓝牙会收到调好的值如图,LR有返回值,然后把那两个值记住,设置到初始化参数里就OK啦。 164335413 发表于 2015-12-30 09:03 static/image/common/back.gif
用磁场也可,先在场地校准,然后就可以随便沿直线跑了。不过,有时也容易跑偏,受室内电力布线影响。
你的意思是用指南针模块? w01218 发表于 2015-12-29 22:44 static/image/common/back.gif
我之前也想过加可调电阻,但是那样没有蓝牙调的方便。
如果做个好东西确实得用好的电机,我这纯属自娱自 ...
不建议LZ买测速模块,因为本身电机、轮子都是便宜货,测出的值变化太大了,失去了参考意义。 simple_he 发表于 2015-12-30 17:13 static/image/common/back.gif
不建议LZ买测速模块,因为本身电机、轮子都是便宜货,测出的值变化太大了,失去了参考意义。
是呀,主要是以学习为目的。 如果有条件,可以在小车下面拖个“鼠标”就能够相对定位了…… wetnt 发表于 2016-1-4 11:02 static/image/common/back.gif
如果有条件,可以在小车下面拖个“鼠标”就能够相对定位了……
这个想法太帅了!
页:
[1]