Управление большим количеством нагрузок

arz_serg
Offline
Зарегистрирован: 05.04.2019

Всем доброго времени суток, господа!

Совсем недавно окунулся с головой в очень этот интересный и увлекательный мир Ардуино. Если с принципами работы датчиков и исполнительных механизмов (благодаря окончанию кафедры приборостроения) и с программированием (благодаря окончанию курсов программирования ещё в школьные годы) на поверхностном уровне проблем особо нет, то вот с "элементной базой" есть прогалы.

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

----------

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 - Двигатели будут работать с линейными передвижениями небольшой массы, на случай, если флоппи-моторчики не потянут - может есть какие недорогие варианты немного помощнее? Точность не играет особой роли.

----------

arz_serg
Offline
Зарегистрирован: 05.04.2019

Только написал и тут меня осенил ещё один нюанс по второму проекту:

Флоппики не имеют обратной связи, а она очень желательна, на случай, если моторчик не сделает шаг из-за нагрузки. Буду пробовать цеплять оптодатчик с диском или линейный потенциометр. Соответственно 28 выводов (вводов для ардуинки) обратной связи тоже очень хотелось бы реализовать как-то покомпактней, тут у меня вообще 0 идей...

Но вообще для начала хотя бы без обратной связи все же можно, это так, на свякий случай дописал :)

Ну и самое главное забыл: заранее всем СПАСИБО БОЛЬШОЕ за советы и подсказки. Не судите строго, если где-то что-то технически не грамотно написал/спросил, я ардуину получил ровно неделю назад :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вас не смущает, что TLC5940 регулирует свои нагрузки не "плавно", а ШИМом?

Если нет, то ставьте на выходы TLC5940 транзисторный массив ULN2803A (потребуется два, т.к. они по 8 транзисторов) и имеете 16 ШИМ выходов по 500мА каждый.

sadman41
Offline
Зарегистрирован: 19.10.2016

2) Можно, вопрос только в том - обеспечите ли вы плавность хода при заданной скорости.
3) Подключал через 4988, шнек не сорвало, дыма не было. Главное - ток посчитать правильно.

arz_serg
Offline
Зарегистрирован: 05.04.2019

ЕвгенийП пишет:

Вас не смущает, что TLC5940 регулирует свои нагрузки не "плавно", а ШИМом?

Если нет, то ставьте на выходы TLC5940 транзисторный массив ULN2803A (потребуется два, т.к. они по 8 транзисторов) и имеете 16 ШИМ выходов по 500мА каждый.

ШИМ не смущает)

А так можно? TLC же вроде землю к выводам подтягивает, а на вход ULN-ки должен "+" падать? Или я чего-то не знаю? :D

arz_serg
Offline
Зарегистрирован: 05.04.2019

sadman41 пишет:

2) Можно, вопрос только в том - обеспечите ли вы плавность хода при заданной скорости.
3) Подключал через 4988, шнек не сорвало, дыма не было. Главное - ток посчитать правильно.

2) а как это влияет на плавность хода? типа длинный каскад будет тормозить или что? если да, то на худой конец можно разбить 2-4 каскада наверное?

3) а от напряжения меньше номинала ток потребляться больше будет? я просто кафедру-то приборостроения закончил, но вот электротехнику прогуливал :D

sadman41
Offline
Зарегистрирован: 19.10.2016

arz_serg пишет:

2) а как это влияет на плавность хода? типа длинный каскад будет тормозить или что? если да, то на худой конец можно разбить 2-4 каскада наверное?

Типа сможете ли лично вы и 595 обеспечить импульсы на STEP с отклонением длительности в микросекунды. Я с таким не баловался, но вижу тут потенциальную проблему.

arz_serg пишет:

3) а от напряжения меньше номинала ток потребляться больше будет? я просто кафедру приборостроения закончил, но вот электротехнику прогуливал :D

4988 ограничивает ток на обмотках, т.е. является драйвером типа Constant Current. А для флоповодных движков ток не указывается, потому что они (наверное) управляются драйверами Constant Voltage. Однако я подключал двигатель именно так, как написано, БП не помню уж какой был... 9V, наверное. Сопротивление обмотки померял, ток примерно высчитал и на драйвере выставил. Крутило всё туда-сюда нормально, без дыма.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arz_serg пишет:

А так можно? TLC же вроде землю к выводам подтягивает, а на вход ULN-ки должен "+" падать? Или я чего-то не знаю? :D

Ой, виноват. Она, кстати, ещё и землёй рулит. Вас выручат pnp-транзисторы на входах. Они открываются землёй и инвертируют сигнал. Про pnp транзисторы для исправления ситуации, см. как я их применил с той же TLC5940 вот здесь.

А чтобы рулила не землёй, а питанием, возмите вместо ULN-ки UDN2981A - тоже самое, только неинвертирующее.

 

arz_serg
Offline
Зарегистрирован: 05.04.2019

sadman41 пишет:

