Ещё раз об увеличени количества портов i/o.

icms
Offline
Зарегистрирован: 22.03.2011

Предложено много вариантов увеличения количества портов ввода-вывода на разных форумах, но хочу всё таки предлжить свой вариант, он не оригинален, зато проверен и удобен.
Приемущество данного решения состоит в использовании ис mcp23016, отличие от сдвиговой(регистровой) схемы - нужно всего 2 входа, доступ к портам проще и удобнее, на просторах инета предлагается такой вариант на PCF8574, но там всего 8 разрядов.
 
Итого имеем mcp23016 16 битный i2c I/o expander (расширитель) дока
 
Вот типовая схема подключения экспандера
500
 
Соответственно выводы 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% моего девайса.

Modular
Offline
Зарегистрирован: 05.03.2011

 Хорошая информация, утащил в свою копилку знаний. С нетерпением ждем скетча.

kikia99
Offline
Зарегистрирован: 22.03.2011

вот бы еще кто на плисине сделал с увеличением АЦП входов итд с готовым кодом ПЛИС  

icms
Offline
Зарегистрирован: 22.03.2011

Получил детальки, собрал схему. К сожалению lcd пока что подключить не удалось(слаб я пока в arduino програмировании) хоть и перерыл сотни линков по этой теме. Но мой поиск не был бесполезным :). Eсть готовое решение, библиотека, для этой микрухи, проверено работает.
Вот koenwar.wordpress.com/io-expander-library/ сама библиотека, пример, схема.

 
Единственное что могу добавить от себя - шины SCL и SDA нужно подтягивать к +5в через рез 4.7к. По крайней мере на всех сторонних сайтах о ic2 так делается всегда.

Zaliv
Offline
Зарегистрирован: 05.03.2011

 Схему бы чуть покрупнее.

Alexander
Offline
Зарегистрирован: 25.04.2010

Я поправил вывод. Сама картинка от icms была крупнее.
Кстати, fritzing по умолчанию сохраняет весь размер листа, для аккуратного вывода можно обрезать белые поля потом. Не знаю можно ли в самом fritzing изменить размер листа.

melaz
Offline
Зарегистрирован: 17.08.2011

А получилось уже подключить LCD к MCP?

icms
Offline
Зарегистрирован: 22.03.2011

Авторы билиотки сами всё рализовали.

Переделанный код библиотеки работы сдисплеем 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/

 

 

niki43
Offline
Зарегистрирован: 19.02.2014

доброго времени суток, подскажите в микросхеме mcp23016 входы выходы идут как цифровые иль можно использовать как аналоговые входы.

vk007
Offline
Зарегистрирован: 16.06.2015

А давайте почитаем даташит. Гугл выдал первой вот такую ссылку http://ww1.microchip.com/downloads/en/DeviceDoc/20090C.pdf

Смотрим таблицу 1-1 на третьей странице и вопрос уже и не вопрос.

icms
Offline
Зарегистрирован: 22.03.2011

Нет только цифра, для аналога посмотрите аналоговый демульплексор(много вариантов)

D74HC4052

CD4051

niki43
Offline
Зарегистрирован: 19.02.2014

ок, спасибо за подсказку

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Спасибо, хороший вариант. Есть ещё MAX7312 и ещё несколько его разновидностей, но эта почему-то дешевше на Али.

Alienvlg
Offline
Зарегистрирован: 20.01.2016

Подскажите пожалуйста насколько максимально можно увеличить количество портов ? 

icms
Offline
Зарегистрирован: 22.03.2011

Базово для mcp23016(17) 3 bit adress  т.е.  8*16 портов. Если сделать управляемую адресную шину то до бесконечности(с некотороми нюансами) 

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Всем добрый день!

А как и куда подключается 6 выход МСР23016  - прерывание INT? Никак не могу найти ответ.

Изучаю пока вопрос каким образом это прерывание обработать, чтобы не циклить непрерывное чтение, а реагировать только в случае изменения состояния входов GP0 или GP1 (INTCAP0, INTCAP1)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Как понял, когда смотрел даташит - можно подцепить на любой вход прерывания дуньки. Куда прицепите, то и программируете. Но, не ручаюсь, уже не очень-то помню как оно там в даташите.

EuBeginer
Offline
Зарегистрирован: 16.11.2015

icms пишет:

Итого имеем mcp23016 16 битный i2c I/o expander (расширитель) дока 

Вот типовая схема подключения экспандера 

