Управление большим количеством нагрузок
- Войдите на сайт для отправки комментариев
Всем доброго времени суток, господа!
Совсем недавно окунулся с головой в очень этот интересный и увлекательный мир Ардуино. Если с принципами работы датчиков и исполнительных механизмов (благодаря окончанию кафедры приборостроения) и с программированием (благодаря окончанию курсов программирования ещё в школьные годы) на поверхностном уровне проблем особо нет, то вот с "элементной базой" есть прогалы.
Суть обращения: Запланировано два проекта, в обоих нужно управлять большим кол-вом исполнительных элементов, задействуя как можно меньшее кол-во выводов ардуино.
----------
1. Исполнительный элемент питается от постоянки 12В и потребляет 250мА. Таких устройств будет 120, нужно плавное изменение напряжения.
Первое что пришло в голову - это каскад сдвиговых регистров 74HC595 + 120 транзисторов, но вот проблема - регистр выдаёт либо HIGH, либо LOW, плавной регулировки нету.
Второе, что пришло в голову, это драйвер светодиодов TLC5940, который в принципе всем устраивает (плавная регулировка, 16 выходов, соединение в каскад), кроме выдаваемого тока - всего 170мА. Хотелось бы с небольшим запасом, т.е. 300-350 на каждый канал, а лучше вообще 500 :)
Возможно есть какие-то МС, которые не к земле подтягивают контакты, а подают "+".
Вот и вопрос №1 - Есть ли какие-то аналоги TLC5940, которые могут выдать хотя бы 300ма? Или может предложите какие-то другие решения.
----------
2. Управление 28-ью биполярными шаговыми двигателями 5В из флоппиков и CD-ROM'ов. Первое, что нагуглил - драйвер A4988. Если я правильно понял, то от ардуины он управляется двумя проводами: Направление (HIGH в одну сторону, LOW в другую) и Шаг (1 импульс = 1 шаг). Соответственно наводит на мысль, что тут тоже можно применить каскад сдвиговых регистров, получится 1 регистр на 4 мотора. Но смущает, что везде написано, что питание мотора 8-35В, флоппивские моторчики 5В.
И так, вопрос №2 - Можно ли управлять 28-ью драйверами А4988 с помощью каскада регистров 74HC595?
Вопрос №3 - Будет ли работать драйвер А4988 с питанием мотора 5В? Если нет, то какие решения?
Вопрос №4 - Двигатели будут работать с линейными передвижениями небольшой массы, на случай, если флоппи-моторчики не потянут - может есть какие недорогие варианты немного помощнее? Точность не играет особой роли.
----------
Только написал и тут меня осенил ещё один нюанс по второму проекту:
Флоппики не имеют обратной связи, а она очень желательна, на случай, если моторчик не сделает шаг из-за нагрузки. Буду пробовать цеплять оптодатчик с диском или линейный потенциометр. Соответственно 28 выводов (вводов для ардуинки) обратной связи тоже очень хотелось бы реализовать как-то покомпактней, тут у меня вообще 0 идей...
Но вообще для начала хотя бы без обратной связи все же можно, это так, на свякий случай дописал :)
Ну и самое главное забыл: заранее всем СПАСИБО БОЛЬШОЕ за советы и подсказки. Не судите строго, если где-то что-то технически не грамотно написал/спросил, я ардуину получил ровно неделю назад :)
Вас не смущает, что TLC5940 регулирует свои нагрузки не "плавно", а ШИМом?
Если нет, то ставьте на выходы TLC5940 транзисторный массив ULN2803A (потребуется два, т.к. они по 8 транзисторов) и имеете 16 ШИМ выходов по 500мА каждый.
2) Можно, вопрос только в том - обеспечите ли вы плавность хода при заданной скорости.
3) Подключал через 4988, шнек не сорвало, дыма не было. Главное - ток посчитать правильно.
Вас не смущает, что TLC5940 регулирует свои нагрузки не "плавно", а ШИМом?
Если нет, то ставьте на выходы TLC5940 транзисторный массив ULN2803A (потребуется два, т.к. они по 8 транзисторов) и имеете 16 ШИМ выходов по 500мА каждый.
ШИМ не смущает)
А так можно? TLC же вроде землю к выводам подтягивает, а на вход ULN-ки должен "+" падать? Или я чего-то не знаю? :D
2) Можно, вопрос только в том - обеспечите ли вы плавность хода при заданной скорости.
3) Подключал через 4988, шнек не сорвало, дыма не было. Главное - ток посчитать правильно.
2) а как это влияет на плавность хода? типа длинный каскад будет тормозить или что? если да, то на худой конец можно разбить 2-4 каскада наверное?
3) а от напряжения меньше номинала ток потребляться больше будет? я просто кафедру-то приборостроения закончил, но вот электротехнику прогуливал :D
2) а как это влияет на плавность хода? типа длинный каскад будет тормозить или что? если да, то на худой конец можно разбить 2-4 каскада наверное?
Типа сможете ли лично вы и 595 обеспечить импульсы на STEP с отклонением длительности в микросекунды. Я с таким не баловался, но вижу тут потенциальную проблему.
3) а от напряжения меньше номинала ток потребляться больше будет? я просто кафедру приборостроения закончил, но вот электротехнику прогуливал :D
4988 ограничивает ток на обмотках, т.е. является драйвером типа Constant Current. А для флоповодных движков ток не указывается, потому что они (наверное) управляются драйверами Constant Voltage. Однако я подключал двигатель именно так, как написано, БП не помню уж какой был... 9V, наверное. Сопротивление обмотки померял, ток примерно высчитал и на драйвере выставил. Крутило всё туда-сюда нормально, без дыма.
А так можно? TLC же вроде землю к выводам подтягивает, а на вход ULN-ки должен "+" падать? Или я чего-то не знаю? :D
Ой, виноват. Она, кстати, ещё и землёй рулит. Вас выручат pnp-транзисторы на входах. Они открываются землёй и инвертируют сигнал. Про pnp транзисторы для исправления ситуации, см. как я их применил с той же TLC5940 вот здесь.
А чтобы рулила не землёй, а питанием, возмите вместо ULN-ки UDN2981A - тоже самое, только неинвертирующее.
Типа сможете ли лично вы и 595 обеспечить импульсы на STEP с отклонением длительности в микросекунды. Я с таким не баловался, но вижу тут потенциальную проблему.
4988 ограничивает ток на обмотках, т.е. является драйвером типа Constant Current. А для флоповодных движков ток не указывается, потому что они (наверное) управляются драйверами Constant Voltage. Однако я подключал двигатель именно так, как написано, БП не помню уж какой был... 9V, наверное. Сопротивление обмотки померял, ток примерно высчитал и на драйвере выставил. Крутило всё туда-сюда нормально, без дыма.
2) А, т.е. дело в частоте работы 595, она ограничена... теперь понял, не задумывался над этим. Ну в принципе я сегодня движочек напрямую к ардуинке подключал баловался, плавность хода меня устраивала даже при даже при delay(1-5)
3) Ага, теперь понял в чем дело, осталось разобраться как ток выставлять на А4988 :) Ну это я покурю интернет если что
2) А, т.е. дело в частоте работы 595, она ограничена... теперь понял, не задумывался над этим.
задумайтесь еще о том, что вы собрались 4 мотора на один регистр подключать - то есть частота работы одного регистра должна быть, как минимум, в 4 раза больше, чем у мотора.
А если таких регистров у вас не один - то еще умножте на число регистров и посчитайте, потянет ли сама ардуина столько импульсов...
Ой, виноват. Она, кстати, ещё и землёй рулит. Вас выручат pnp-транзисторы на входах. Они открываются землёй и инвертируют сигнал. Про pnp транзисторы для исправления ситуации, см. как я их применил с той же TLC5940 вот здесь.
А чтобы рулила не землёй, а питанием, возмите вместо ULN-ки UDN2981A - тоже самое, только неинвертирующее.
Ну огород из 120 транзисторов городить что-то совсем не хочется, это тогда можно и без всяких микросхем с TLC сразу на транзистор, а за ним нагрузка.... я же наоборот пытаюсь уйти от грядки транзисторов.
ЧТО-то я запутался и не соображу как это всё вместе работать должно. Можно по рабоче-крестьянски, на пальцах? Если бы скажем у нас ток потребления ограничивался, скажем 100мА, то мы бы делали как:
Все нагрузки шли бы на общую шину +12В, минусами они бы шли на выходы TLC-шки.
На TLC приходило бы +5В с Ардуины, земля и управляющие провода с Ардуины. Верно?
Но нам не хватает тока в 100мА, нам нужно 500, поэтому мы ставим... UDN2981A... Как мы её ставим?
Входы для UDN берутся с выходов TLC, это понятно
На ногу Vc подаётся питание с ардуины +5 или +12 питающие нагрузки? Сами нагрузки к выходам микросхемы идут плюсами или минусами?
Так там же в неё бит информации записывается сразу целиком. "10010110" ставятся разом на 8 выходов. А в следующий регистр они передаются последовательно. Т.е. на следующем шаге с ардуины приходит "01101001", а предыдущий бит "10010110" отправляется на второй регистр уже первым регистром, а не самой ардуиной.
Понятно, что дела обстоят иначе, если несколько каскадов делать параллельно.
Кстати вопрос, а как вообще устроина ардуина (цифры беру с потолка, так как реальных цифр не знаю, опять же не задавался таким вопросом): например она может выдавать на один канал максимум 500 импульсов в секунду. На два она тогда сможет только по 250 давать? Или на оба по 500?
Исходя из вашего сообщения, я так опнимаю, что по 250. До вашего поста я думал что по 500 на каждый.
arz_serg - начнем с очень простого вопроса - у вас все 28 моторов крутятся строго синхронно? - стартуют и останавливаются разом и если крутятся - то с одной скоростью? - подозреваю, что нет
А если нет - значит никакого управления 4 моторами записью в регистр одного байта у вас не получится, надо будет на каждый мотор слать свой импульс в строго нужное время.
Таким образом, чтобы НЕЗАВИСИМО управлять 28 моторами - нужно ичастоту импульсов в 28 раз больше, чем для одного мотора
контроллер одновременно может выполнять только одну команду. Так что в общем случае - если на один канал 500, то на два канала только по 250
Ардуина устроена так.
50 имп. в секунду
(50-X) имп. в секунду, где X зависит от скорости UART
(50-X3) имп. в секунду, где X3 определяется временем выполнения foo(), bar() и вообще может быть непредсказуемо.
arz_serg - начнем с очень простого вопроса - у вас все 28 моторов крутятся строго синхронно? - стартуют и останавливаются разом и если крутятся - то с одной скоростью? - подозреваю, что нет
А если нет - значит никакого управления 4 моторами одним байтом у вас не будет, надо будет на каждый мотор слать свой импульс в строго нужное время.
Таким образом, чтобы НЕЗАВИСИМО управлять 28 моторами - нужно ичастоту импульсов в 28 раз больше, чем для одного мотора
Ну постойте. Например у нас к одному сдвиговому регистру подключено 4 драйвера A4988. Выводы в таком порядке (Ш-шаг, Н-направление): Ш1 Н1 Ш2 Н2 Ш3 Н3 Ш4 Н4
нужно например 5 секунд крутить 1ым и 2ым мотором в одну сторону, потом включить 3ий, а на втором включить реверс.
мы 5 секунд шлем байт "10 10 00 00"
а потом начинае слать байт "10 11 10 00"
по сути-то управление получается независимое, каждый мотор сам по себе.
хотя тут вопрос конечно в том, что если регистров будет 7 в ряд, то слать каждый раз надо целую пачку для всех регистров.... есть над чем поразмыслить вобщем )
А если нет - значит никакого управления 4 моторами записью в регистр одного байта у вас не получится, надо будет на каждый мотор слать свой импульс в строго нужное время.
Дак импульс - это дело такое... на выходе 595 можно постоянно ставить 1 и будет долгий импульс. Достаточно дискретность иметь с запасом, у 595 rise time наносекунды, поэтому он есть. Главное - чтобы программист ритмичность сохранил и правильно рассчитал битовые последовательности соответственно длине импульса.
не знаю, вот sadman41 попрравит - но по-моему управлять 28 моторами с одной ардуины через всякие расширители портов или сдвиговые - это утопия.
Я бы выкинул сдвиговые вообще - а вместо этого разделил моторы на 3-4 группы по смыслу - ну скажем если это робот - то "моторы ноги", "моторы-руки" и тл - и на каждую группу поставил свою ардуину.
а ну да, всё... дошло с частотой
теоретически будь у нас 1 мотор, байт "10 10 00 00" - это было бы 4 команды для одного мотора
а так у нас это по одной команде на 4 мотора, а время на передачу затрачивается одинаковое.... теперь понял, спасибо что навели на эту мысль )
Ну постойте. Например у нас к одному сдвиговому регистру подключено 4 драйвера A4988. Выводы в таком порядке (Ш-шаг, Н-направление): Ш1 Н1 Ш2 Н2 Ш3 Н3 Ш4 Н4
нужно например 5 секунд крутить 1ым и 2ым мотором в одну сторону, потом включить 3ий, а на втором включить реверс.
мы 5 секунд шлем байт "10 10 00 00"
вы для начала почитайте, как работают драйверы шаговых моторов. У вас полное непонимание принципа. Чтобы 5 секунд крутить мотор - недостаточно один раз поставить на выходе нужны уровень. Нужно давать импульс НА КАЖДЫЙ ШАГ. То есть если крутите мотор со скорость 200 шагов секунду - то за эти 5 секунд вы должны выдать ТОЛЬКО НА ЭТОТ МОТОР 1000 импульсов. Причем, если хотите чтоб мотор крутился ровно - импульсы надо давать строго раз в 5 миллисекунд. и это только один мотор.
Ну постойте. Например у нас к одному сдвиговому регистру подключено 4 драйвера A4988. Выводы в таком порядке (Ш-шаг, Н-направление): Ш1 Н1 Ш2 Н2 Ш3 Н3 Ш4 Н4
нужно например 5 секунд крутить 1ым и 2ым мотором в одну сторону, потом включить 3ий, а на втором включить реверс.
мы 5 секунд шлем байт "10 10 00 00"
вы для начала почитайте, как работают драйверы шаговых моторов. У вас полное непонимание принципа. Чтобы 5 секунд крутить мотор - недостаточно один раз поставить на выходе нужны уровень. Нужно давать импульс НА КАЖДЫЙ ШАГ. То есть если крутите мотор со скорость 200 шагов секунду - то за эти 5 секунд вы должны выдать ТОЛЬКО НА ЭТОТ МОТОР 1000 импульсов. Причем, если хотите чтоб мотор крутился ровно - импульсы надо давать строго раз в 5 миллисекунд. и это только один мотор.
Да я прекрасно это понимаю, я просто упрощенно обозначил суть, но уже понял, что с частотой ошибался, о чем написал выше :)
Я же писал, что запускал сегодня шаговый мотор напрямую с ардуины. А с драйевром просто испульсы посыалть не обмотки (4 вывода), а одиночный импульс на драйвер, а драйвер сам по кругу будет перебирать полярности на обмотках. А пауза между импульсами это скорость вращения - это я всё прекрасно понимаю
не знаю, вот sadman41 попрравит - но по-моему управлять 28 моторами с одной ардуины через всякие расширители портов или сдвиговые - это утопия.
Я бы выкинул сдвиговые вообще - а вместо этого разделил моторы на 3-4 группы по смыслу - ну скажем если это робот - то "моторы ноги", "моторы-руки" и тл - и на каждую группу поставил свою ардуину.
Да мне в голову уже такие мысли и идут )
...особенно учитывая, что желательно чтобы ещё и обратная связь была, малоли, вдруг механизм клина поймает, а без обратной связи ардуина об этом не узнает и начнется полная вакханалия
Найдете дешёвую обратку - напишите. Мне тоже интересно.
Да мне в голову уже такие мысли и идут )
...особенно учитывая, что желательно чтобы ещё и обратная связь была, малоли, вдруг механизм клина поймает, а без обратной связи ардуина об этом не узнает и начнется полная вакханалия
главное в этом случае - не погрязнуть в межпроцессорном взаимодействии - а то весь выигрыш от нескольких ардуин уйдет на "переговоры" между ними :)
Для этого надо, чтоб каждая ардуина умела сама управлять своими моторами, а не просто траслировала импульсы от "главного мозга". Иными словами - если у вас отдельный МК управляет "пальцами" - не надо ему слать команды "передвинь мизинец на 2 мм", вместо этого командуйте всей руке - "сжать кулак"
Найдете дешёвую обратку - напишите. Мне тоже интересно.
ну кроме механического энкодера (который, сдаётся мне, флоппи-моторчик даже не провернет), оптодатчика с диском, линейного потенциометра и датчика холла мне пока в голову больше ничего не пришло.
у меня нет высоких требований по точности, мне надо-то 5 положений на 5ти сантиметровом червяке :)
Найдете дешёвую обратку - напишите. Мне тоже интересно.
Взять датчик препятствия (который с чёрным ИК светодиодом и прозрачным фототранзистором) и направить на вал, по принципу тахометра alexgyver, вал покрасить в чёрно-белые полосы. Минусы - большие габариты (см 20 в диаметре), зато дёшево.