Engine Driver

Coordinator
Aug 13, 2010 at 9:00 AM
Motor Shield v2

 

 

Технические возможности M–Shield позволяют реализовать разнообразные проекты, связанные с подключением и управлением слаботочными двигателями следующих типов:

  • четырёх двигателей постоянного тока (ДПТ - DC motors);
  • двух шаговых двигателей униполярных или биполярных с одинарной или двойной обмоткой (ШД - stepper motors);
  • двух 5В сервоприводов (СП - servos).

 

 

Возможны следующие комбинации подключаемых к M–shield двигателей:

  • 2 СП + 4 ДПТ;
  • 2 СП + 2 ШД;
  • 2 СП + комбинации ШД и ДПТ, например: возможен вариант замены 1 ШД на 2 ДПТ или наоборот.
Технические характеристики
  • напряжение питания: +7...+ 24 В;
  • количество силовых каналов: 4;
  • максимально-продолжительный ток каждого канала: 0,6 А;
  • напряжение питания сервоприводов: 5 В;
  • возможность реверса каждого двигателя;
  • возможность независимого управления каждым каналом;
  • модуль полностью совместим со всеми известными моделями Freeduino/Arduino: Max Serial, Through-Hole, Diecimila, 2009, Duemilanove, а также Arduino Mega.

Принципиальная схема по лицензии Creative Commons Attribution-ShareAlike 2.5

 

Драйвер двигателей L293D

Управление двигателями осуществляется двумя микросхемами L293D. Каждая микросхема – это четырёхканальный драйвер со встроенными обратными диодами для защиты микросхемы от перенапряжений при работе на индуктивную нагрузку.

Драйверы управляются парами, что позволяет реализовать на одной микросхеме два двуполярных канала управления с ШИМ управлением.

Основные характеристики микросхемы:

  • напряжение питания: +4,5... +36 В;
  • максимальный продолжительный ток в каждом канале: 0,6 А;
  • максимальный пиковый (<100 мс) неповторяющийся ток в каждом канале: 1,2 А;
  • защита от перегрева.

Более полное описание можно найти в оригинальной документации производителя:

http://focus.ti.com/lit/ds/symlink/l293d.pdf

http://www.freeduino.ru/arduino/files/l293d.pdf

Питание.

В принципиальной электрической схеме M-Shield существуют две отдельные цепи питающего напряжения: слаботочная и силовая.

Питание слаботочной сигнальной цепи, а также подключаемых сервомоторов осуществляется от стабилизированного +5 В источника Freeduino. Недопустимо использовать эту цепь для питания двигателей постоянного тока, т.к. это приведет или к срабатыванию USB предохранителя или перегреву и выходу из строя стабилизатора напряжения +5 В на плате Freeduino.

Выбор источника питания силовой части модуля осуществляется при помощи джампера питания на M-shield: либо от источника внешнего питания +7...+12 В управляющей платы Freeduino, либо от дополнительного источника постоянного напряжения +6...+ 24 В, подключаемого к двум клеммам разъема питания на M-Shield.

Крайнее левое положение джампера выбора источника питания соответствует подключению внешнего источника питания +6... +24 В силовой части модуля, при этом цепь питания Freeduino/Arduino отключена.

Крайнее правое положение джампера соответствует питанию +7...+12 В от основной платы Freeduino/Arduino.

Перед подключением внешнего источника питания к клеммам M–shield обязательно убедитесь в правильности установки джампера питания, поскольку неверная его установка может привести к замыканию двух источников.

На рисунке приведена схема, поясняющая электрические соединения шин питания основной платы Freeduino/Arduino совместно и модуля M-Shield. 3-й штекер джампера питания не связан ни с одной из электрических цепей и предназначен для предотвращения утери перемычки при её переключении из одного положения в другое.

 

 

В настоящей версии M–Shield v2 верхнее значение напряжения питания ограничено используемыми электролитическими конденсаторами на максимальное напряжение 25 В и может быть увеличено до максимального для микросхемы L293D значения 36 В заменой конденсаторов С7 и С8.

Библиотека AFMotor

Существует удобная библиотека, упрощающая работу с модулем M-Shield, скачать которую можно с сайта разработчика, или у нас:

http://www.ladyada.net/make/mshield/download.html

http://www.freeduino.ru/arduino/files/AFMotor-08_12_2009.zip

Как и в большинстве случаев, установка библиотеки сводится к распаковке архива в подпапку \hardware\libraries\ папки с ПО Arduino.

Управление двигателями постоянного тока

