Ещё раз об увеличени количества портов i/o.
- Войдите на сайт для отправки комментариев
Предложено много вариантов увеличения количества портов ввода-вывода на разных форумах, но хочу всё таки предлжить свой вариант, он не оригинален, зато проверен и удобен.
Приемущество данного решения состоит в использовании ис mcp23016, отличие от сдвиговой(регистровой) схемы - нужно всего 2 входа, доступ к портам проще и удобнее, на просторах инета предлагается такой вариант на PCF8574, но там всего 8 разрядов.
Итого имеем mcp23016 16 битный i2c I/o expander (расширитель) дока
Вот типовая схема подключения экспандера
Соответственно выводы SCL SDA запаралелены, SCL-подключаем к А5, SDA- к А4 Arduino. Внешняя rc цепочка для тактового гениратора. Адресная шина А0-А1-А2 для задания адресации при подключенни нескольких экспандеров, подаём vdd и vss для изменения адреса. Ну и наверное ясно что GPA 0-7 и GPB 0-7 это непосредственно порты ввода вывода.
Итог 2ис стоимостью около 3$ за пару, 4 деталюшки обвязки, 2 порта на нашем arduino и получаем 32 дополнительных порта ввода вывода.
Скетч управления пока что не привожу, допишу когда всё спаяю и проверю. Сама схема 100% рабочая использую её уже давно, правда как расширетель для других мк.
Для большей наглядности позже хочу сделать на основе данной схемы следуещее(на одной платке и в одном скетче)- подключение lcd wh1602l (инверт) кнопки управления(матрица 3*3) управление нагрузками 2шт-220в 6шт-24в информационные светодиоды 5шт, датчик температуры, спикер. Делать буду точно так как это 40% моего девайса.
Хорошая информация, утащил в свою копилку знаний. С нетерпением ждем скетча.
вот бы еще кто на плисине сделал с увеличением АЦП входов итд с готовым кодом ПЛИС
Получил детальки, собрал схему. К сожалению lcd пока что подключить не удалось(слаб я пока в arduino програмировании) хоть и перерыл сотни линков по этой теме. Но мой поиск не был бесполезным :). Eсть готовое решение, библиотека, для этой микрухи, проверено работает.
Вот koenwar.wordpress.com/io-expander-library/ сама библиотека, пример, схема.
Единственное что могу добавить от себя - шины SCL и SDA нужно подтягивать к +5в через рез 4.7к. По крайней мере на всех сторонних сайтах о ic2 так делается всегда.
Схему бы чуть покрупнее.
Я поправил вывод. Сама картинка от icms была крупнее.
Кстати, fritzing по умолчанию сохраняет весь размер листа, для аккуратного вывода можно обрезать белые поля потом. Не знаю можно ли в самом fritzing изменить размер листа.
А получилось уже подключить LCD к MCP?
Авторы билиотки сами всё рализовали.
Переделанный код библиотеки работы сдисплеем https://github.com/adafruit/LiquidCrystal
описание http://learn.adafruit.com/i2c-spi-lcd-backpack/connect-to-i2c
также в библиотеке работы с mcp есть уже всякие примеры https://app.box.com/s/e97969afa58e086b46e6
Хотя иммено для подключения дисплея 16*2 я бы рекомендовал вариант на микросхеме PCF8574 она дешевле в 2 раза и ног меньше(разводить, паять проще, корпус меньше)
Тут описалово про данный способ подключения http://jt5.ru/examples/oled-i2c/
доброго времени суток, подскажите в микросхеме mcp23016 входы выходы идут как цифровые иль можно использовать как аналоговые входы.
А давайте почитаем даташит. Гугл выдал первой вот такую ссылку http://ww1.microchip.com/downloads/en/DeviceDoc/20090C.pdf
Смотрим таблицу 1-1 на третьей странице и вопрос уже и не вопрос.
Нет только цифра, для аналога посмотрите аналоговый демульплексор(много вариантов)
D74HC4052
CD4051
ок, спасибо за подсказку
Спасибо, хороший вариант. Есть ещё MAX7312 и ещё несколько его разновидностей, но эта почему-то дешевше на Али.
Подскажите пожалуйста насколько максимально можно увеличить количество портов ?
Базово для mcp23016(17) 3 bit adress т.е. 8*16 портов. Если сделать управляемую адресную шину то до бесконечности(с некотороми нюансами)
Всем добрый день!
А как и куда подключается 6 выход МСР23016 - прерывание INT? Никак не могу найти ответ.
Изучаю пока вопрос каким образом это прерывание обработать, чтобы не циклить непрерывное чтение, а реагировать только в случае изменения состояния входов GP0 или GP1 (INTCAP0, INTCAP1)
Как понял, когда смотрел даташит - можно подцепить на любой вход прерывания дуньки. Куда прицепите, то и программируете. Но, не ручаюсь, уже не очень-то помню как оно там в даташите.
Итого имеем mcp23016 16 битный i2c I/o expander (расширитель) дока
Вот типовая схема подключения экспандера
В каком ПО Вы рисовали эту схему ???
Скет по I2C сопросом пары МСР23016 заработал. Посмотрел осцилоскопом на ноги 6 (жаль не могу приложить картинку - рабочая машина) - там непрерывный меандр даже когда я входы расширителей не трогаю!
Может нужно как-то через С++ залезть на уровень регистров INTCP0/1 (вроде так обозначаются) ???
Схему рисовал в Eagle CAD. Насчёт прирываний посоветовал бы попробывать использовать разные библиотеки. Хотя как по мне прерывания там не особо нужны. Разве что у вас там куча других процессов илии нужно сильно экономить батарею. В таком случае я бы предложил повесить на прерывание арды таймер и опрашивать i2c необходимое количество раз в секунду. Был у меня большой сложный проект с использованием эих мс - от прерываний по изменению пришлось отказаться )) с ними всё как то ужасно косо работало.
Icms, спасибо. Я тоже занялся Eagle CAD (7.5.0). К сожалению не нашел в библах МСР23016. 23017 есть в Адафрутовской библиотеке, но переделать ее в 016 не смог. Вероятно потому, что у меня Лайт версия. Смогли бы выручить и приложить файлик *.lbr ??? Также, никак не могу найти там датчики Холла и обычные клемники типа DG301.
Да, наверное от Прерываний по изменению придется отказаться. Тоже читал, что работает как-то криво. (... but it doesn't work properly...)
Датчики холла ищите так *hall*
это скрипты для создания библиотеки mcp23016 mcp23008 (ess eso)
https://cloud.mail.ru/public/47Jt/1teeExSs3
это сама либа (если не получается)
https://cloud.mail.ru/public/2ftJ/AGnnS5ssU
P/S 23017 удобней контакты расположены для разводки, но она как я помню с открытым колектором
коннекторы ищем так PHOENIX CONNECTOR
или *MPT2*
Супер! Спасибо, МСР23016 присобачил и скриптом и как либру. Однако хотелось бы в корпусе DIL28 round. пытаюсь присобачить новый корпус.
*hall* работает также - нашел в библе alegro.lbr A12
MPT and Phoenix тоже нашел. Огромное спасибо.
Тоже заинтересовался таким вопросом. Понадобились часы с большими цифрами. LED 7-сегментники заказал, но они 2-х-дюймовые уже дорогие, поэтому вероятно матрицы 8х8 LED будут лучше. И посчитал я сколько понадобится ног на часы ), получилось 28. А можно и побольше светодиодное табло собрать, значит ног ещё больше.
И потому тоже заинтересовался. И вспомнил что валяется такая штуковина уже готовая
брал вместе с экранчиком 1602, не понадобилась. Вроде как эту штуку вполне можно использовать не только с lsd1602.
Дело в том, что цена 0,6$ за готовый модуль. Против полутора баксов и паять. Мини про стоит менее полутора баксов, потому не вижу резона в mcp23016.
Да, и на этом модуле выходных ног тоже 16, не 8.
Единственно, я ещё не полностью вник в и2с и потому не совсем отчётливо представляю как всё это кодить.
МНе нужно более 20 входов! Кнопки - тумблемры. Поэтому 23016 или 23017 и поэтому I2C. Читайте выше.
Делаю Монстра!
Toto_G, ног-то 16, только часть висят в воздухе, часть питание, подсветка, контрастность. Реальных портов 8. Управлять очень легко, пример теста записи/чтения:
ну ладно, согласен, что 8 это мало, а строить пирамиды нет особого желания.
а вариант использовать про мини за полтора бакса как расширитель? 20 пинов можно обьявить цифровыми. 2 пина оставить на обмен данными по и2с, 18 останется на входы\выходы . Или много кодить?
Toto_G, а можно взять какую нибудь дешевую мегу8535, у которой дофига портов (4x8), в ней же сделать всю черновую обработку кнопок или чего-там. Это для тех кто и с паяльником дружит :)
Поделитесь реализацией расширителя портов на ардуине (нано, про мини) для ESP8266 по I2C :) чота яндекс не показывает ничего
а точно нужна реализация на ардуине? #23 не походит?
Не, не подходит, это какойто псевдо-расширитель, там и на вход и на выход работает по необычному читал тут. Лучше уж тогда MCP23017. но поскольку ни того ни другого у меня нет, но есть некоторое количество про.мини и нано, наверно попробую заюзать именно их. Нашёл такой пример, но заработает оно на ESP8266 или нет...
спаянная плата pcf8574 стоит дешевле чем отдельно микросхема))
есть конечно сложности с ней, но вместо нее разве что 74hc595 ствить. пока у меня правда стоит 595для есп8266
Не могу сказать что 95 руб/шт это дешевле чем 74, но .. Вы правы. Тоже обыскался отдельных микросхем по вменяемой цене и заказал готовые платы "на всякий случай" парочку, едут такие: https://ru.aliexpress.com/item/PCF8574T-I-O-Fr-I2C-Arduino/32672313491.html (а то тут некоторые часто вопрошают.. так вот если теперь и пишу цену, то по факту заказа :)
плохо искал. дешевле
https://ru.aliexpress.com/item/Free-shipping-New-IIC-I2C-Interface-LCD16...
Коллеги, вы чо? Чуть до обморока не довели.(((
Да, дешевле (есть такая), но как понимаю это под конкретное применение: у неё выход P3 не выходит в разъем и сидит на транзисторном ключе .. можно конечно "поправить" или тупо сдуть микросхему. Но, захотелось иметь "из каропки". :)
bwn, .. упс. А мне такие не попалиь ни разу. Хотя .. "shenzhen IC shop" с тремя звездами .. очередная реинкарнация "женьшеня" .. помню, один похожий мне уже один раз ничего не поставил..
С наступившим Новым Годом всех. Подскажите, пожалуйста, неумёхе, возможно ли (и если возможно, то как) решить следующую задачу.
Имеются ардуинка и расширитель портов MCP23017.
В соответствии с найденной мной библиотекой Adafruit_MCP23017.h (нашел еще одну, но там то же самое) обращение к портам расширителя осуществляется как mcp1.digitalWrite(pin, LOW).
Вопрос: как сделать так, чтобы обращение к пинам расширителя портов было стандартным, т.е. digitalWrite(pin, LOW).
Если это уже обсуждалось, то направьте, пожалуйста. Мне, к сожалению, ничего подобного найти не удалось.
Вопрос: как сделать так, чтобы обращение к пинам расширителя портов было стандартным, т.е. digitalWrite(pin, LOW).
Никак. Смирись.
С наступившим Новым Годом всех. Подскажите, пожалуйста, неумёхе, возможно ли (и если возможно, то как) решить следующую задачу.
Имеются ардуинка и расширитель портов MCP23017.
В соответствии с найденной мной библиотекой Adafruit_MCP23017.h (нашел еще одну, но там то же самое) обращение к портам расширителя осуществляется как mcp1.digitalWrite(pin, LOW).
Вопрос: как сделать так, чтобы обращение к пинам расширителя портов было стандартным, т.е. digitalWrite(pin, LOW).
Если это уже обсуждалось, то направьте, пожалуйста. Мне, к сожалению, ничего подобного найти не удалось.
PS. Вообще-то, конечно, возможно, но - Вам явно не по силам. И, самое главное, это никому не нужно.
Залезь в Адафрутовский исходник, сделай индексатор для класса, обращение будет проще, типа
mcp1[N_BIT] = LOW/HIGH
Если то, что я написал - темный лес, значит тебе пока не под силу. тогда см. #37
Залезь в Адафрутовский исходник, сделай индексатор для класса, обращение будет проще, типа
mcp1[N_BIT] = LOW/HIGH
Спасибо. Это уже несколько ближе к тому, что я хочу получить. Да, пока темный лес, но надеюсь найду тропинку из этой глуши.
А зачем вам это требуется? Прсосто из любви к порядку или есть есть какие то требования?
Можно написать оберточную функцию типа myDigitalWrite() которая в зависимости от номера порта вызывать что надо.