L-Motor Shield



Долго, нереально долго шёл к свету этот шилд. Неприятности и грабли преследовали и тормозили. Но всё же, наконец, мы его сделали! Встречайте – L-Motor Shield.
Ничего особенного вобщем-то в нём нет, просто моторшилд на «Эль-ке» (L293) каких много напридумывали. Мы вот тоже решили свой такой сделать, с некоторыми улучшениями, дополнениями и фишечками.
L-Motor Shield
Итак:

Два канала для управления (скорость и направление) коллекторными двигателями с током потребления до 1А и напряжением питания до 40В.
Или один канал для управления шаговым двигателем.
Светодиоды — индикатор питания (логической части) и режима работы двигателей – направление вращения и скорость(удобно при отладке без подключения двигателей)
Помимо стандартных сигналов – DIR и PWM (направление и скорость) для каждого канала имеется дополнительный сигнал – BRK (тормоз), который переводит двигатель в режим торможения не зависимо от состояния остальных входов.
Четыре канала управления сервомашинками(могут работать одновременно с двигателями).
Входы шилда не занимает выводов интерфейсов – SPI(почти), UART, I2C.
Входы шилда не закреплены жёстко за определёнными пинами ардуины и могут быть, при необходимости, легко переключены.
Мощный (до 5А), регулируемый (по умолчанию 5В, переключается на 4.8В или 6В) стабилизатор для питания сервомашинок.

Возможность питания:
— Силовой части двигателей — как от входного питания ардуины, так и от внешнего источника (до 40В)
— Стабилизатора серво части(опция) — как от входного питания ардуины, так и от внешнего источника (до 40В)
— Логической части управления двигателями — как от 5В выхода Ардуины, так и от стабилизатора серво части (таким образом шилд можно превратить в самостоятельную плату не зависимую от ардуины)

Несколько вариантов удешевления:
— с незапаянными пин экстендерами — для самостоятельной запайки дргих видов разъёмов или использования отдельно от ардуино.
— с незапаянной серво частью — если нет необходимости управлять сервомашинками.



Теперь развёрнуто, с картинками и по-порядку.

Сначала про входы.
Изучив существующие варианты моторшилдов, я с удивлением обнаружил ряд странностей. Во первых нет ничего напоминающего стандарт на расположение выводов для моторшилда – входы у всех одинаковые (DIR и PWM – направление и скорость) но использует их кто во что горазд. Точнее, сажает куда попало – так что подражать оказалось нечему =\ . Так же, многие моторшилды занимают выходы интерфейсв UART (0 и 1 пины) или SPI (11, 12, 13 пины), что вообще ни в какие ворота не лезет =\.
Ни один моторшилд не сможет без переделок работать с ардуиной на 8-й меге (выходы ШИМ у неё только на 9, 10, 11 ), а ведь 8кб флеша хватит многим =)
Ну и всегда меня удручала жёсткая фиксированность входов у шилдов – чтоб собрать двух-трёх этажный бутерброд придётся попотеть выбирая производителей — так чтоб не возникли конфликты. Ну а если мне надо несколько одинаковых шилдов набутербродить?
В общем, вооружившись этими, без сомнения, сомнительными доводами выбрали именно такое расположение – чтоб и интерфейсы свободны, и на восьмой меге заработало, и чтоб перекинуть без осложнений можно было.

Надо всего лишь обрезать тонкую дорожку соединяющую площадки паяльного джампера и припаять проводок к интересующему пину (вот, например, взяли и перебросили вход DIR1 на A1).


Для удобства подобных модернизаций, входы шилда снабжены отверстиями. Так же, отверстия дублируют все пины ардуины (с подписями).
Обрезанная перемычка может быть легко восстановлена – просто посадите соплю (каплю припоя) на площадки =).

Управляться всё это дело может обычными библиотеками, только подправить их придётся(под наше расположение входов) или входы перекомутировать на шилде.
Но чтоб ничего этого не делать уважаемый Burjui написал трушную библиотеку полную синтаксического сахара (документация в архиве).
Самую свежую версию из репозитория всегда можно скачать zip-архивом по фиксированной ссылке

