【求助】arduino四驱小车转向问题
本帖最后由 ylsmwj 于 2013-7-30 14:32 编辑本人小白一枚,最近DIY了一个四驱小车,用的驱动板是这个
主控板用ARDUINO最小系统版制作,驱动四个直流电机,前进,后退都正常,转弯的时候是控制一侧的两个电机正传,另一侧的两个电机反转,实现转弯,就是转弯的时候感觉阻力非常大,好像后轮是被前轮硬拽过来的一样,后来在网上看到一个帖子说小车的轴距过大会出现该问题,于是重新安装四个电机,将轴距缩成最小,该问题有所改善,但还是比较明显,我看到网上别人做的四驱小车视频转弯非常流畅毫无阻塞,甚至可以原地旋转,而且从视频中看,别人的小车轴距也不是特别短。下面是原程序,给位大大帮我看看问题出在什么地方?
此程序由OPENJUMER的小车控制程序修改而来String inString = ""; // string to hold input
String inStr = "";
int i;
/*------------------------------------------------------------------
define motor
------------------------------------------------------------------*/
#define FORWARD 1
#define BACKWARD 2
#define BRAKE 3
#define RELEASE 4
int motor_speed = 200; //motor speed 150-200,---min:100;max:255
int motor_delay = 400; //delay time in step
/*------------------------------------------------------------------
main program
------------------------------------------------------------------*/
void setup()
{
Serial.begin(9600);
motorInit();
b_motor_stop();
delay(1000);//waiting time
Serial.println("Hello! WangJun!");
}
void loop()
{
while (Serial.available() > 0)
{
int inChar = Serial.read();
if (inChar != '\n')
{
inString += (char)inChar;
}
if (inChar == '\n')
{
wifi_bt_car();
inString = "";
}
}
}
void wifi_bt_car() {
int num,number;
num = 0;
number = 0;
for(i=0 ;i < inString.length() ;i++ )
{
if(inString == 'W' || inString == 'w'
|| inString == 'S' || inString == 's'
|| inString == 'A' || inString == 'a'
|| inString == 'D' || inString == 'd'
|| inString == ' ')
{
Serial.println(inString);
b_motor_com(inString);
i++;
}
}
}
/*------------------------------------------------------------------
motorInit();//initial motorL&motorR;
motorLrun(cmd,spd);//cmd for BOXZ's action,spd for motorL speed;
motorRrun(cmd,spd);//cmd for BOXZ's action,spd for motorR speed;
b_motor_stop();//stop motorL&motorR;
b_motor_com(keyword);//keyboard "w,a,s,d" for action;space for stop;
------------------------------------------------------------------*/
void motorInit(){
pinMode(2,OUTPUT);//L1
pinMode(3,OUTPUT);//L1 PWM
pinMode(4,OUTPUT);//Control DC motor L L2
pinMode(5,OUTPUT);//PWM to control speed of DC motor L L2
pinMode(7,OUTPUT);//Control DC motor R R1
pinMode(6,OUTPUT);//PWM to control speed of DC motor R R1
pinMode(8,OUTPUT);//R2
pinMode(9,OUTPUT);//R2 PWM
}
void motorLrun(int cmd,int spd){//cmd for FORWARD BACKWARD BRAKE(stop);
switch (cmd){ //spd for control PWM and motor speed;
case FORWARD:
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
//analogWrite(5,LOW);
break;
case BACKWARD:
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
//analogWrite(5,spd);
break;
case BRAKE:
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
//analogWrite(5,spd);
break;
default :
return;
}
}
void motorRrun(int cmd,int spd){
switch (cmd){
case FORWARD:
digitalWrite(7,HIGH);
digitalWrite(6,LOW);
//analogWrite(6,spd);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
break;
case BACKWARD:
digitalWrite(7,LOW);
//analogWrite(6,spd);
digitalWrite(6,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
break;
case BRAKE:
digitalWrite(7,LOW);
digitalWrite(6,LOW);
//analogWrite(6,spd);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
default :
return;
}
}
void b_motor_stop(){
motorLrun(BRAKE,0);
motorRrun(BRAKE,0);
}
void b_motor_com(int keyword){
switch (keyword){
case 'w':
motorLrun(FORWARD,motor_speed);
motorRrun(FORWARD,motor_speed);
Serial.println("FORWARD");
break;
case 's':
motorLrun(BACKWARD,motor_speed);
motorRrun(BACKWARD,motor_speed);
Serial.println("BACKWARD");
break;
case 'a':
motorLrun(BACKWARD,motor_speed);
motorRrun(FORWARD,motor_speed);
Serial.println("LEFT");
break;
case 'd':
motorLrun(FORWARD,motor_speed);
motorRrun(BACKWARD,motor_speed);
Serial.println("RITGHT");
break;
case 'W':
motorLrun(FORWARD,motor_speed);
motorRrun(FORWARD,motor_speed);
Serial.println("StepF");
delay(motor_delay);
b_motor_stop();
break;
case 'S':
motorLrun(BACKWARD,motor_speed);
motorRrun(BACKWARD,motor_speed);
Serial.println("StepB");
delay(motor_delay);
b_motor_stop();
break;
case 'A':
motorLrun(BACKWARD,motor_speed);
motorRrun(FORWARD,motor_speed);
Serial.println("StepL");
delay(motor_delay);
b_motor_stop();
break;
case 'D':
motorLrun(FORWARD,motor_speed);
motorRrun(BACKWARD,motor_speed);
Serial.println("StepR");
delay(motor_delay);
b_motor_stop();
break;
case ' ':
Serial.println("STOP");
b_motor_stop();
break;
default :
Serial.println("STOP");
b_motor_stop();
return;
}
}
求上小车照:)
这是小车照片,因为还在测试阶段,所以找了块塑料版充当地盘,电机原来是按照长的那个方向安装的,后来为了缩小轴距把板子横了过来 代码好冗长,先试试直接让小车原地转圈吧,粗略地看了下代码好像没啥问题,手上现在没板子,不能验证你的代码 你的驱动板是从Arduino供电的? 电源电压几伏特?
建议电机驱动板单独供电,我看你驱动板介绍供电6V以上 你试试8-9V。
驱动板不想单独供电 就给Arduino供电供足一点 9V 试试
还有
11.int motor_speed = 200; //motor speed 150-200,---min:100;max:255
速度调成最高255试试 DevilHunterXX 发表于 2013-7-31 16:40 static/image/common/back.gif
你的驱动板是从Arduino供电的? 电源电压几伏特?
建议电机驱动板单独供电,我看你驱动板介绍供电6V以上...
拍照的时候 没有连接电源,现在在调试阶段,驱动板是用一个9V的变压器供电的,主控板用USB TO TTL调试供电,也想到了调速问题,但还没有着手试验,不过从别的坛子里看到说主要问题可能还在小车的结构上 y一般用两个电机就行了, 应该是四个轮的电机速度不一样,有一定的速度差,我做的是两个电机的,左右轮的转速也是不一样的,要自己微调,我是自己设了个带速度微调的电机库,在设控制端口的时候加设一个差速值。要是想高档点可以加装测速模块,让系统自己进行差速调,这是我下一步要搞的。希望对你有帮助。 可以弄橡皮履带,像坦克那样,这样就可以原地转了 擦,这代码太复杂了。。。我的4驱小车带无线遥控、超声波避障、两舵机摄像头云台,能满屋跑也没你代码多,呵呵 craber 发表于 2014-5-30 22:27
擦,这代码太复杂了。。。我的4驱小车带无线遥控、超声波避障、两舵机摄像头云台,能满屋跑也没你代码多,呵 ...
你好,能共享代码吗?谢谢! craber 发表于 2014-5-30 22:27 static/image/common/back.gif
擦,这代码太复杂了。。。我的4驱小车带无线遥控、超声波避障、两舵机摄像头云台,能满屋跑也没你代码多,呵 ...
那是别人的代码用到了库吧,他这个没用库,都是自己编写的,所以长了点,有一段就是控制小车前后转向的,去除那段,还有段是控制接收信号的,然后就没多少了。短的那种代码是用到库了,或许自己写的库,或许网上下的库。 四轮的没玩过,但是玩过二轮的,按你的说法,在二轮中,原地左右转就是那样,两个轮方向不同就行。
四轮的话,不太清楚,不过你可以问问论坛里的“我叫小萌兽”,他也做了四轮的,而且成功跑了,这里是他的链接:http://www.geek-workshop.com/forum.php?mod=viewthread&tid=12690&highlight=%C0%B6%D1%C0%D0%A1%B3%B5 呵呵,你这小车必然会这样的,因为轮胎太多,不信你自己画圆试试!两电机正反转就相当于以轴的中心画圆四个轮子想要运动的方向不同,所以就会这样了!建议用万向轮或是改成带转向装置的! 恩 我之前 DFRobot入手的四驱也有这样的问题,特别是转向的时候容易卡死
感觉上是各个轮子不协调导致的,
希望能原地转弯,又懒得调试,最后换的2驱的履带式的就没有问题了
页:
[1]