Arduino中国 | Flamingo EDA

Archive for April 2009

Apr/09

19

Arduino L298N 电机驱动扩展板

之前设计的基于L293D的直流电机驱动扩展板,虽然也能够接两个直流电机,但由于从于对接口数目的考虑,因此无法分别控制两路电机的旋转方向。此外,在带动较大功能的电机时,L293D也显得稍有些不足。出于这些考虑,在吸纳了一些网友的建议之后,此处设计了一个基于L298N的电机驱动扩展板。L298N是S一种高电压、大电流电机驱动芯片,其中最高工作电压可达46V,持续工作电流为2A,瞬间峰值电流更是可达 3A。该芯片内含两个H桥的高电压大电流全桥式驱动器,可以直接驱动两个直流电动机。

该扩展板在电路连接上首先要考虑的是如何给电机供电,如果你的Arduino采用的是外部供电方式(比如接9V的变压器时),而且该供电方式同你的电机也是驱配的(比如9V的直流电机),那么就可以将电机接到MA(A+和A-两个接线座)或者MB(B+和B-两个接线座)上:

然后再将VM跳线接到VIN端就:

另外一起连接方式是直接给电机单独提供一个不超过35V的电源,分别接在电机扩展板的GND和VEX接线座上,电机同样还是接在MA或者MB上:

但VM跳线此时则需要接到VEX端:

从控制原理上讲,L298N与L293D基本是一样的,都是分别通过两根方向引脚来控制电机的旋转方向,再通过一根使能引脚上的PWM信号来控制电机的转速。具体到该扩展板上,电机MA的方向引脚为Arduino的13和12号管脚,速度引脚则是Arduino的10号管脚;电机MB的方向引脚为Arduino的11和8号管脚,速度引脚则是Arduino的9号管脚。示例代码如下所示:

// motor A
int dir1PinA = 13;
int dir2PinA = 12;
int speedPinA = 10;

// motor B
// motor A
int dir1PinB = 11;
int dir2PinB = 8;
int speedPinB = 9;

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, 255 - 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 > 255) {
      speed = 0;
    }
    if (1 == dir) {
      dir = 0;
    } else {
      dir =1;
    }
  }
}

为了对电机的工作状态有更加直观的理解,扩展板上还专门添加了4个LED来分别表示电机的转动方向,其亮度也正好表明了电机转速的高低,非常方便:

另外,该扩展板上还设计了一个VL跳线,是用来对为L298N选择逻辑电平的,通常我们接到V5V这端,即从Arduino板子上取得该逻辑电压。

上述VL跳线如果接VEX的话,相应的逻辑电压则是通过电机外接电源VEX分压后得到的,该分压器采用的是LM3940,其最高耐压值为35V,这也一定程序上决定了该扩展能够随受的最高电压为35V。

Apr/09

17

ATmega328P与Arduino 0015

最近Arduino的一系列举动似乎是要走高端路线,首先是将控制器由ATmega168升级到了ATmega328,紧接着又推出了基于ATmega1280的Arduino MEGA。这些改动一方面是将控制器的存储容量进行了扩充,另一方面则是对接口进行了扩展,而这一切似乎都在向大家表明Arduino需要支持的是更加复杂的应用。

虽然仔细想想这与我们的国情好像有些不符,但还是忍不住诱惑对Arduino进行升级。与之前的ATmega168相比,ATmega328的除了内存扩成32K外,其它基本上没有任何改动。这样的话升级起来倒是比较容易,只要将Arduino上的控制器换成ATmega328就可以了。

首先是芯片购买的问题,国内的市场上目录还很难找到ATmega328P-PU这颗芯片,贴片版本的倒是有,真是怪事:( 最后没有办法只好直接从国外订购了,付出的代价当然就是时间和金钱了,运费加上关税,价格真是贵了不少。芯片到手之后,随之遇到的问题就是bootloader的烧写,之前买到的编程器软件比较旧,还不支持这么新的芯片,几经周折将下载器软件进行了升级,才最终完成了对Arduino bootloader的烧写。整个过程中还抽空试了用最近做的USBTinyISP下载线对ATmega328P进行烧写,均一切正常;-)

先给张配上了ATmega328P之后的Arduino照片:

软件上我们则需要升级到Arduino 0015版,并且要选中“Tools”->“Board”->“Arduino Duemilanove w/ ATmega328”,这样才能正常进行程序的下载:

Theme Design by devolux.nh2.me