В каком ПО Вы рисовали эту схему ???

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Скет по I2C  сопросом пары МСР23016 заработал. Посмотрел осцилоскопом на ноги 6 (жаль не могу приложить картинку - рабочая машина) - там непрерывный меандр даже когда я входы расширителей не трогаю!

Может нужно как-то через С++ залезть на уровень регистров INTCP0/1 (вроде так обозначаются) ???

icms
Offline
Зарегистрирован: 22.03.2011

Схему рисовал в Eagle CAD. Насчёт прирываний посоветовал бы попробывать использовать разные библиотеки. Хотя как по мне прерывания там не особо нужны. Разве что у вас там куча других процессов илии нужно сильно экономить батарею. В таком случае я бы предложил повесить на прерывание арды таймер и опрашивать i2c необходимое количество раз в секунду. Был у меня большой сложный проект с использованием эих мс - от прерываний по изменению пришлось отказаться )) с ними всё как то ужасно косо работало.

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Icms, спасибо. Я тоже занялся Eagle CAD (7.5.0). К сожалению не нашел в библах МСР23016. 23017 есть в Адафрутовской библиотеке, но переделать ее в 016 не смог. Вероятно потому, что у меня Лайт версия. Смогли бы выручить и приложить файлик  *.lbr ??? Также, никак не могу найти там датчики Холла и обычные клемники типа DG301.

Да, наверное от Прерываний по изменению придется отказаться. Тоже читал, что работает как-то криво. (... but it doesn't work properly...)

icms
Offline
Зарегистрирован: 22.03.2011

Датчики холла ищите так *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*

 

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Супер! Спасибо, МСР23016  присобачил и скриптом и как либру. Однако хотелось бы в корпусе DIL28 round. пытаюсь присобачить новый корпус.

*hall* работает также - нашел в библе alegro.lbr     A12

MPT and Phoenix тоже нашел. Огромное спасибо.

 

Toto_G
Offline
Зарегистрирован: 20.11.2015

  Тоже заинтересовался таким вопросом. Понадобились часы с большими цифрами. LED 7-сегментники заказал, но они 2-х-дюймовые уже дорогие, поэтому вероятно матрицы 8х8 LED будут лучше.  И посчитал я сколько понадобится ног на часы ), получилось 28. А можно и побольше светодиодное табло собрать, значит ног ещё больше.

  И потому тоже заинтересовался. И вспомнил что валяется такая штуковина уже готовая

брал вместе с экранчиком 1602, не понадобилась. Вроде как эту штуку вполне можно использовать не только с lsd1602.

Дело в том, что цена 0,6$ за готовый модуль. Против полутора баксов и паять. Мини про стоит менее полутора баксов, потому не вижу резона в mcp23016.

 Да, и на этом модуле выходных ног тоже 16, не 8.

Единственно, я ещё не полностью вник в и2с и потому не совсем отчётливо представляю как всё это кодить.

EuBeginer
Offline
Зарегистрирован: 16.11.2015

МНе нужно более 20 входов! Кнопки - тумблемры. Поэтому 23016 или 23017 и поэтому I2C. Читайте выше.

Делаю Монстра!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Toto_G, ног-то 16, только часть висят в воздухе, часть питание, подсветка, контрастность. Реальных портов 8. Управлять очень легко, пример теста записи/чтения:

#include "Wire.h"
byte n=0;
void setup() {
Serial.begin(9600);
Wire.begin();

}
void loop() {
Wire.beginTransmission(0x3F);
Wire.write(n);
Wire.endTransmission();

Wire.requestFrom(0x3F,1);
Serial.println( Wire.read() ); 

delay(1000);
n=~n;
}

 

Toto_G
Offline
Зарегистрирован: 20.11.2015

ну ладно, согласен, что 8 это мало, а строить пирамиды нет особого желания.

а вариант использовать про мини за полтора бакса как расширитель?  20 пинов можно обьявить цифровыми.  2 пина оставить на обмен данными по и2с, 18 останется на входы\выходы . Или много кодить?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Toto_G, а можно взять какую нибудь дешевую мегу8535, у которой дофига портов (4x8), в ней же сделать всю черновую обработку кнопок или чего-там. Это для тех кто и с паяльником дружит :)

Focus
Offline
Зарегистрирован: 05.04.2015

Поделитесь реализацией расширителя портов на ардуине (нано, про мини) для ESP8266 по I2C :) чота яндекс не показывает ничего