#include <Servo.h>
#include <LMotorShield.h>

LMotorShield lms;

void setup()
{// инициализируем библиотеку для управления и моторами и сервами
  lms.begin(LMS_MOTORS | LMS_SERVOS);
}

void loop()
{
  lms.motorSpeed(1, 30); // первому двигателю ставим скорость 30
  lms.motorDirection(1, LMS_FORWARD); //первому двигателю задаём направление вращения - прямо
  lms.motorSpeed(2, 30); // второму двигателю ставим скорость 30
  lms.motorBackward(2);  // второй двигатель запускаем назад

  lms.multipleServoWrite(LMS_SERVOS, 90); // все сервы повернуть на 90 градусов

  delay(2000);

  lms.multipleMotorSpeed(LMS_MOTORS, 60); // обоим моторам задаём скорость 60

  lms.servoWrite(1, 30); // выставляем сервы по-одной, на разные углы
  lms.servoWrite(2, 60); // вторая на 60 градусов
  lms.servoWrite(3, 120); // третья на 120
  lms.servoWrite(4, 150); // ...ну я надеюсь понятно, да?=)

  delay(2000);

  lms.multipleMotorStop(LMS_MOTORS); // затормаживаем оба мотора сразу
  lms.multipleServoWrite(LMS_SERVO1 | LMS_SERVO2, 0); // первую и вторую сервы в 0 градусов
  lms.multipleServoWrite(LMS_SERVO3 | LMS_SERVO4, 180); // 3 и 4 на 180

  delay(2000);

  lms.motorRun(1); //растормаживаем 1 мотор (поедет со скоростью 60 вперёд)
  lms.motorRun(2); //растормаживаем 2 мотор (поедет со скоростью 60 назад)
}

Шаговым двигателем управлять можно стандартной библиотекой (Stepper http://www.arduino.cc/en/Reference/Stepper) только надо выставить HIGH на входах PWM (3 и 11) или если надо сэкономить пины — просто обрежьте джампера идущие к ним и посадите PWMы на питание, через 1к резистор. Управляется двигатель через входы DIR (8 и 7).

#include <Stepper.h> //подключим библиотеку

const int stepsPerRevolution = 48;  // число шагов на оборот вашего шаговика

// инициализируем библиотеку, устанавливаем входы управления шаговикомy - 8 и 7:
Stepper myStepper(stepsPerRevolution, 8,7);

void setup() {
  // зададим скорость вращения:
  myStepper.setSpeed(50);
 // для работы с нашим моторшилдом надо выставить единички на входах PWM1 и PWM2
    digitalWrite(3, HIGH); // т.е. на 3 и 11 выводах
    digitalWrite(11, HIGH);
}

void loop() {
  // прошагаем полный оборот в одну сторону:
  myStepper.step(stepsPerRevolution);
  delay(500);// постоим пол-секунды

  // и прошагаем полный оборот в другую сторону:
   myStepper.step(-stepsPerRevolution);
  delay(500);
}

Для отладки без моторов выходы L293 снабжены индикацией – светодиоды показывают направление вращения (зелёный или красный) а по яркости свечения можно оценить скорость двигателя.

Иногда это бывает удобно – чтоб отлаживаемая платформа никуда не сбегала, не разряжались аккумуляторы или ничего не намоталось. Да и слушать вой движков в процессе доводки невсегда приятно=)
Ещё меня угнетало неполное использование возможностей L298 в шилдах, ведь ни один не задействует такую замечательную фичу как динамическое торможение – а затормозить двигатель почти без выбега иногда ооочень полезно. Пришлось выдумать замудрёную схему управления на 74HCT240 и добавить вход BRK подав на который 1 можно резко затабанить движок.

Причём, что там на остальных входах творится уже не важно. Сняли 1 и снова двигатель бодро рванул в том же направлении и с прежней скоростью. А кому не нужен этот вход – можете смело про него забыть и вообще отрезать перемычку для экономии выводов – всё будет работать как в обычном моторшилде =).
Но на плате оставалась ещё куча места, и туда решено было воткнуть что-нибудь для серв. А чего сервам вечно не хватает? Питания! Вот и возник в серво части 5-амперный стабилизатор, да не простой а регулируемый. Можно как обычно 5-ю вольтами сервы питать, можно их пожалеть и дать 4.8В (для SG90 это номинальное напряжение, кстати), а можно разогнать подав 6В (что для крупных серв в пределах нормы)

