1024 цифровых порта через I2C
- Войдите на сайт для отправки комментариев
Вс, 13/09/2020 - 19:50
Задача с одной Arduino UNO получить 1024 цифровых порта (а желательно еще больше), допускается потеря в скорости. Протокол - I2C, но можно рассмотреть другие варианты.
Есть опыт в программировании и ведро энтузиазма, но так как изучением Ардуин (и микроконтроллеров в целом) занимаюсь без малого неделю, а так же не очень уверенно чувствую себя в цифровой схемотехнике и (этих ваших) протоколах, прошу проверить идею на наличие подводных камней. К сожалению, имею на руках только Ардуину - купил бы остальное железо, потренировался бы на макете, но нужных микросхем в нашем городе нет, а определиться с комплектацией нужно как можно скорее. В общем, извиняюсь за теорию без практики :)
Вариант 1
Насколько понимаю, для расширения портов достаточно иметь микросхему MCP23017 или MCP23S17. Допустим, выбрал I2C и соответствующую ему MCP23017. И тут у меня возникает непонимание: максимальное количество адресов в I2C - 127 + адрес Ардуины (кстати, какой I2C адрес Ардуины?). Допустим, было бы у меня 127 MCP23017, каждой из которых присвоил бы уникальный адрес, в каждой имеется 16 выходов - в сумме 2032 выхода - хватило бы с запасом! Было бы круто, но у MCP23017 почему-то предусмотрели лишь 8 возможных адресов и суммарно с восьми микросхем я получаю 128 цифровых каналов (если правильно понимаю - в моем распоряжении есть лишь 0х20 ... 0х27 I2C адреса).
С другой стороны, можно дополнить каждые восемь MCP23017 микросхемой PCA9547 аналогично тому, как поступила в своем модуле Тройка ("https://amperka.ru/product/troyka-i2c-hub"), в котором тоже первые 4 бита адреса фиксированные, а из доступных - 0х70 ... 0х77 и - аллилуйя! - они не совпадают с MCP23017. Итого, с подключением одной PCA9547 получаю 1024 порта, а с восьми - аж 8192. Можно просто оставить для них место на плате и при необходимости расширения этого должно хватить мне на всю жизнь.
Вариант 2
Этот вариант возник, когда задумался о том, а не возникнет ли в предыдущем варианте конфликт адресов между MCP23017 и PCA9547, но еще не разобрался в том, что адреса все-таки разные. Собственно, беру пару мультиплексоров вроде 74HC151, подключаю попарно выходы:
- "S0", "S1" и "S2" к цифровым выходам Ардуины:
- "Vcc" к "5V";
- "Е-" на землю;
- "Y" одной и другой 74HC151 - к "SDA" и "SCL" Ардуины соответственно;
- "Y-" в воздухе;
- "I0" ... "I7" - к соответствующим I2C входам MCP23017.
Либо "SCL" можно оставить в покое и вторая 74HC151 вообще не нужна? Выходов становится чуть больше, зато программно управлять проще - уж адрес-то из трех бит для мультиплексора я соберу.
Вариант 3
Ваш вариант? Может все то, что я написал, вообще никуда не годится, что сигналы I2C будут содержать кучу ошибок, или еще по какой причине? На всякий случай - длина I2C кабеля от PCA9547 (или 74HC151) до платы с восьмеркой MCP23017 - не более 1 м, длина кабеля I2C от Ардуины до PCA9547 (или 74HC151) - не более 5 см. Скорость управления не сильно важна (не более 10 команд в секунду), так что можно, например, дублировать каждую отправляемую команду. Может, пока не поздно, следует начать думать над другим вариантом? Может лучше прикинуть вариант с SPI, а то и вовсе фигачить микроконтроллер на каждую плату с восемью MCP23017 и передавать все по UART? Но если честно, вариант с UART для меня пока совсем темный лес - хотел бы погрузиться, но времени на него вряд ли хватит.
Произвольные адреса таким микросхемам нельзя назначить. I2С через мультиплексоры или с ворхом шнуров работать не будет. Вообще такая задача так не решается, и тебе тупо памяти не хватит в уно. Лучше напиши внятно что хочешь сделать.
Можно 20 шт ArduinoMega приколхозить ;) Соединить все их в кольцо по UARTу....
Почему произвольные? Адреса MCP23017 присваиваю единоразово через контакты А0 - А2, до 8 адресов, фиксирую их в скетче и забываю до следующего ремонта. Адрес на PCA9547 - в общем-то любой, для определенности пускай 0х70.
Об этом, если честно, не задумывался. Неужели не переварит пару библиотек и небольшой кусок моего кода? UNO могу заменить на MEGA.
Почему? Набежит большая емкость?
Хочу, собственно, получить 1024 цифровых независимых порта. При этом, пока я управляю одним портом, любой другой должен продолжать держать значение "0" или "1". В общем-то можно сказать, что я хочу моргать матрицей из 1024 диодов. В общем-то пока писал, кажется, понял, почему оно так не решается, но хотелось бы услышать конкретные советы по решению задачи) Вариант с 20 мегами, конечно, не подходит.
Тебе порты нужны ради портов? Я не спрашивал какими средствами, я спросил что.
А что, daisy chain на 595 не канает?
В общем-то можно сказать, что я хочу моргать матрицей из 1024 диодов.
Такая задача решается через динамическую индикацию и каскад сдвиговых регистров
Если не изобретать велосипед, а использовать готовые наработки - то Уно может управлять и матрицей из 5 тыс диодов, задействуя при этом всего 6 пинов
Тсссс! Не говорите человеку про адресные светодиоды! А то гештальт накроет!
http://arduino.ru/Tutorial/registr_74HC595
Оно? Спасибо, сейчас посмотрю)
Поздно...
Ну если бы я изначально думал о задаче как об аналоге монохромного дисплея - наверное и вгуглились бы сдвиговые регистры, а не такие вот расширители портов. В любом случае спасибо, могу хоть завтра купить парочку 74HC595 и потренироваться поморгать.
Но все-таки, чтобы этот гешальт не накрыл - почему мое безобразие с I2С, собственно, безобразие? Что велосипед - понятно, но почему не заработало бы?
https://www.ti.com/lit/an/snla026a/snla026a.pdf
Изучи, посчитай приблизительно для своей системы, и всё будет понятно. С регистрами в ту же проблему упрешься, кстати говоря.
https://www.ti.com/lit/an/snla026a/snla026a.pdf
Изучи, посчитай приблизительно для своей системы, и всё будет понятно. С регистрами в ту же проблему упрешься, кстати говоря.
Ну как бы да, импеданс - он такой. Для этого собираюсь располагать микросхемы, обрабатывающие цифровые сигналы, в непосредственной близости друг от друга, а заземление отдельных плат объединять как можно короче. На доли-единицы МГц, полагаю, должно хватить. В конце концов, ничего не мешает мне сделать 50-омные управляющие линии и связь через коаксиалы с BNC.
А я бы взял ведро STM8S003F3P6 они сейчас копейки стоят, ну или чего нибудь другого из STM8. Можно просто в качестве расширителя портов использовать, а можно и интеллект какой прикрутить.
А я бы взял ведро STM8S003F3P6 они сейчас копейки стоят, ну или чего нибудь другого из STM8. Можно просто в качестве расширителя портов использовать, а можно и интеллект какой прикрутить.
Вариант с регистрами пока кажется более заманчивым, и думаю, что его-то я сейчас точно реализовал бы. С другой стороны, можно конечно сделать гибрид - в пределах платы работать с регистром, а между платами и особенно там, где действительно может появиться длинный провод - заново генерировать сигнал при помощи STM8S003F3P6. И цены между 74HC595 и STM8S003F3P6 практически не отличаются, особенно с учетом того, что у STM8S003F3P6 выходов в два раза больше. Спасибо!
1м - это не особо длинный провод так-то.
Можно замутить на MAX7219 или им подобных .Одна микросхема MAX7219 позволяет управлять 64 ЛЕД .
Поздно...
Ну если бы я изначально думал о задаче как об аналоге монохромного дисплея - наверное и вгуглились бы сдвиговые регистры, а не такие вот расширители портов. В любом случае спасибо, могу хоть завтра купить парочку 74HC595 и потренироваться поморгать.
Но все-таки, чтобы этот гешальт не накрыл - почему мое безобразие с I2С, собственно, безобразие? Что велосипед - понятно, но почему не заработало бы?
А вот интереснее замутить подобное с адресной лентой. Возможно ли такое вообще? А если да, то наверное к монику путь уже открыт на дуне....
Можно замутить на MAX7219 или им подобных .Одна микросхема MAX7219 позволяет управлять 64 ЛЕД .
pca9548 8-channel I2C-bus switch
pca9555 16-bit I2C-bus and SMBus I/O port with interrupt
от NXP
STM8S003F3P6 стоит в 2 раза дешевле, а портов там можно сделать больше.
Не, пожалуй, от ведра дешевых микроконтроллеров пока откажусь, тем более управлять регистрами довольно просто. По крайней мере тремя. А вот теперь вопрос - сколько таких 595 я могу закаскадировать? Если повезет - у меня будет 640 моргалок или 80 штук 595-х. Последовательно их включать прям все 80 не хочу - слишком длинная цепь получится. Скорее всего буду включать параллельно каскадами по 20 (или есть возможность даже по 4). Я так понял, на все мне нужна общая защелка и часы, остальные 4-20 пинов смогу параллелить? Сигнал от одного регистра к другому вообще затухает?
А вот теперь вопрос - сколько таких 595 я могу закаскадировать? Если повезет - у меня будет 640 моргалок или 80 штук 595-х.
в теории 1000000000+ - стока хватит? в реалии возникнут проблемы с питанием и вообще монтажный всякие сложности.
если цепь длинная, что касается тактирования понижать скорость передачи. Ну и драйвер (тактирование) - много ног кормить придется, а они не святым духом питаются, да и емкость входную имеют.
каскад из 20 штук... - думаю тактировать такое кол-во лучше через драйвер и скорость передачи данных подобрать,
и вообще я ничего не понял - решение для каменного века очень хорошее, но для 2020++гг - как-то атавизмом попахивает...
А можно разбить на отдельные блоки, которые будут по цепочке передавать данные каждый блок следующему пока не дойдет до адресата. Или взять кучу микроконтроллеров, и всех паралельно посадить на одну последовательную шину (например 485) каждый микроконтроллер в простейшем случае имеет какое-то количество выходов, получим число корпусов - 1024/<число используемых выходов>
За кажущейся схемотехнической сложностью, может быть конструкционная простота. Например последний вариант очень просто разрабатывать отлаживать и ремонтировать, так как разрабатываться и отлаживаться не все устройство а отдельный блок которые потом будет размножен. Плюсом получим масштабируемость. Минус - некоторая заумность.
Не, пожалуй, от ведра дешевых микроконтроллеров пока откажусь, тем более управлять регистрами довольно просто. По крайней мере тремя. А вот теперь вопрос - сколько таких 595 я могу закаскадировать? Если повезет - у меня будет 640 моргалок или 80 штук 595-х.
595 управлять легче, но обвеса больше.
595 управлять легче, но обвеса больше.
и 7219 с её динамой значительно экономичнее по току.
7219 вроде 8шт. в chain позволяет или я не там читал? Товарища знаю - он 10 шт 595-з на патч-кордах без особых знаний в линию бахнул и не жужжит.
Про фичи я спорить не буду, она интересней.
7219 вроде 8шт. в chain позволяет
На 640 диодов можно, например, 320 корпусов ТМ2 в линию бахнуть...
====
на 640 светодиодов:
80 корпусов 595 + 640 резисторов - 2560 дырок для пайки.
10 корпусов 7219 - 240 дырок. Разница 2320 точек сверления и пайки.
595 При 15 ма на диод - около 10 ампер питание.
7219 Ток раз эдак в 5 меньше. Разница ~ 7-8 ампер.
SLKH, мы же не знаем - нравится ТС сверлить или он будет SMD монтировать. А про экономику речь вообще не шла. Я с удовольствием почитаю про альтернативные варианты.
7219 Ток раз эдак в 5 меньше. Разница ~ 7-8 ампер.
Ну-ка ну-ка, а вот это уже серьезно. Не то чтобы у меня не планируется БП на несколько ампер, но вот цифровая часть в моем понимании должна была потреблять от 5 В какие-нибудь сотни микро - единицы миллиампер на элемент. При общем количестве 585 в 80 штук получил бы 100 мА... ну 500 мА... но чтоб прям амперы?! Если правильно читаю даташит - для комнатной температуры, без учета саморазогрева устройства, у меня есть:
- ток утечки 595 в выключенном состоянии II = 1,0 мкА (VI = VCC or GND; VCC = 5.5 V);
- выходной ток в выключенном состоянии IOZ = 5,0 мкА (VI = VIH or VIL; VCC = 5.5 V; VO = VCC or GND);
- поддерживающий ток ICC = 80 мкА (VI = VCC or GND; IO = 0 A; VCC = 5.5 V);
- дополнительный поддерживающий ток ΔICC = 150...675 мкА (per input pin; other inputs at VCC or GND; IO = 0 A; VI = VCC - 2.1 V; VCC = 4.5 V to 5.5 V).
За 595 на самом деле будет стоять не диод, а ULN2803APG в качестве развязки для следующих за ним реле. Светодиоды я рассматривал в качестве примера, так как задача на мой взгляд аналогичная - даже проще, так как нет дополнительных токов на каждом канале 74PH595 и, соответственно, без резисторов. У ULN2803APG будет свое мощное питание 12 В, на которое закладываю уже амперы (в пиковом потреблении 6,4 А). Собственное потребление ULN2803APG, насколько понимаю, немногим больше 74PH595 - порядка 2 мА, или 160... ну пусть 200 мА на всю схему.
Итого в первом варианте подобрал БП 200 Вт 12 В, от него же - 12 В на Ардуино, которая питала бы всю цифровую часть. Потом включил параноика и решил на всякий случай заложить отдельный небольшой преобразователь с 12 на 5 В (10 Вт) для цифровой части - мало ли, вдруг не учел питание цифры. Но чтоб 7-8 А дополнительного тока на одни 74PH595... извольте, сударь, объяснитесь пожалуйста! =)
О, ТС очень нравится сверлить отверстия! Настолько нравится, что он их, бывает, сверлит по несколько штук на сантиметр линии. Со сборкой тоже проблем не будет, ни в SMD, ни в дырках... ох, пардон, отверстиях =) 74PH595, кстати, будет SMD - она и компактнее, и вроде как дешевле, а вот ULN2803APG именно в отверстиях - она помощнее SMD-корпуса. Экономический вопрос тоже прошу не рассматривать - лишний килорубль потратить не страшно. Страшно, если из-за какой-нибудь глупой ошибки оно не заработает. Ну еще есть проблема с местом в корпусе, но пока все умещается.
Да, о понижении тактовой частоты в случае проблем уже думал. Решил, что пространство для маневра у меня имеется (с 16 до 1 МГц ?) и успокоился.
Собственно, у меня 4 блока (платы), в каждом блоке 20 ячеек, по одной паре 74PH595 на каждую ячейку. Кстати, пока один блок отрабатывает, остальные в общем-то могут ожидать. Кстати, раз так - можно сделать 8 блоков по 10 ячеек, задействовав 24 цифровых выходов Ардуины, и пускай у каждого блока будет по своему собственному пину данных, часов и защелки. А в целом - да, все каналы нужны в одном месте. Беда в том, что я микроконтроллер-то в лицо вижу только вторую неделю, а от меня уже хотят определиться с комплектацией. Отсюда и нежелание вставлять в схему вспомогательные МК - с Ардуиной бы разобраться, отрисовать и запустить плату и поскорее бы приступить к софту на ПК. Да и зачем вспомогательные МК, если от Ардуины уже можно параллелить, а выходов Меги теперь с головой хватает? Если не возникает проблем с затуханием, искажением, помехами или еще какими подводными камнями - задача в общем-то стандартная - "поморгать несколькими диодами". На самом деле отдельное спасибо за критику, заставил задуматься еще раз.
Как я понял, SLKH посчитал амперы с учётом нагрузки выходов.
Есть ещё такая штуки, как TPIC6A595, TPIC6B595... На сайте производителя советую покопаться в этом разделе.
В общем-то можно сказать, что я хочу моргать матрицей из 1024 диодов.
А вот очень интересно, вам принципиально самому с нуля ими моргать для собственного удовольствия или все таки хотите получить какое то полезное устройство? Если второе, то может вы его опишите все таки?
Потому что у меня есть ощущение, что вы изобретаете самокат, просто описываете его в стиле "Мне надо, что бы два коротких цилиндра были соединены в одной плоскости, но один из них мог менять свою ориентацию по горизонтали". А если описать "мне нужна доска на колесах с рулем, на которой можно ехать, отталкиваясь ногой", то вам тут же дадут простое решение.
А вот очень интересно, вам принципиально самому с нуля ими моргать для собственного удовольствия или все таки хотите получить какое то полезное устройство? Если второе, то может вы его опишите все таки?
Потому что у меня есть ощущение, что вы изобретаете самокат, просто описываете его в стиле "Мне надо, что бы два коротких цилиндра были соединены в одной плоскости, но один из них мог менять свою ориентацию по горизонтали". А если описать "мне нужна доска на колесах с рулем, на которой можно ехать, отталкиваясь ногой", то вам тут же дадут простое решение.
Ох... да, в общем-то есть готовое решение. У Кейсайта, например. Если отнормировать, выходит порядка 10 тыщ долларов на то же количество выходов. И кстати, судя по характеристикам, ничего космического они внутрь не ставили - у меня будет не хуже и намного дешевле даже с учетом изготовления плат и сборки. Есть другое готовое решение, у кого-то даже реализованное: тумблеры, блокнот и специально обученная обезьянка, которая сидит большую часть дня, переключает и записывает. Я этой обезьянкой быть не хочу и другим не желаю) В любом случае, было предложено несколько решений, и это выбрал не я, но я очень рад, что выбрали именно его. Задача для меня новая, крайне интересная и за чужой счет - почему б и не взяться. Конечно не комильфо ставить внутрь МК для хобби, а с другой стороны - почему бы и нет, если МК недорогой и достаточно мощный, а устройство собирается сугубо для внутренних целей?
Ну а потом, имея опыт работы с такими штуками, можно будет племяннику машинку радиоуправляемую собрать, а то и вовсе заинтересовать программированием))
7219 Ток раз эдак в 5 меньше. Разница ~ 7-8 ампер.
... но чтоб прям амперы?!
.. извольте, сударь, объяснитесь пожалуйста!
Ибо что было дважды заявлено? "...можно сказать, что я хочу моргать матрицей из 1024 диодов. (#3) у меня будет 640 моргалок (#20)"
А потому что некоторые люди - идиоты, и если не дают ответов на резонный вопрос, заданный еще в самом начале темы - разговор следует прекращать, иначе себе дороже.
Я за этот вариант. Что то похожее на DMX512.
А вот очень интересно, вам принципиально самому с нуля ими моргать для собственного удовольствия или все таки хотите получить какое то полезное устройство? Если второе, то может вы его опишите все таки?
Потому что у меня есть ощущение, что вы изобретаете самокат, просто описываете его в стиле "Мне надо, что бы два коротких цилиндра были соединены в одной плоскости, но один из них мог менять свою ориентацию по горизонтали". А если описать "мне нужна доска на колесах с рулем, на которой можно ехать, отталкиваясь ногой", то вам тут же дадут простое решение.
То есть ЧТО ЭТО ТАКОЕ будет, вы принципиально говорить отказываетесь?
Ну-ну, удачи помогающим...
Лично я не умею конструировать, если не понимаю, что получу в итоге.
Конечно не комильфо ставить внутрь МК для хобби, а с другой стороны - почему бы и нет, если МК недорогой...
я вам больше скажу, некоторые используют в личных целях МК для мигания светодиодиком - потому, что "так проще" им мыргать. У меня под порогом коврик греющий, а на МК собран простой компаратор - чего было, то и поставил для просушки обуви.
То есть ЧТО ЭТО ТАКОЕ будет, вы принципиально говорить отказываетесь?
Что-то сильно секретное и загадочное.
Была у мя когда-то любовь с изделием отечественной промышленности, в котором было >1000 реле (корабляцкая АТС). Что можно придумать сейчас с таким числом релейных выходов - не представляю.
Конечно не комильфо ставить внутрь МК для хобби, а с другой стороны - почему бы и нет, если МК недорогой...
я вам больше скажу, некоторые используют в личных целях МК для мигания светодиодиком - потому, что "так проще" им мыргать. У меня под порогом коврик греющий, а на МК собран простой компаратор - чего было, то и поставил для просушки обуви.