T.Rook
Offline
Зарегистрирован: 05.03.2016

а точно нужна реализация на ардуине? #23 не походит?

Focus
Offline
Зарегистрирован: 05.04.2015

T.Rook пишет:
а точно нужна реализация на ардуине? #23 не походит?

Не, не подходит, это какойто псевдо-расширитель, там и на вход и на выход работает по необычному читал тут. Лучше уж тогда MCP23017. но поскольку ни того ни другого у меня нет, но есть некоторое количество про.мини и нано, наверно попробую заюзать именно их. Нашёл такой пример, но заработает оно на ESP8266 или нет...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

спаянная плата pcf8574 стоит дешевле чем отдельно микросхема))

есть конечно сложности с ней, но вместо нее разве что 74hc595 ствить. пока у меня правда стоит 595для есп8266

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не могу сказать что 95 руб/шт это дешевле чем 74, но .. Вы правы. Тоже обыскался отдельных микросхем по вменяемой цене и заказал готовые платы "на всякий случай" парочку, едут такие: https://ru.aliexpress.com/item/PCF8574T-I-O-Fr-I2C-Arduino/32672313491.html (а то тут некоторые часто вопрошают.. так вот если теперь и пишу цену, то по факту заказа :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
bwn
Offline
Зарегистрирован: 25.08.2014

Коллеги, вы чо? Чуть до обморока не довели.(((

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да, дешевле (есть такая), но как понимаю это под конкретное применение: у неё выход P3 не выходит в разъем и сидит на транзисторном ключе .. можно конечно "поправить" или тупо сдуть микросхему. Но, захотелось иметь "из каропки". :)

bwn, .. упс. А мне такие не попалиь ни разу. Хотя .. "shenzhen IC shop" с тремя звездами .. очередная реинкарнация "женьшеня" .. помню, один похожий мне уже один раз ничего не поставил..

Sergius0000
Offline
Зарегистрирован: 04.01.2019

С наступившим Новым Годом всех. Подскажите, пожалуйста, неумёхе, возможно ли (и если возможно, то как) решить следующую задачу.

Имеются ардуинка и расширитель портов MCP23017.

В соответствии с найденной мной библиотекой Adafruit_MCP23017.h (нашел еще одну, но там то же самое) обращение к портам расширителя осуществляется как mcp1.digitalWrite(pin, LOW)

Вопрос: как сделать так, чтобы обращение к пинам расширителя портов было стандартным, т.е. digitalWrite(pin, LOW)

Если это уже обсуждалось, то направьте, пожалуйста. Мне, к сожалению, ничего подобного найти не удалось.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Sergius0000 пишет:

Вопрос: как сделать так, чтобы обращение к пинам расширителя портов было стандартным, т.е. digitalWrite(pin, LOW)

Никак. Смирись.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Sergius0000 пишет:

С наступившим Новым Годом всех. Подскажите, пожалуйста, неумёхе, возможно ли (и если возможно, то как) решить следующую задачу.

Имеются ардуинка и расширитель портов MCP23017.

В соответствии с найденной мной библиотекой Adafruit_MCP23017.h (нашел еще одну, но там то же самое) обращение к портам расширителя осуществляется как mcp1.digitalWrite(pin, LOW)

Вопрос: как сделать так, чтобы обращение к пинам расширителя портов было стандартным, т.е. digitalWrite(pin, LOW)

Если это уже обсуждалось, то направьте, пожалуйста. Мне, к сожалению, ничего подобного найти не удалось.

А как Вы это себе представляете?

 

PS. Вообще-то, конечно, возможно, но - Вам явно не по силам. И, самое главное, это никому не нужно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Залезь в Адафрутовский исходник, сделай индексатор для класса, обращение будет проще, типа 

mcp1[N_BIT] = LOW/HIGH

Если то, что я написал - темный лес, значит тебе пока не под силу. тогда см. #37

Sergius0000
Offline
Зарегистрирован: 04.01.2019

DetSimen пишет:

Залезь в Адафрутовский исходник, сделай индексатор для класса, обращение будет проще, типа 

mcp1[N_BIT] = LOW/HIGH

Спасибо. Это уже несколько ближе к тому, что я хочу получить. Да, пока темный лес, но надеюсь найду тропинку из этой глуши. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А зачем вам это требуется? Прсосто из любви к порядку или есть есть какие то требования?

Можно написать оберточную функцию типа myDigitalWrite() которая в зависимости от номера порта вызывать что надо.