Итого соответствие выводов получилось такое:

1Мотор
PWM1 — 11
DIR1 — 8
BRK1 — 4

2Мотор
PWM2 — 3
DIR2 — 7
BRK2 — 2

Сервы
Серва 1 — 10
Серва 2 — 9
Серва 3 — 6
Серва 4 — 5

Как видно с 8-й АТМегой всё не так гладко вышло – нащупались грабли.
Как известно у восьмёрки ШИМятся только 9,10 и 11 выводы – логично расположить PWM-ы именно там, вот только на 10 и 9 выводах ШИМ отключается при подключении стандартной библиотеки «Servo» =(
То есть ради совместимости с восьмёркой пришлось бы придумывать програмные велосипеды и извращения с сервами или ШИМ-ами, что не радовало.
Поэтому сжав зубы пришлось пожертвовать идеалами демократии и разместить именно так.
Кому нужна восьмёрка и не нужны сервы – берите плату с незапаяной серво частью, перебрасывайте PWM2 на 9-й или 10-й пин и будет вам счастье. Ну а кому нужно всё и сразу – и сервы и моторы и всё на восьмёрке – библиотеку SoftwareServo (в конце статьи) в руки и в бой=)
Ну и SPI, тоже пришлось укоротить — ШИМов не хватало, 11пин (MOSI) отдали на PWM1. Логичнее его конечно, было бы кинуть на управлние сервой какой-нибудь(чтоб хоть три сервы и моторы могли никому не мешая работать), но глаз замылился, и обратил я на это внимание только при написании документации=( Конечно пользуясь гибкостью данного шылда, можно и это дело поправить, если кому хочется. В следующей версии, (если она будет=) исправлюсь.

Питать шилд можно несколькими способами.
Во-первых, питание моторшилда разделено на три группы – силовое питание серво части – то что идёт на стабилизатор, силовое питание моторной части – то что идёт на ЭЛЬ-ку и крутит моторы и питание логической части – как самой ЭЛЬ-ки так и микросхемы управления.
Силовое питание можно брать отдельное – от разъёма установленого на шилде, а можно воспользоваться внешним питанием ардуины (но только через защитный диод, установленый на самой ардуине, т.е. чтоб его не спалить не стоит оттуда брать более ). Варианты силового питания выбираются джамперами раздельно для моторной и сервочасти.

Логическая часть, по-умолчанию, запитана от 5В ардуины, но можно переключится на напряжение выход стабилизатора серво части. Т.к. не ожидается что эта фича будет сильно востребована джампер выполнен паяльным.

Ну и накой такие сложности и разнообразности, спросит пытливый читатель. Отвечаем – для гибкости.
Так, например, ардуину можно запитать от 9-вольтовой кроны, а силовой аккумулятор (на 12, 24В) подключить на шилд. А можно, если не хочется перегружать устройство батарейками(и если позволяют токи и напряжения питания моторов) посадить 12В аккум на разъём дуины и кормить всех оттуда. А можно вообще выкинуть дуину, перебросить джампер питания логической части и использовать шылд как самостоятельное устройство. Например, подключив фоторезисторы на PWM-ы получим безконторллерного лайттрейсера =)

В общем, такая вот получилась загогулина =)

Документация (PDF)

Далее:
Багрепорт по L-Motor Shield
Подготовка L-Motor Shield-а к работе