Для управления двигателями постоянного тока используется класс AF_DCMotor. Ниже рассмотрены его основные методы и приведены примеры работы.

Определение параметров двигателя

Убедитесь, что параметры двигателя – номинальное напряжение и ток соответствуют используемому источнику питания и параметрам M-Shield.

Если потребляемый двигателем ток превышает номинальное для драйвера L293D значение в 0,6 А, можно увеличить значение продолжительного тока до 1,2 А путем параллельного подключения двигателя одновременно к двум портам, например к М1 и М2 и составлением соответствующего алгоритма управления.

Кроме того, с целью увеличения допустимой токовой нагрузки в два раза, можно напаять на микросхему L293D «нога к ноге» ещё одну L293D, это позволит управлять более мощными двигателями с максимально-продолжительным током в каждом канале управления до 1,2 А.

Вы также можете использовать две платы M-Shield, установив одну в разъемы другой, и подключив каждый двигатель к одноименным каналам обеих плат.

Подключение двигателей постоянного тока

Расположенные на плате M-Shield 5-контактные клеммники предназначены для подключения двигателей. Центральный контакт каждого клеммника – «земля», двигатели постоянного тока подключаются к крайним парам контактов, обозначенных по номерам каналов M1, M2, M3, M4.

AF_DCMotor – конструктор объекта

Вызов:

AF_DCMotor имя_объекта(номер_канала);

Создает экземпляр класса AF_DCMotor, принимает номер канала После создания объекта можно вызывать его методы.

Метод AF_DCMotor::setSpeed

Вызов:

имя_объекта.setSpeed(скважность)

Задает скважность ШИМ на канале в диапазоне от 0 до 255. Значение 0 соответствует напряжению 0 В на двигателе, значение 255 – полному напряжению питания.

Метод AF_DCMotor::run

Вызов:

имя_объекта.run(направление)

Задает направление движения двигателя (полярность прикладываемого напряжения). Параметр «направление» может принимать одно из следующих значений:

FORWARD – прямое направление вращения

BACKWARD – обратное направление вращения

RELEASE – остановка двигателя

Пример управления двигателями постоянного тока

Ниже приведен пример простой программы, осуществляющей ступенчатое изменение скорости вращения двигателя с интервалами в 3 секунды в следующей последовательности: +50, +75%, +50%, STOP, -50%, -75%, -50%, STOP. После завершения цикл будет повторяться.

#include <AFMotor.h>  //Подключаем заголовочный файл библиотеки

//Создаем объект для двигателя на 1 канале (M1)
AF_DCMotor motor(1);

void setup() {
}

void loop() {
  //Задаем направление движение вперед
  motor.run(FORWARD);
  //Устанавливаем скорость 50%
  motor.setSpeed(128);
  //пауза 3 секунды - двигатель крутится
  delay(3000);
  //увеличиваем скорость до 75%, и пауза 3 сек.
  motor.setSpeed(192);
  delay(3000);
  //Снижаем скорость до 50%, и пауза 3 сек.
  motor.setSpeed(128);
  delay(3000);
  //Останавливаем двигатель, и пауза 3 сек.
  motor.run(RELEASE);
  delay(3000);
  //Переключаем направление вращения
  //Двигатель начнет вращаться со скоростью 50%
  motor.run(BACKWARD);
  //пауза 3 секунды - двигатель крутится
  delay(3000);
  //увеличиваем скорость до 75%, и пауза 3 сек.
  motor.setSpeed(192);
  delay(3000);
  //Снижаем скорость до 50%, и пауза 3 сек.
  motor.setSpeed(128);
  delay(3000);
  //Останавливаем двигатель, и пауза 3 сек.
  motor.run(RELEASE);
  delay(3000);
}

Управление шаговыми двигателями

Благодаря тому, что вращение ротора осуществляется фиксированными шагами, без необходимости обратной связи по положению, шаговые двигатели часто применяются в различных устройствах и механизмах.

Подключение шаговых двигателей

M-Shield поддерживает одновременное подключение двух шаговых двигателей. Управление шаговыми двигателями осуществляется с помощью той же библиотеки AFMotor, что и для работы с двигателями постоянного тока.

Для подключения однополярного шагового двигателя к M-shield необходимо определиться, какой из выводов двигателя подключен к его соответствующей обмотке. Если у двигателя пять выводов, то один из них является средней точкой двух его обмоток, которая подключается к электрической цепи GND модуля. Остальные выводы это начало, и конец обмоток, которые подключаются к портам M-shield: M1 и M2 или к M3 и M4.

