感谢论坛里的"血阳",在他的贴子里学到了很多。
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。
看上去电池还是底盘悬挂的,有没有特斯拉的赶脚。
- 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);
- }
- }
复制代码 ,
|