Arduino Uno直流电机控制器概念说明

时间:2016-07-16 04:45:34

标签: arduino arduino-uno

我刚开始学习Arduino。我想到了一个机器人,我希望获得一些自主权。我试图了解直流电机的电机控制。我试图查找资源,但找不到足以解释我问题的资源。 我无法理解(作为一个comp sci undergrad)我在编写电机代码时做错了怎么样。

我的代码只是用于运行电机进行测试:

// MotorA
int dir1PinA = 7;
int dir2PinA = 5;
int speedPinA = 6;

//motor B

int dir1PinB = 4;
int dir2PinB = 2;
int speedPinB = 3;


void setup() {
  //Serial.begin(9600);
  pinMode (dir1PinA, OUTPUT);
  pinMode (dir2PinA, OUTPUT);
  pinMode (speedPinA,OUTPUT);
  pinMode (dir1PinB, OUTPUT);
  pinMode (dir2PinB, OUTPUT);
  pinMode(speedPinB, OUTPUT);

  // put your setup code here, to run once:

}

void loop() {
  analogWrite(speedPinA, 500);
  analogWrite(speedPinB, 500);
  digitalWrite (dir1PinA, LOW);
  digitalWrite (dir2PinA, HIGH);
  digitalWrite (dir1PinB,HIGH);
  digitalWrite (dir2PinB, LOW);

  // put your main code here, to run repeatedly:

}

我只是试图以一定的速度运行电机无济于事。我找到了一个示例代码,它使用相同的方法来控制电机,但只有一个额外的循环和变量 speed

有效的测试代码是:

//Motor A
int dir1PinA = 7;
int dir2PinA = 5;
int speedPinA = 6;

//motor B
int dir1PinB = 4;
int dir2PinB = 2;
int speedPinB = 3;

unsigned long time;
int speed;
int dir;

void setup ()
{
pinMode (dir1PinA, OUTPUT);
pinMode (dir2PinA, OUTPUT);
pinMode (speedPinA, OUTPUT);
pinMode (dir1PinB, OUTPUT);
pinMode (dir2PinB, OUTPUT);
pinMode (speedPinB, OUTPUT);
time = millis ();
speed = 0;
dir = 1;
}

void loop ()
{
analogWrite (speedPinA, speed);
analogWrite (speedPinB, 555 - speed);

// set direction
if (1 == dir)
{
digitalWrite (dir1PinA , LOW);
digitalWrite (dir2PinA, HIGH);
digitalWrite (dir1PinB, HIGH);
digitalWrite (dir2PinB, LOW);
}
else
{
digitalWrite (dir1PinA, HIGH);
digitalWrite (dir2PinA, LOW);
digitalWrite (dir1PinB, LOW);
digitalWrite (dir2PinB, HIGH);
}

if (millis () - time> 5000)
{
time = millis ();
speed += 20;
if (speed> 555) {speed = 0;}

if (1 == dir)
{dir = 0;}
else
{dir = 1;}
}
}

现在我明白有循环和额外的变量,但理论上他们不应该只需要以一定的速度运行电机。我的问题是我在第二个草图中缺少的是什么,但对于电机的运行绝对至关重要?

如果这是一个noob时刻,我想提前道歉,但我尝试过,无法找到任何逻辑lol。

2 个答案:

答案 0 :(得分:0)

在“工作”Arduino代码( c ++,是的,由c ++编译器编译)中,你的两个电机(B)中的一个立即启动,另一个在复位后5秒(甚至是后来)? 并且立即启动的电机在5秒后改变方向?

否则,尝试对工作样本进行小的修改,以简化,以获得更多的理解。
例如。首先删除“目录”更改和“其他”部分

答案 1 :(得分:0)

好的,首先我会调试你的代码,我会对你的硬件做一些假设,因为你没有发布任何照片或原理图,最后我会提供一个有效的解决方案。

您的代码:

所以我的第一个假设是你的电机有3个引脚,因为你在高电平和低电平之间切换两个引脚,可能是为了反向电流,然后是一个来设置速度。

正如我猜你知道的那样,为了让电机反转你需要翻转电流的方向。将这些引脚设置为高电平和低电平实际上不会反转电流。此外,Arduino还没有足够的输出电流来驱动直流电机。你可以慢慢运行一个。如果你想做更多,你需要一个外部电源。

沿一个方向驱动直流电机:

这可能是最容易做到的事情。你只需要一个晶体管,二极管和电阻器。 Here is a tutorial

双向驱动四台直流电机

如果您想在两个方向上驱动直流电机,则需要翻转电流的方向。这一点看起来很复杂,直到你意识到他们已经为你做了一件事来做这件事。它被称为电机控制。它只是一个带有几个H桥的盾牌。他们相当便宜。

我喜欢AdaFruit's。我有一对,不久前我用它制造了一个机器人。

Tutorial on how to use the Adafruit MotorShield