Подключение двуполярного шагового двигателя к M-Shield производится аналогично однополярному за исключением того, что у него отсутствует вывод средней точки обмоток двигателя.

AF_Stepper – конструктор объекта

Вызов:

AF_Stepper имя_объекта(число шагов, канал);

Создает экземпляр класса AF_Stepper, принимает число шагов на один оборот двигателя и номер канала. При подключении двигателя к портам M1 и M2 указывайте 1 в качестве номера канала, при подключении к портам M3 и M4 указывайте 2.

Метод AF_Stepper::setSpeed – задание скорости

Вызов:

имя_объекта.setSpeed(скорость)

Задает частоту вращения ротора в оборотах в минуту. При указании частоты вращения больше рекомендованной для используемого двигателя с учетом напряжения питания и момента сопротивления на валу, возможно пропускание двигателем шагов.

Метод AF_DCMotor::step – вращение на нужное число шагов

Вызов:

имя_объекта.step(число шагов, направление, тип шага)

число шагов – требуемое число шагов;

направление – либо FORWARD (вперед), либо BACKWARD (назад);

тип шага – один из 4 вариантов: SINGLE, DOUBLE. INTERLEAVE или MICROSTEP.

SINGLE – активация одной обмотки двигателя для совершения шага;

DOUBLE – активация двух обмоток двигателя, что обеспечивает больший вращающий момент;

INTERLEAVE – чередование между SINGLE и DOUBLE режимом, с двойной точностью и половинной скоростью вращения.

MICROSTEP – применение ШИМ для управления шаговым двигателем двигателем.

 

Задает направление движения двигателя (полярность прикладываемого напряжения). Параметр «направление» может принимать одно из следующих значений:

FORWARD – прямое направление вращения

BACKWARD – обратное направление вращения

RELEASE – остановка двигателя

Метод AF_Stepper::release – отключение двигателя

Вызов:

имя_объекта.release ()

По умолчанию шаговый двигатель удерживает свое положение после завершения шага, однако вызов release() отключает обмотки двигателя для осуществления свободного вращения ротора.

Пример управления шаговым двигателем

Ниже приведен пример простой программы, осуществляющей управление шаговым двигателем ST28, подключенным к портам M3 и M4 модуля.

 

 

У шагового двигателя ST28 32 шага на оборот, а также встроенный редуктор с передаточным числом 64, что дает 32*64=2048 шагов двигателя на один оборот выходного вала. В приведенном примере осуществляется поворот на один оборот в прямом направлении в режиме SINGLE, на один оборот в обратном в режиме DOUBLE, на пол-оборота в прямом направлении в режиме INTERLEAVE, и на пол-оборота в обратном в режиме MICROSTEP.

#include <AFMotor.h>  //Подключаем заголовочный файл библиотеки
//Создаем объект для двигателя на 2 канале (M3 и M4)
AF_Stepper motor(2048, 2);
void setup() {
  motor.setSpeed(10);  // 10 оборотов в минуту
}

void loop() {
  motor.step(2048, FORWARD, SINGLE);     //1 оборот
  motor.step(2048, BACKWARD, DOUBLE);    //1 оборот
  //в режиме INTERLEAVE скорость в 2 раза ниже, а шаги в
  //2 раза меньше. То же число полушагов даст 0.5 оборота
  motor.step(2048, FORWARD, INTERLEAVE); //0.5 оборота
  motor.step(1024, BACKWARD, MICROSTEP); //0.5 оборота
  motor.release();
  delay(1000);
}

 

...to be continued. Планируется расширение документации примерами работы с сервоприводами

 

Coordinator
Aug 13, 2010 at 9:16 AM

Управление силовой нагрузкой:

http://forum.easyelectronics.ru/viewtopic.php?f=14&t=311

 

Coordinator
Aug 13, 2010 at 10:25 PM

 

How many motors can I use with this shield?

You can use 2 DC servos that run on 5V and up to 4 DC motors or 2 stepper motors (or 1 stepper and up to 2 DC motors)

Can I connect more motors?

No, at this time it is not possible to stack the shield or otherwise connect it up easily to control 4 steppers, for example.

HELP! My motor doesnt work!
HELP! My motor doesnt work!...But the servos work FINE!

Is the LED lit? The Stepper and DC motor connections wont do a single thing if the LED is not lit

Don't bother writing up uploading code or wiring up motors if the LED doesn't light up, its not going to work.

What is the LED for?

The LED indicates the '9V' motor power supply is working. If it is not lit, then the DC/Stepper motors will not run. The servo ports are 5V powered and does not use the DC motor supply

