我刚开始学习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。
答案 0 :(得分:0)
在“工作”Arduino代码( c ++,是的,由c ++编译器编译)中,你的两个电机(B)中的一个立即启动,另一个在复位后5秒(甚至是后来)? 并且立即启动的电机在5秒后改变方向?
否则,尝试对工作样本进行小的修改,以简化,以获得更多的理解。
例如。首先删除“目录”更改和“其他”部分
答案 1 :(得分:0)
好的,首先我会调试你的代码,我会对你的硬件做一些假设,因为你没有发布任何照片或原理图,最后我会提供一个有效的解决方案。
您的代码:
所以我的第一个假设是你的电机有3个引脚,因为你在高电平和低电平之间切换两个引脚,可能是为了反向电流,然后是一个来设置速度。
正如我猜你知道的那样,为了让电机反转你需要翻转电流的方向。将这些引脚设置为高电平和低电平实际上不会反转电流。此外,Arduino还没有足够的输出电流来驱动直流电机。你可以慢慢运行一个。如果你想做更多,你需要一个外部电源。
沿一个方向驱动直流电机:
这可能是最容易做到的事情。你只需要一个晶体管,二极管和电阻器。 Here is a tutorial
双向驱动四台直流电机
如果您想在两个方向上驱动直流电机,则需要翻转电流的方向。这一点看起来很复杂,直到你意识到他们已经为你做了一件事来做这件事。它被称为电机控制。它只是一个带有几个H桥的盾牌。他们相当便宜。
我喜欢AdaFruit's。我有一对,不久前我用它制造了一个机器人。