除了使用传感器对各种外部物理量进行感知之外,能够对实际物体的运动进行相应的控制也是互动设计中不可或缺的一部分。在所有这类动力装置中,电机显然是最常见、最基本、最便宜的解决方案了,常用的电机的种类有很多种,如直流电机,步进电机,伺服电机,减速电机等,并且每一种电机的控制方法都有所不同。
如果你是一个电子高手,控制普通的直流电机用几个三极管就行了,否则话像L293这样的芯片将是一个更好的选择。L293芯片的核心是两个H-桥,所有的H-桥芯片都具有如下一些引脚:
- 逻辑输入
- 逻辑电压
- 电源电压
- 电源输出
- 地
其中逻辑电压引脚采用与微控制器相同的电压和电流,电源电压采用与运行电机所需要的电压和电流。逻辑输入引脚连接到用来向H-桥输出控制信号的微控制器上的引脚,而电源输出引脚则连接到电机上。
这么专业的术语翻译到Arduino上可以这样来理解。首先,我们需要两套电源,一套用来给Arduino供电,一套用来给电机供电。其次,我们需要用到Arduino的数字I/O管脚来控制L293,并把电机接到L293上接受控制。说到这里,正好解释一下Arduino的供电系统,通常Arduino有三种供电方式:
- USB供电
- 电池供电
- 变压器供电
后两者在Arduino上统称为外部供电。供电方式的选择是通过Arduino上的电源选择跳线来实现的,当把跳线接到“USB”一端时,采用的是USB供电方式,这时整个Arduino及其附属电路上的电源都由PC的USB接口提供,此时电流一般比较小,只能驱动功率比较小的电路,如LED等。当把跳线接到“EXT”一端时,采用的是外部供电方式,这时一般能够驱动比较大的设备,如电机等。Arduino内部一套电源转换电路,可以用来将外部供电时的电压(6-12V)转换成内部所需要的5V电压,使用L293控制电机正是需要这两套电源。
下面这个就是基于L293D芯片的Arduino专用电机驱动扩展板,它能够用来驱动两个直流电机。
使用该扩展板来驱动直流电机非常简单,只需要将扩展板插到Arduino上,同时将直流电机连接到扩展板上的motors引脚上就可以了。
正如上面所提到的,此时应该采用Arduino的外部供电方式,并使用变压器或者电源为Arduino提供电力。这里我选用的是9V变压器和9V的直流电机:
电机扩展板上motors引脚的上面两针是用来接电机1的,下面两针是用来接电机2的。
电路连接好之后,剩下的工作就是如何用程序进行控制了。使用这一扩展板我们能够控制直流电机的转动方向和转动速度,其中对转动方向的控制是通过Arduino上的数字I/O引脚12和13来实现的,对转速的控制则是通过数字I/O引脚9和10来实现的。
如果要控制直流电机1,我们需要向引脚9输出相应的PWM信号来控制电机的速度,同时设置引脚12和13的高低电压来控制电机的方向。如果要控制直流电机2,则需要向引脚10输出相应的PWM信号来控制电机的速度,此时也是通过设置引脚12和13 的高低电压来控制电机的方向的。
电机扩展板上带有S1和S2两个按钮,分别对应于Arduino数字I/O的7号和6号管脚 ,并且在按下时为低电平。因此我们可以像下面的程序这样利用S1来控制电机1的正反转:
int switchPin = 7; // switch pin
int dir1Pin = 12; // direction 1
int dir2Pin = 13; // direction 2
int speedPin = 9; // spped pin
void setup() {
pinMode(switchPin, INPUT);
pinMode(dir1Pin, OUTPUT);
pinMode(dir2Pin, OUTPUT);
pinMode(speedPin, OUTPUT);
}
void loop() {
// switch is pressed
if (digitalRead(switchPin) == LOW) {
// set spped
analogWrite(speedPin, 250);
// set direction
digitalWrite(dir1Pin, LOW);
digitalWrite(dir2Pin, HIGH);
} else {
analogWrite(speedPin, 100);
digitalWrite(dir1Pin, HIGH);
digitalWrite(dir2Pin, LOW);
}
}
在将上述程序下载到Arduino上并运行起来之后,我们就可以通过按S1键,来改变电机的旋转速度和方向了:)
P.S. 在调试这一电机扩展板的奇遇是,在将其插入到Arduino Diecimila的贴片版本上时,发现MC33269异常热,并且电机偶尔才能工作。进一步设计发现如果把整个扩展板很好地插入到Arduino上时,5V和Gnd之间居然是短路的。一开始并没有发现问题在哪,后来才发现扩展板上的电容C9与USB接头的外壳短路了!将其锡去掉一下,并抬高扩展板时问题得到解决。实际使用时请检查下图电容下面的引脚是否与USB接口的外壳短路了,特别是对于贴片版本来讲,最好在通电前用万用表检查一下5V和Gnd之间的电阻值:)