Типа сможете ли лично вы и 595 обеспечить импульсы на STEP с отклонением длительности в микросекунды. Я с таким не баловался, но вижу тут потенциальную проблему.

4988 ограничивает ток на обмотках, т.е. является драйвером типа Constant Current. А для флоповодных движков ток не указывается, потому что они (наверное) управляются драйверами Constant Voltage. Однако я подключал двигатель именно так, как написано, БП не помню уж какой был... 9V, наверное. Сопротивление обмотки померял, ток примерно высчитал и на драйвере выставил. Крутило всё туда-сюда нормально, без дыма.

2) А, т.е. дело в частоте работы 595, она ограничена... теперь понял, не задумывался над этим. Ну в принципе я сегодня движочек напрямую к ардуинке подключал баловался, плавность хода меня устраивала даже при даже при delay(1-5)

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

b707
Offline
Зарегистрирован: 26.05.2017

arz_serg пишет:

2) А, т.е. дело в частоте работы 595, она ограничена... теперь понял, не задумывался над этим.

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

А если таких регистров у вас не один - то еще умножте на число регистров и посчитайте, потянет ли сама ардуина столько импульсов...

arz_serg
Offline
Зарегистрирован: 05.04.2019

ЕвгенийП пишет:

Ой, виноват. Она, кстати, ещё и землёй рулит. Вас выручат pnp-транзисторы на входах. Они открываются землёй и инвертируют сигнал. Про pnp транзисторы для исправления ситуации, см. как я их применил с той же TLC5940 вот здесь.

А чтобы рулила не землёй, а питанием, возмите вместо ULN-ки UDN2981A - тоже самое, только неинвертирующее.

Ну огород из 120 транзисторов городить что-то совсем не хочется, это тогда можно и без всяких микросхем с TLC сразу на транзистор, а за ним нагрузка.... я же наоборот пытаюсь уйти от грядки транзисторов.

ЧТО-то я запутался и не соображу как это всё вместе работать должно. Можно по рабоче-крестьянски, на пальцах? Если бы скажем у нас ток потребления ограничивался, скажем 100мА, то мы бы делали как:

Все нагрузки шли бы на общую шину +12В, минусами они бы шли на выходы TLC-шки.

На TLC приходило бы +5В с Ардуины, земля и управляющие провода с Ардуины. Верно?

Но нам не хватает тока в 100мА, нам нужно 500, поэтому мы ставим... UDN2981A... Как мы её ставим?

Входы для UDN берутся с выходов TLC, это понятно

На ногу Vc подаётся питание с ардуины +5 или +12 питающие нагрузки? Сами нагрузки к выходам микросхемы идут плюсами или минусами?

arz_serg
Offline
Зарегистрирован: 05.04.2019

Так там же в неё бит информации записывается сразу целиком. "10010110" ставятся разом на 8 выходов. А в следующий регистр они передаются последовательно. Т.е. на следующем шаге с ардуины приходит "01101001", а предыдущий бит "10010110" отправляется на второй регистр уже первым регистром, а не самой ардуиной.

Понятно, что дела обстоят иначе, если несколько каскадов делать параллельно.

Кстати вопрос, а как вообще устроина ардуина (цифры беру с потолка, так как реальных цифр не знаю, опять же не задавался таким вопросом): например она может выдавать на один канал максимум 500 импульсов в секунду. На два она тогда сможет только по 250 давать? Или на оба по 500?

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

b707
Offline
Зарегистрирован: 26.05.2017

arz_serg - начнем с очень простого вопроса - у вас все 28 моторов крутятся строго синхронно? - стартуют и останавливаются разом и если крутятся - то с одной скоростью? - подозреваю, что нет

А если нет - значит никакого управления 4 моторами записью в регистр одного байта у вас не получится, надо будет на каждый мотор слать свой импульс в строго нужное время.

Таким образом, чтобы НЕЗАВИСИМО управлять 28 моторами - нужно ичастоту импульсов в 28 раз больше, чем для одного мотора

Цитата:
Кстати вопрос, а как вообще устроина ардуина (цифры беру с потолка, так как реальных цифр не знаю, опять же не задавался таким вопросом): например она может выдавать на один канал максимум 500 импульсов в секунду. На два она тогда сможет только по 250 давать? Или на оба по 500?

контроллер одновременно может выполнять только одну команду. Так что в общем случае - если на один канал 500, то на два канала только по 250

sadman41
Offline
Зарегистрирован: 19.10.2016

Ардуина устроена так.

50 имп. в секунду

while (true) {
   digitalWrite(13, HIGH);
   delay (10);
   digitalWrite(13, LOW);
   delay (10);
}

(50-X) имп. в секунду, где X зависит от скорости UART

while (true) {
   digitalWrite(13, HIGH);
   delay (10);
   digitalWrite(13, LOW);
   delay (10);
   Serial.println("abracadabra");
}

(50-X3) имп. в секунду, где X3 определяется временем выполнения foo(), bar() и вообще может быть непредсказуемо.

