01.03.2009

MotorShield от Adafruit

В свое время заказал в Adafruit плату Motor Shield. Трудно, конечно, признаваться в этом, но я почему-то решил, что в комплекте будут моторчики. Но, увы - когда посылка пришла, там была только печатная плата и комплект деталей. Но постепенно руки у меня до нее все-таки дошли.



Отправная точка для изучения - страница на сайте ladyada.

На картинке наглядно видно, что и как можно подключать к этому Motor Shield:



  • Моторы постоянного тока с потреблением 600 мА, 4,5...36В, до 4-х штук.
  • Шаговые двигатели разных типов (неполярные, двуполярные и т.п), до 2-х штук
  • Хобби-серво 5В - 2 штуки.

В схеме ничего сверхъестественного нет (хотя, на мой вкус, она ужасна - какой-то винегрет из отдельных частей, как они взаимосвязаны - на первый взгляд неясно):



Arduino в основном управляет микросхемой 74HC595N - это 8-битный сдвиговый регистр с последовательным входом и параллельным выходом, а также защелкой и возможностью поставить эти самые выходы в состояние высокого импенданса.

Насколько я понял, Arduino должен последовательно загружать в этот регистр код(ы), которые в параллельном виде поступают на две микросхемы L293D - а вот это уже обычные H-мосты для управления моторами.

Чтобы не вникать во все тонкости, можно скачать библиотеки с сайта, затем распаковать их в Arduino/hardware/library. Как и в случае с любой другой библиотекой, она появится в подменю Arduino IDE "Import Library", а программировать после этого становится довольно просто.

Но, прежде чем начинать экспериментировать, есть один важный момент. На плате располагаются клеммники:



Слева - разъемы для подключения моторов M1,M2, справа - для M3,M4. И еще - обратите внимание, внизу: двухконтактный клеммник EXT_PWR, джампер соединения питания с Arduino JP1 и светодиод питания. Очень важно правильно подать питание на моторы, иначе в лучшем случае ничего не заработает.

Первым делом, вот более крупная схема питания при соединении Motor Shield с Arduino:



Напомню, что Arduino c USB питается либо от этого самого USB, либо от внешнего разъема (именно последний случай изображен на схеме). Варианты такие:
  1. Питаем Arduino и моторы от одного источника постоянного тока: подключаем этот источник к DC-входу Arduino или EXT_PWR на шилде, замыкаем джампер JP1; если у вас Diecimila, то на ней джампер выбора питания надо ставить в EXT. Вообще, питать моторы и Arduino от одного источника питания - плохая идея, Arduino может постоянного сбрасываться и вообще нестабильно работать.
  2. Питаем Arduino от USB, а моторы - от отдельного источника постоянного тока. На Diecimila джампер выбора питания ставим в USB, удаляем джампер JP1 на шилде, подключаем USB к Arduino, а питание моторов - на шилд в EXT_PWR. Если у вас Diecimila, можно альтернативно подавать питание моторов и через DC-разъем - тогда JP1 - напротив, надо замкнуть. А вот если вы - владелец Duemilanove, то последнее замечание явно не для вас, потому что на вашем Arduino нет джампера и выбор питания происходит автоматически.
  3. Питаем Arduino и моторы от двух независимых источников постоянного тока. Удаляем джампер JP1 на шилде, подключаем первый источник через DC-вход к Arduino, а второй - в EXT_PWR на шилде (ну и на Diecimila джампер выбора питания - выставляем в EXT).
Внимание: соблюдайте полярность на EXT_PWR: оно подается после высоковольтного защитного диода D1 на Arduino.

Учтите, если вы все правильно подключили - светодиод должен загореться! Если он не горит, перечитайте еще раз варианты выше или тоже самое на родном английском языке.

Самое время найти подходящий мотор для экспериментов. Где-то в пыльном углу я откопал радиоуправляемую модель гоночной машины, которую коллеги презентовали мне на один из дней рождения. Времени прошло довольно много, и я решил, что пришла пора ей послужить в немного другом качестве.

Что нужно для платформы робота? Мотор и трансмиссия, конечно же! И то, и другое там было, и я не долго думая водрузил Arduino, Motor Shield на основание:




Довольно быстро выяснилось, что на заднем мосту (классика) стоит мотор на 12 В, который надо отключить от исполнительной платы радиоуправления (рыжая справа на фото) и подключить к Motor Shield. Питается все это дело по варианту 3, поэтому слева можно разглядеть черный прямоугольник аккумулятора-"кроны". Очень рекомендую: стоит как две алкалиновых батарейки такого же типа, а служит намного дольше. Моторы питаются от батарейного отсека, который располагается по центру в днище платформы.

В качестве примера, я написал движение взад-вперед, вот как это выглядит:

#include ;

AF_DCMotor motor(2, MOTOR12_1KHZ); // create motor #2

void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Motor test!");
motor.setSpeed(160); // set the speed to 200/255
}

void loop() {
motor.run(FORWARD); // turn it on going forward
delay(1000);
motor.run(RELEASE); // stopped
delay(1000);
motor.run(BACKWARD); // the other way
delay(1000);
motor.run(RELEASE); // stopped
delay(1000);

}

Главное - не промахнуться со скоростью в setSpeed - если будет мало, платформа не тронется с места, много - улетит в стену. Увеличивая значение в setSpeed, скорость можно набирать и постепенно.

Таким образом, я минут 7 созерцал мой "шедевр", который дергался взад и вперед, раздумывая, как бы научить его еще и поворачивать. Но это - видимо уже в следующей статье ;)

Кстати, всех с первым днем весны!

3 комментария:

  1. в оной плате используется не L293D, а SN754410 (как написано на сайте)

    долго не мог понять, изучая схему, где я туплю, ибо у этих микрух распиновка разная :)

    ОтветитьУдалить
  2. Коллега, не согласен по всем пунктам: на плате именно L293D, а распиновка у L239D и SN754410 в PDIP - одинаковая. Cама автор рекомендует использовать именно L239D, подробно объясняя, почему.

    Вы, наверное, с какой-то другой платой перепутали.

    ОтветитьУдалить
  3. ага, значит у меня даташит на 239ку кривой.

    извиняюсь :)

    ОтветитьУдалить