No tags





techwolf · 2008/05/05 at 11:27 AM
短路的发现很有意义啊,应该把USB接口用绝缘的胶布粘起来。
以后的叠加扩展版也要注意类似问题,在焊接后刷绝缘漆也可以哈
Author comment by flamingoeda · 2008/05/09 at 1:56 AM
是的,这个经验很重要,不过板子在外接电源的情况下短路还没有完全烧掉,还是很欣慰:)
Yeung_bt · 2008/05/21 at 1:55 PM
I have a question.
When I apply a ‘HIGH’ to pin 13, the voltage of pin 13 will be about 3.6V and suddenly changed to 1.9V as the LED (connected to pin 13 on board) lit up. And therefore the motor 2 cannot operator, i.e. not moving.
Do you have any idea ? Thanks.
Author comment by flamingoeda · 2008/05/25 at 5:34 PM
I didn’t meet this problem, how about motor 1? And how you power up your board with motor? By external 12V power?
Yeung_bt · 2008/05/25 at 11:18 PM
I solved the problem now.
I just remove the led connected to pin 13 onboard. This led is connected to pin 13 via a 470 ohm resistor. And when this led lit up, the voltage on pin 13 will be set to about 2V by the led.
I’m using the Arduino NG. And they solved this problem by removing the led in later NG version.
Fige · 2008/12/19 at 12:09 AM
flamingoeda!你好,我邮购的motor shield v2.0的板子,引脚的使用是不是和原来的一样?也是9,10,12,13么?
Author comment by flamingoeda · 2008/12/19 at 1:01 PM
是的,是完全一样的;-)
Fige · 2008/12/20 at 9:58 PM
哦,我知道了,谢啦。
可是我用上面的例子写进去,12,13工作正常,9为什么量出来的motor电压不是0就是最高,不符合pwm,调不了速啊。
analogWrite(speedPin, 250);
analogWrite(speedPin, 100);
电压值一样,何故?请指点一下
Author comment by flamingoeda · 2008/12/21 at 7:52 PM
9, 10是调速用的,12, 13是控制方向的
一组应该是:
int dir1Pin = 12; // direction 1
int dir2Pin = 13; // direction 2
int speedPin = 9; // spped pin
另一组应该是:
int dir1Pin = 12; // direction 1
int dir2Pin = 13; // direction 2
int speedPin = 10; // spped pin
Fige · 2008/12/22 at 12:41 PM
呵呵,多谢,多谢。
好像和motor上的电压没关系,可以调速了
看来我得多学点电子方面的基础知识了
tlfong01 · 2009/01/03 at 12:30 PM
I very much appreciate Flamingoeda’s troubleshooting report and advice. I respect those who point out their own mistakes and share the lesson with peers.
I think it is difficult for someone to confess mistakes, carelessly or otherwise. But if mistakes are not reported, others may repeat the same, or even fatal mistakes. Of course Famingoeda is also blogging his successes, so that we need not wasting our effort and time reinventing wheels.
Thank you very much Flamingo.
> 在调试这一电机扩展板的奇遇是, 发现MC33269异常热,
> 并且电机偶尔才能工作。… 5V和Gnd之间居然是短路的。
> 一开始并没有发现问题在哪,后来才发现扩展板上的电容
> C9与USB接头的外壳短路了!将其锡去掉一下,并抬高扩
> 展板时问题得到解决。实际使用时请检查下图电容下面的
> 引脚是否与USB接口的外壳短路了,特别是对于贴片版本
> ,最好在通电前用万用表检查一下5V和Gnd之间的电阻值:)
[ENDS]