while (true) {
   digitalWrite(13, HIGH);
   delay (10);
   digitalWrite(13, LOW);
   delay (10);
   foo();
   bar();
}






 

arz_serg
Offline
Зарегистрирован: 05.04.2019

b707 пишет:

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 в ряд, то слать каждый раз надо целую пачку для всех регистров.... есть над чем поразмыслить вобщем )

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

А если нет - значит никакого управления 4 моторами записью в регистр одного байта у вас не получится, надо будет на каждый мотор слать свой импульс в строго нужное время.

Дак импульс - это дело такое... на выходе 595 можно постоянно ставить 1 и будет долгий импульс. Достаточно дискретность иметь с запасом, у 595 rise time наносекунды, поэтому он есть. Главное - чтобы программист ритмичность сохранил и правильно рассчитал битовые последовательности соответственно длине импульса.

b707
Offline
Зарегистрирован: 26.05.2017

не знаю, вот sadman41 попрравит - но по-моему управлять 28 моторами с одной ардуины через всякие расширители портов или сдвиговые - это утопия.

Я бы выкинул сдвиговые вообще - а вместо этого разделил моторы на 3-4 группы по смыслу - ну скажем если это робот - то "моторы ноги", "моторы-руки" и тл - и на каждую группу поставил свою ардуину.

arz_serg
Offline
Зарегистрирован: 05.04.2019

а ну да, всё... дошло с частотой

теоретически будь у нас 1 мотор, байт "10 10 00 00" - это было бы 4 команды для одного мотора

а так у нас это по одной команде на 4 мотора, а время на передачу затрачивается одинаковое.... теперь понял, спасибо что навели на эту мысль )

b707
Offline
Зарегистрирован: 26.05.2017

arz_serg пишет:

Ну постойте. Например у нас к одному сдвиговому регистру подключено 4 драйвера A4988. Выводы в таком порядке (Ш-шаг, Н-направление): Ш1 Н1 Ш2 Н2 Ш3 Н3 Ш4 Н4

нужно например 5 секунд крутить 1ым и 2ым мотором в одну сторону, потом включить 3ий, а на втором включить реверс.

мы 5 секунд шлем байт "10 10 00 00"

вы для начала почитайте, как работают драйверы шаговых моторов. У вас полное непонимание принципа. Чтобы 5 секунд крутить мотор - недостаточно один раз поставить на выходе нужны уровень. Нужно давать импульс НА КАЖДЫЙ ШАГ. То есть если крутите мотор со скорость 200 шагов секунду - то за эти 5 секунд вы должны выдать ТОЛЬКО НА ЭТОТ МОТОР 1000 импульсов. Причем, если хотите чтоб мотор крутился ровно - импульсы надо давать строго раз в 5 миллисекунд. и это только один мотор.

arz_serg
Offline
Зарегистрирован: 05.04.2019

b707 пишет:

arz_serg пишет:

Ну постойте. Например у нас к одному сдвиговому регистру подключено 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 вывода), а одиночный импульс на драйвер, а драйвер сам по кругу будет перебирать полярности на обмотках. А пауза между импульсами это скорость вращения - это я всё прекрасно понимаю

arz_serg
Offline
Зарегистрирован: 05.04.2019

b707 пишет:

не знаю, вот sadman41 попрравит - но по-моему управлять 28 моторами с одной ардуины через всякие расширители портов или сдвиговые - это утопия.

Я бы выкинул сдвиговые вообще - а вместо этого разделил моторы на 3-4 группы по смыслу - ну скажем если это робот - то "моторы ноги", "моторы-руки" и тл - и на каждую группу поставил свою ардуину.

Да мне в голову уже такие мысли и идут )

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Найдете дешёвую обратку - напишите. Мне тоже интересно.

b707
Offline
Зарегистрирован: 26.05.2017

arz_serg пишет:

Да мне в голову уже такие мысли и идут )

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

главное в этом случае - не погрязнуть в межпроцессорном взаимодействии - а то весь выигрыш от нескольких ардуин уйдет на "переговоры" между ними :)

Для этого надо, чтоб каждая ардуина умела сама управлять своими моторами, а не просто траслировала импульсы от "главного мозга". Иными словами - если у вас отдельный МК управляет "пальцами" - не надо ему слать команды "передвинь мизинец на 2 мм", вместо этого командуйте всей руке - "сжать кулак"

arz_serg
Offline
Зарегистрирован: 05.04.2019

sadman41 пишет:

Найдете дешёвую обратку - напишите. Мне тоже интересно.

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

у меня нет высоких требований по точности, мне надо-то 5 положений на 5ти сантиметровом червяке :)

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

sadman41 пишет:

Найдете дешёвую обратку - напишите. Мне тоже интересно.

Взять датчик препятствия (который с чёрным ИК светодиодом и прозрачным фототранзистором) и направить на вал, по принципу тахометра alexgyver, вал покрасить в чёрно-белые полосы. Минусы - большие габариты (см 20 в диаметре), зато дёшево.