0 комментариев на «“L-Motor Shield”»

  1. Ассортимент ваших творений ширится))) Хотелось бы увидеть в нем еще одно простое, но на мой взгляд весьма востребованное — шилд для управления (16, 24, 32, 48) сервами.

    • Есть такие мысли и планы, хотелось бы узнать что именно нужно.

      Просто разведённые разъёмы под сервы?
      Питание на 16…48 серв (15…50А)?
      Сдвиговые регистры?
      Более интелектуальные функции управления?

    • Нужен моторшилд для 5координатного фрезерного станка (моторы от 380 запитаны и ампераж у них не модельерный). Для как бы ёМобиля (там привод на каждом колесе и задача синхронизации есть, ампераж высокий). Для промышленной руки-привода с тоже не хилыми моторами (более чёткое управление, стопорить обязательно). Моторшилды работающие от xbee, для автоматизации производства, чтоб протягивать к ним только основное питание, а управлять по беспроводу (повышен ампераж к томуже, частая и постоянная остановка двигателей, что даёт некие скачки в сети, моторов много 50-100). Моторшилды для управления катушками зажигания в авто (задача программной настройки ампеража). В общем если отдалиться от роботостроения игрушек и приблизиться к реальной жизни, то моторшилды нужны всякие и разные. А и ещё микродубликаторы — то есть: перед тем как всё это имплантировать в реальное железо товарищ юзер должен иметь возможность показать (боссам, себе) это всё на макете, а потом просто поменяв плату и подключаемые мощности работать без изменения программы на мощных приводах.

    • Появится. Стоит в очереди на разработку=)

    • Для удобства пользователей.
      Назначение всех деталей расписано в статье;)
      Нууу=) тогда (без обвязки) нужно обязательно по 3пина дуины задействовать для управления каждым каналом.

  2. Подскажите, все никак не могу понять, зачем последовательно со светодиодами режима работы двигателей стоят диоды (похоже 1n4148)?

    • Для защиты светодиодов от обратного напряжения. Светодиоды его сииильно не любят=)
      Типичное допустимое — вольт 5, а шилд может на выходе дать до 40.

  3. Здравствуте)
    Я полный новичок в этом деле, поэтому прочев эту статью не доконца понял(
    Мне требуется осуществить управление, двумя тактовыми двигателями, можно ли это сделать по средсвом данной схемы?)

    • осталось выяснить что такое тактовый двигатель 😉

    • Или один канал для управления шаговым двигателем.

      Одна плата — один шаговик, две платы — два шаговика.

    • Только если шаговики униполярные,
      вроде где-то попадались варианты управления такими одним мостом(да и по логике, можно).
      Но я не пробовал и на вскидку ничего более подробного сказать не могу.

  4. Купил этот шилд, очень доволен, спасибо, но есть вопрос.
    Можно ли питать UNO от шилда? Я подаю 12В на разъем внешнего питания, для сервов и еще 9В на UNO, как то кажется, что должна быть возможность питания UNO от стабилизатора шилда, но из описания я этого не нашел.

    • Вот, прям стандартно, не предусмотрено — на шилде все питания «силовые» — довольно зашумлённые, и питать от них мозги несколько неправильно.
      Но можно хакнуть=)
      Первый вариант — замкнуть все три площадки джампера LogPWR Select:

      А также замкнуть защитный диод

      Это подаст напряжение со стабилизатора шилда напрямую на микроконтроллер на ардуине.
      Так что, питание серв должно быть выставлено «5В» (этот диод и защищает от случайного замыкания всех трёх площадок т.к. если стоит 6В — может сгореть МК)

      Можно те же 12В подать на ардуину (можно снаружи, можно на шилде провод к пину «9V» бросить) — но ей это многовато — возможно будет греться её стабилизатор.
      Можно поставив стабилизатор шилда на 6В подать это на стабилизатор дуины (на шилде провод к пину «9V» бросить) но этого ему будет маловато…

    • Насколько я понял, нужен регулятор напряжения.

    • Нет. Нужно что-то, чтоб превратить 12 Вольт силового питания в 5 Вольт стабильного логического. Схема ничего не регулирует, схема преобразовывает и стабилизирует.
      Кроме предложенных выше вариантов, из которых мне больше нравится проброс провода от силового питания на пин V0(9V), есть еще вариант поставить миниатюрный DC-DC 12-5 Вольт преобразователь на ток не больше 1А. Если не нужна высокая энергоэффективность — пробросьте проводок к пину V0, ардуина нормально рассеивает тепло.

  5. народ а ни у кого не было проблемы с шумами??? а то говориш чтоб крутил любой мотор в нужную сторону(но чаще глюки на 1 порту мотора) и в это время на портах ардуино творится ахинея(т.е. значения непонятные). было ли такое и как вылечить???

    • Сильно отличаются. Библиотеки не совместимы.

  6. Закидываю на Arduino скетч MotorsAndServos,(проверял только севроприводы)из 4-х ни один не крутится. Проверил контакты, сигнал подается, в землю уходит, но нет +. При замыкании площадки LogPWR select, появляется движение. Площадка запаяна стандартно. В чем проблема?

    • Хм=(
      Нужна крупная фотка сервочасти(от разъёмов серв до клеммника внеш. питания).

    • А вы питание внешнее на шилд подаёте?
      У вас джампер «Servo» (в колодке «PWR Select») стоит в положении «External», в этом случае питание (7-12В) надо подключать к шилду(на синий болтовой клемник), если переставить джампер на «Arduino» то внешнее питание надо подать на разъём внешнего питания ардуины.

    • Ясно. Подключал питание к шилду, но подавал 6в.(4 пальчиковые батарейки).
      Попробую 12В. Потом отпишусь.

  7. Добрый день, есть еще вопрос.
    Подключил коллекторный мотор, подключил нормальный аккумулятор, сервоприводы вращаются, а мотор нет, еще я так и не понял, но шилд или ардуина издает писк.
    img-fotki.yandex.ru/get/9230/28684477.0/0_ad72a_a3277014_XXXL.jpg
    Еще l293d прилично нагревается.
    В чем может быть проблема?

    • для полноты картины скетча не хватает.

    • #include <Servo.h>
      #include <LMotorShield.h>

      LMotorShield lms;

      void setup()
      {
      lms.begin(LMS_MOTORS | LMS_SERVOS);
      }

      void loop()
      {
      lms.motorSpeed(1, 500);
      lms.motorDirection(1, LMS_FORWARD);
      lms.multipleServoWrite(LMS_SERVOS, 90);
      delay(2000);
      lms.servoWrite(1, 30);
      lms.servoWrite(2, 60);
      lms.servoWrite(3, 120);
      lms.servoWrite(4, 150);
      delay(2000);
      lms.multipleServoWrite(LMS_SERVO1 | LMS_SERVO2, 0);
      lms.multipleServoWrite(LMS_SERVO3 | LMS_SERVO4, 180);
      }

    • Эм… а это у вас чего такое?

      lms.motorSpeed(1, 500);

      В библиотеке есть подробнейшая дока (RoboCraft-LMotorShield.zip\LMotorShield\doc\doc_ru.html):

      Основные функции для работы с моторами: задать скорость от 0 до 255 — motorSpeed()

  8. Здравствуйте, скажите, вот нужно научить крутиться шаговый двигатель вперёд назад на разных скоростях и два Серва.
    Вопрос новичка: как всё это вместе уже собрать, чтобы можно было нажатием кнопки выполнить разные программы, написанные для управления тем или иным мотором или сервом, или привинтить кнопки и регуляторы, чтобы заставить всё работать на нужной скорости или повернуться под нужном углом. Обязательно ли для этого нужно подключать и програмировать Ардуино? А может быть всё сразу да ещё и с компом вместе? С написанием проги на С++ я справиться смогу, мне только надо понять, что к чему подключить и припаять. Подскажите, что прочитать ещё?
    В качестве цели: мне нужно собрать слайдер для камеры и добавить к нему управление зумом и поворотом угла(наклона) Один шаговый движок и сервы для этого должны подойти.
    Судя по всему данный дивайс (L-Motor Shield) для этой задачи как раз в самый раз.
    Искренне буду благодарен за ответы и советы.

  9. Добрый день! Подскажите, почему не работает l-motor shield если подключить библиотеку iRemote. ПДУ работает а моторы не крутятся. В случае с AF motor, например, меняют таймер в библиотеке iRemote. Если это сделать здесь, то при компиляции возникают ошибки.

    • Уже решил проблему. Там буржуй что-то намутил в библиотеке. Если вручную на пины DIR BRK PWM подавать нужные значения то все работает. Видимо там из-за серв таймеры задействованы а мне пока они и не нужны.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение