Изначально, я хотел в одной статье изложить весь материал, так сказать, «от идеи до воплощения«. Но по мере написания, понял, что будет слишком громоздко. И разбил статью на две части.
Итак, первая часть. Теоретически-макетная 🙂
Я назвал свой «проектик» LOW-COST Motor Shield (или LC-Motor Shield, если сокращенно)! Собирал я его из всякого гов… хлама... из того, что оказалось под руками!!
Как правило, все платы управления двигателями на Ардуино так или иначе базируются на пресловутой L293 (ну, или на L298). Да, удобно. Минимум обвязки, куча готовых схем. Но, работают они как правило с очень слабыми двигателями (с максимальным током что-то около 0.5 Ампера, для L293). Зачастую, этого недостаточно. Плюс стоимость и доступность (у нас в г. Минске на сегодняшний день на радио рынке купить L293 — можно буквально у 1-2 продавцов и по цене порядка 5 у.е.). Да, готовое изделие на L293 можно купить у братьев-китайцев — меньше чем за 10 у.е. Но, как говорит мой приятель: «Это не наш метод. Мы сделаем сами, пусть по выходу окажется и в два раза дороже!».
Небольшая предыстория. Я уже предпринимал ранее робкие попытки построения некого подобия «motor shield»-а На рассыпухе. Но признаюсь, не совсем удачно 🙂 (Уверен на 90%, что при использовании пары n-p-n и p-n-p все было бы значительно лучше! Но сейчас не об этом). Отложил затею в долгий ящик, но надежду не потерял. И тут волею случая, после модернизации одного магазина (а именно, после замены печатающих устройств с матричных на термо) у меня на руках оказалось несколько матричных принтеров фирмы Epson, модель TM-U210.
Механика разбита в хлам,а вот электроника — оказалось вполне живучей. Вот есть у меня такая привычка, вертеть в руках платы и гуглить разные интересные радиоэлементы.
И тут натыкаюсь на очень необычный элемент STA434A, читаем даташит и … радости нет предела! До боли знакомое сочетание транзисторов. Это же то, что нужно!!! Ниже кусочки из даташитов на STA434A и L293D.
Надеюсь, обратили внимание на некое сходство 🙂 Кстати ниже, типовая схема управления двигателем, в игрушечных машинках (картинку «позаимствовал» в инете).
А не эксклюзив ли эти сборки Дарлингтона? Оказывается, нет. ТУТ можно заказать и по вполне гуманной цене (я так, понимаю, порядка 1.5..2 $). Немного завидую в этом плане россиянам.
_______Этот кусок текста необязателен для прочтения___________
Для солидности статьи, немного теории. (Мало ли, кому-то будет полезно)
Итак. Управление двигателем постоянного тока.
Тут все просто. У коллекторного двигателя два контакта; подал на один «+», а на второй вывод «-» — закрутился моторчик в одну сторону. Поменял полярность — он радостно крутиться в другую сторону. Больше подал напряжение — крутиться быстрее, уменьшил напряжение — скорость вращения уменьшилась. Да не судите строго, за примитивное изложение основ:)
И вот умные люди придумали способ, как управлять этими параметрами: направление вращения и скорость. И называется такой способ «H-Bridge».
Вот его условная схема.
Есть четыре выключателя: S1, S2, S3, S4. Рассмотрим возможные варианты коммутации.
Вполне очевидно, что НИКОГДА !!! Никогда не должны быть ОДНОВРЕМЕННО включены следующие пары выключателей: S1+S3 и S2+S4, так как при этом мы накоротко соединяем питание и землю, т.е., имеем КЗ!!!
S1+S2 — двигатель подключается к питанию двумя контактами — мотор окажется закорочен, в этом состоянии вал двигателя интенсивно тормозится. Иными словами, двигатель будет работать в режиме генератора. Чуть-чуть иначе, при варианте S3+S4 (только в этом случае двигатель подключен к земле). Я бы назвал этот вариант — «холостой ход».
Ну и самые полезные варианты: S1+S4. При таком подключении на левый (по рисунку) контакт двигателя подается «+», на правый — «-«. Допустим, при этом двигатель будет вращаться по часовой стрелке. В случае S2+S3 — против часовой стрелки. А если при одном из этих двух вариантах коммутации отключать-включать один из выключателей пары — то мы сможем управлять скоростью вращения двигателя!!! (Иными словами, «шимить» или подавать PWM-сигнал).
Единственное различие между этим простым H-мостом и реальным, является то, что переключатели заменены на транзисторы, для электронного управления двигателем и стыковкой с микроконтроллером.
Фу… как смог, так и преподнес теоретическую часть 🙂 Строго не судите.
_______Тут конец текста необязателеного для прочтения___________
Теперь будем выбирать схему управления. (многие вещи и решения украл… почерпнул из L-Motor Shield)
— Все же попытаемся сделать ее максимально совместимой с Atmega8 (я пользуюсь «самопальной» Ардуиной). Дело в том, что у 8-ой Аtmeg-и только 3 пина с аппаратным ШИМ-ом.
— Нам нужно минимум два канала для коллекторных двигателей (или один для шагового)
— Постараемся не занимать важные пины
Начались поиски схемы. Достаточно быстро нагуглился один из вариантов.
Вроде как неплохо, однако прикинув детали я понял, что разместить на односторонней плате задуманные два канала, не сильно выступая за габариты Ардуинки, с минимум перемычек, при моей сноровке — вряд ли у меня получится :(.
Не знаю как у Вас, но у меня на работе обычно во время перекуров мы с друзьями обсуждаем всякие свои «поделки» не связанные с работой :). И мой приятель, выслушав мои «терзания», предложил интересный вариант: «Так, а сделай на оптопарах!!!». А ведь и действительно, здОровская мысль.
Оптопара (чаще всего, встречается РС817) = светодиод + фототранзистор. Открытие фототранзистора напрямую зависит от степени его освещенности светодиодом. На светодиод нужно подавать постоянное напряжение:
вывод 1 (+ анод), вывод 2 (- катод) и ограничивать ток через него (при подключении к пинам ардуино (+5 Вольт — резистором, порядка 220..500 Ом).
Через фототранзистор ток протекает, как нарисована стрелочка в его обозначении:
от вывода 4 (+ коллектор) к выводу 3 (- эмиттер).
После долгих «гуглений», споров, черновых набросков получилась следующая схема. Так сказать, предварительный вариант.
Итак, для управления одним двигателем нам нужно три пина. Два задают направление вращения (FWD и REV), а третий (Enable) мы будет использовать для задания скорости. Три вывода — 8 возможных состояний.
вариант «вращение двигателя по часовой стрелке»
Прошу заметить, что в случае подачи «1» на вывод «ENABLE» у нас будет отключаться ключ правой нижней части. И если подавать ШИМ-сигнал — то можно управлять скоростью вращения двигателя.
Аналогично, вариант «вращение двигателя против часовой стрелке»
Случай, если на выводы «FWD» и «REV» подать высокий уровень («1») — открыты ключи левой и правой нижних половинок. В этом случае двигатель находиться в состоянии «холостого хода».
Для остальных случаев, я поленился делать картинки :(, опишу словами… (к сожалению, сделать таблицу у меня не получилось.
FWD—REV—ENABLE
-1——0——0— Открыты ключи верхней левой и правой нижней части схемы. (ВПЕРЕД!)
-1——0——1— Отключение нижней правой части. ШИМ на ENABLE — ВПЕРЕД с регулировкой скорости.
-1——1——0— Включены нижние ключи. Режим «холостого» хода.
-1——1——1— Все ключи выключены.
-0——1——0— Открыты ключи нижней левой и правой верхней части схемы. (НАЗАД!)
-0——1——1— Отключение нижней левой части. ШИМ на ENABLE — НАЗАД с регулировкой скорости.
-0——0——0— Все ключи выключены.
-0——0——1— Все ключи выключены.
Самый удобный способ быстрой проверки задуманного решения — сборка на макетке (я встречал другое название этого способа, «Arduino-style» :))
вид сверху
небольшой тестовый скетч:
byte FWD=7; byte RWD=8; byte ENB=10; void setup(){ pinMode (FWD,OUTPUT); pinMode (RWD,OUTPUT); pinMode (ENB,OUTPUT); } void loop(){ //Крутим вперед digitalWrite(FWD,HIGH); digitalWrite(RWD,LOW); analogWrite(ENB,200); delay(1000); //Крутим назад digitalWrite(FWD,LOW); digitalWrite(RWD,HIGH); analogWrite(ENB,200); delay(1000); digitalWrite(FWD,LOW); digitalWrite(RWD,LOW); analogWrite(ENB,100); delay(500); }
Убеждаемся, что все работает, так как и задумано. Что не может не радовать!
Ну, теперь ОЧЕНЬ даже реально разместить задуманное на небольшом куске текстолита. При этом, (после примерок и прикидок деталей на листочке) даже остается свободное место. А его мы заполним 5-ти вольтовым стабилизатором для двух сервоприводов. (Прямо, «копейка в копейку» взято из L-Motor Shield). Конечно, количество серв можно было бы увеличить, но мне показалось, что это уже будет лишнее…
На управление одним из двигателей отдаем три пина, два задают направление, третий — скорость. (2,4,9) — один канал, (7,8,10) — второй. Т.е., совместимость с Atmega-8 есть 🙂 Ну, а под сервы отдадим 5 и 6 пин. Тут, уже 8-ая Атмега, к сожалению, «курит в сторонке».
Итак, окончательный вариант схемы LC-Motor Shield v.1.0 ниже…
To be continued… (или по нашему) Продолжение следует…
P.S. Уже поздно вносить изменения, так, как я уже все спаял и собрал. И все работает 🙂
P.P.S. Я, почему-то,свои поделки делаю ГОРАЗДО быстрее, чем пишу о них 🙂