65.9K
CodeProject 正在变化。 阅读更多。
Home

在没有任何编码器的情况下将 4WD 底盘旋转 360 度

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (3投票s)

2018 年 8 月 6 日

CPOL

4分钟阅读

viewsIcon

12812

downloadIcon

270

管理您的 4WD 底盘的旋转角度。

引言

我购买了许多低价的四驱底盘机器人之一。它拥有让你的机器人导航的所有基本组件。 我希望机器人能够独立移动,避开障碍物,在房间里自由移动。 我意识到我有 4 个直流 TT 齿轮箱电机固定在底盘上,没有任何转向的可能性。 如何在没有车轮编码器或指南针或陀螺仪传感器的情况下旋转 90 度、180 度或 360 度?

 

Components

1 个四驱机器人套件

如果不存在

1 个 Arduino nano v 3.0 或 Arduino Uno

2 个 L298N

1 个 220 K 电位器

4 个 TT 齿轮箱电机

2 个 18650 电池 3.7 V(7.4 V)

1 个电源开关

理论

阅读电机规格后,我尝试获取一些有用的信息。

以下计算成立的前提是

  1. Vcc 是恒定的
  2. 电机未承受任何负载(车轮、重量、牵引力等)

因此,例如,如果 Vcc = 4.5V,那么为了让我的机器人转动 1 度,我必须以最大速度为电机供电 0.9 毫秒。

注意:L298N 会产生约 2V 的压降。 因此,我们的 7.4 V 将降至电机上的 5.4 V(我测试了约 5.3 V)。

因此,当 Vcc = 5.3V 时,计算结果将是

注意:Vcc 和 RPM 之间的比率似乎是线性的。

实践

如果我们想深入研究,我们还需要考虑很多其他变量,一个是所有机器人组件的重量,这些重量会改变运动、牵引力、总惯性,另一个是底盘的形状。

我们很幸运拥有一个几乎是正方形的形状,但请记住,减小轴距(前后轮组之间的距离)会导致四轮驱动机器人在任何方向上都具有更好的零半径转弯,并且在枢轴位置旋转时具有更高的效率。 下次我会买一个像坦克一样的底盘。 这里你可以找到一个关于形状的非常好的解释。

现在我们已经连接了所有组件。 仔细查看连接。 一个好的技巧是从另一个角度再次查看它们。 另一个技巧是逐个模块检查和测试电路连接。 欢迎使用测试仪。

 

代码

Arduino 草图包含使你的机器人在各个方向上移动的所有命令。 我的目的是确保这些命令能够正常工作,以便在物联网环境中调用,将机器人与 GPS 和其他传感器、摄像头集成,并且.... 最好的还在后面!

我将集中我的解释以实现就地 90 度、180 度、360 度转弯。

这个块定义了电机

//Motor Front Left
#define ENA_F_FL 10 // Enable/speed motor Front Left D10->ENA L298N Front Side
#define IN_F_FL_1 8 // L298N #2 in 1 motor Front Left D8->IN1 L298N Front Side
#define IN_F_FL_2 9 // L298N #2 in 2 motor Front Left D9->IN2 L298N Front Side

//Motor Front Right
#define ENB_F_FR 11  // Enable/speed motor Front Right D11->ENB L298N Front Side
#define IN_F_FR_3 12 // L298N #2 in 3 motor Front Right D12->IN3 L298N Front Side
#define IN_F_FR_4 13 // L298N #2 in 4 motor Front Right D13->IN4 L298N Front Side

//Motor Back Left
#define ENA_B_BL 5  // Enable/speed motor Back Left D5->ENA L298N Back Side
#define IN_B_BL_1 2 // L298N #1 in 1 motor Back Left D2->IN1 L298N Back Side
#define IN_B_BL_2 3 // L298N #1 in 2 motor Back Left D3->IN2 L298N Back Side

//Motor Back Right
#define ENB_B_BR 6  // Enable/speed motor Back Right  D6->ENB L298N Back Side
#define IN_B_BR_3 4 // L298N #1 in 3 motor Back Right D4->IN3 L298N Back Side
#define IN_B_BR_4 7 // L298N #1 in 4 motor Back Right D7->IN4 L298N Back Side

电位器调节电机速度,我们计算 speedCar 中的值

int speedCar = 0; // 50 - 255. // calculated with potValue value 
int speed_Coeff = 4; // to use to slow down the speed of internal motors when turning 
int potValue = 0; // potentiometer reading

下一个常数值是确定电机必须通电多少毫秒才能旋转到预定义角度的关键值

const float timeFact = 0.78; // valid for 1 degree turn and motor Vcc=5.3V and max speedCar

我从理论上的理想值 timeFact = 0.78(从表“理论”中获得的近似值)开始。

turnLeft 和 turnRight 函数的工作方式相同。 因此我将解释 turnLeft

void turnLeft(int degree = -1) // valid for 1 degree turn and motor Vcc=5.3V and max speedCar

参数 degree 是可选的,如果我不提供它,则将传递值 -1,并且该函数将表现为标准 turnLeft 函数。 提供 90 的值,我将期望一个就地左转 90 度,依此类推。

正如我所想,我不会期望转弯 90 度,但甚至连糟糕的 10 度也没有!

此函数利用差速转向装置,其中要左转,每侧(左侧和右侧)的两个车轮必须以相同的速度反向旋转

void turnLeft(int degree = -1)
{

  digitalWrite(IN_F_FL_1, LOW);
  digitalWrite(IN_F_FL_2, HIGH);
  analogWrite(ENA_F_FL, speedCar);

  digitalWrite(IN_F_FR_3, HIGH);
  digitalWrite(IN_F_FR_4, LOW);
  analogWrite(ENB_F_FR, speedCar);

  digitalWrite(IN_B_BL_1, LOW);
  digitalWrite(IN_B_BL_2, HIGH);
  analogWrite(ENA_B_BL, speedCar);

  digitalWrite(IN_B_BR_3, HIGH);
  digitalWrite(IN_B_BR_4, LOW);
  analogWrite(ENB_B_BR, speedCar);

  if (degree > -1)
  {
    delay(timeFact * degree);
    stopRobot();
  }
}    

现在,机器人没有转动 90 度,而是左转了大约 9 度。

下载 robot_9_degree.mp4

也许它保持了之前发现的相同的线性比率(在 Vcc 和 RPM 之间),所以

如果使用 timeFact = 0.78 我得到了 9 度,那么要做 90 度转弯,我必须使用 timeFact = 7.8 吗?

让我们试试!

下载 robot_90_degree.mp4

我们到了! 它正在工作!

我们达到了目标! 我们可以向我们的机器人发送 turnLeft(90)、turnLeft(180)、turnRight(360) 命令,并具有可接受的近似值,而无需购买特定的传感器。

安装

下载 Arduino 草图,解压缩并将其上传到你的 Arduino。

历史

2018-08-06:首次发布

© . All rights reserved.