Im trying to build this robot and it doesn't seem to run on a 9V battery....

Please read the user manual for information about appropriate power supplies

Can this shield control small 3V motors?

Not really, its meant for larger, 6V+ motors. In theory you should be able to get it working with 3V motors but I have no information on how to do so or whether it will work

What is the power connector on the shield for? How do I power my motors?

Please read the user manual for information about appropriate power supplies

My Arduino freaks out when the motors are running! Is the shield broken?

Motors take a lot of power, and can cause 'brownouts' that reset the Arduino. For that reason the shield is designed for seperate (split) supplies - one for the electronics and one for the motor. Doing this will prevent brownouts. Please read the user manual for information about appropriate power supplies

I have good solid power supplies, but the DC motors seem to 'cut out' or 'skip'

Try soldering a ceramic or disc 0.1uF capacitor between the motor tabs (on the motor itself!) this will reduce noise that could be feeding back into the circuit (thanks macegr!)

What if I need more than 600mA per motor?
What pins are not used on the motor shield?

All 6 analog input pins are available. They can also be used as digital pins (pins #14 thru 19)

Digital pin 2, and 13 are not used.

The following pins are in use only if the DC/Stepper noted is in use:
Digital pin 11: DC Motor #1 / Stepper #1 (activation/speed control)
Digital pin 3: DC Motor #2 / Stepper #1 (activation/speed control)
Digital pin 5: DC Motor #3 / Stepper #2 (activation/speed control)
Digital pin 6: DC Motor #4 / Stepper #2 (activation/speed control)

The following pins are in use if any DC/steppers are used
Digital pin 4, 7, 8 and 12 are used to drive the DC/Stepper motors via the 74HC595 serial-to-parallel latch

The following pins are used only if that particular servo is in use:
Digitals pin 9: Servo #1 control
Digital pin 10: Servo #2 control

Which pins are connected to the DC/Stepper motors?

The DC/Stepper motors are NOT connected to the Arduino directly. They are connected to the 74HC595 latch which is spoken to by the Arduino. You CANNOT talk directly to the motors, you MUST use the motor shield library

Huh? I don't understand...
How can I connect to the unused pins?

The analog pins (analog 0-5 also known as digital pins 14-19) are broken out in the bottom right corner.

Pin 2 has a small breakout since its the only truly unused pin

The remaining pins are not broken out because they could be used by the motor shield. If you are sure that you are not using those pins then you can connect to them by using stacking headers when assembling the kit or soldering onto the top of the header with wires, or using a "Wing shield"

I get the following error trying to run the example code:
"error: AFMotor.h: No such file or directory...."

Make sure you have installed the AFMotor library

How do I install the library?
I have two stepper motors and I want to run them simulaneously but the example code can only control one and then the other?

The stepper motor library step() routine does not have the ability to run both motors at a time. Instead, you will have to 'interleave' the calls. For example, to have both motors step forward 100 times you must write code like this:

for (i=0; i<100; i++) {
motor1.step(1, FORWARD, SINGLE); 
motor2.step(1, FORWARD, SINGLE);
}

No existing stepper motor driver has the ability to 'intelligently' interleave the steps. You will have to write a loop or use interrupts to control the motors the way you'd like.

What are some 'suggested motors'?

Most people buy motors from surplus shops and no motor will make everyone happy

However, since its a popular question, I suggest buying motors from Pololu (DC ServosDC motors) or Jameco (all sorts!) As well as the many surplus webshops.

Coordinator
Aug 16, 2010 at 9:23 AM

 

Смотрим по схеме со странички описания MotorShield.


Для управления сдвиговым регистром используются ноги 4, 7, 8, 12.
Для реализации ШИМ используются ноги 11, 3, 6, 5  - для двигателей 1, 2, 3, 4 соответственно.
Ноги 9, 10 выведены на разъем Servo, и фактически не задействованы.
Отсюда вывод - свободными остались все аналоговые входы (их же можно использовать как цифровые), ноги 0, 1, 2, 13, ноги 9 и 10 - хочешь для Servo, хочешь под свои цели.
Ну, и если не используются какие-то из четырех каналов управления двигателями, освобождаются соответствующие им ноги из списка 11, 3, 6, 5.

...некоторое неудобство, что никак не отказаться от использования ноги 12, а она участвует в аппаратном SPI, и через нее работает в частности Ethernet Shield (нога 11 тоже SPI) - из-за этого несовместимость MotorShield и EthernetShield. Но, наверняка можно перекидать ноги, и поправить библиотеку AFMotor.