MCP23017 Управление общими командами
- Войдите на сайт для отправки комментариев
Использую Ардуино Нано в паре с расширителем портов MCP23017. С управлением пинами расширителя через класс проблем нет, там всё понятно, но это несколько неудобно для моих задач. Наткнулся на одном сайте (не знаю, как здесь относятся к ссылкам на сторонние ресурсы) на библиотеку со скетчем идея которого меня полностью устраивает.
Вся загвоздка в том, что это создано для PCA9534D. Я попробовал "поморгать" первой тысячей портов на 23017 с помощью этого скетча, но фокус не удался.
Может кто-нибудь знает аналогичную библиотеку для MCP23017? Я попытался вникнуть в суть самой библиотеки, но понял, что это совсем не мой уровень. Или все же эта библиотека подходит и для 23017, но я чего-то напортачил?
#include <iarduino_I2C_IO_Global.h> // Подключаем библиотеку, разрешая использовать обычные функции для управления выводами модуля // При этом, адрес 1 модуля должен быть 0x20, следующего 0x21 и т.д. // Тогда выводы 0-7 принадлежат 1 модулю, 8-15 второму и т.д. // Номера выводов Arduino указываются типом uint8_t, а модулей uint16_t. void setup() { iarduino_I2C_IO_Global.begin(); // Инициируем раборту с модулями расширения выводов pinMode(uint8_t(3), OUTPUT); // Конфигурируем 3 вывод Arduino как выход pinMode(uint8_t(7), INPUT ); // Конфигурируем 7 вывод Arduino как вход pinMode(uint16_t(3), OUTPUT); // Конфигурируем 3 вывод модуля как выход pinMode(uint16_t(7), INPUT ); // Конфигурируем 7 вывод модуля как вход } void loop(){ digitalWrite(uint8_t(3), HIGH); // Устанавливаем на 3 выводе arduino, состояние логической 1 digitalWrite(uint16_t(3), LOW); // Устанавливаем на 3 выводе модуля , состояние логического 0 int a = digitalRead(uint8_t(7)); // читаем состояние 7 вывода Arduino в переменную a int b = digitalRead(uint16_t(7)); // читаем состояние 7 вывода модуля в переменную b }
Еще я там наткнулся на таблицу номеров выходов модулей в зависимости от адреса. На 23017 подобного мне найти не удалось:
Номера выводов, указываемые в стандартных функциях, зависят от адреса модуля на шине I2C:
Адрес модуля: | 0x20 | 0x21 | 0x22 | 0x23 | 0x24 | 0x25 | 0x26 | 0x27 |
---|---|---|---|---|---|---|---|---|
Вход/Выход № 0 | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 |
Вход/Выход № 1 | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 |
Вход/Выход № 2 | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 |
Вход/Выход № 3 | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 |
Вход/Выход № 4 | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 |
Вход/Выход № 5 | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 |
Вход/Выход № 6 | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 |
Вход/Выход № 7 | 7 | 15 | 23 | 31 | 39 | 47 | 55 | 63 |
Ссылка на библиотеку https://iarduino.ru/file/285.html
я бы советовал вам с осторожностью относится к библиотекам с сайта iarduino - эту конкретно не знаю. но на многие другие отзывы не очень
Что касается идеи работы с экспандером через переопределение функции digitalWrite() - в этом ничего нового нет. Если в библиотеке нет поддержки какого-то конкретного экспандера - ее наверняка можно дописать по аналогии
Насчет "тысячи" выводов не понял - вы что там курите то? :)
По поводу тысячи портов. Я не нашел таблицы выводов для 23017, поэтому при помощи простого цикла менял состояние тысячи портов, это был эксперимент, который не дал положительных результатов. Старался описать всё максимально понятно, но видать не преуспел в этом.
Я не вижу смысла публикации своего скетча в виду отсутствия в нем принципиальных отличий в управлении выводами, за исключением того, что я через цикл перебираю значительно большее количество портов.
Вопрос по прежнему актуален.
По поводу тысячи портов. Я не нашел таблицы выводов для 23017, поэтому при помощи простого цикла менял состояние тысячи портов,
Так и не увидел ответа, откуда в 23017 "тысяча портов". Судя по даташиту - их там всего два. Вам не приходит в голову. что если отправить что-то на заведомо неправильный адрес (например на сотый порт микросхемы, у которой их два) - оно заведомо не дойдет? :)
Вопрос по прежнему актуален.
раз не видите смысла - не понятно, зачем вообще начали эту дискуссию. Без конкретного рассмотрения кода это просто бессмысленное сотрясение воздуха. Теоретически я вам уже ответил - добавьте в библиотеку поддержку 23017. Если не можете сами - закажите это более умелому программисту
Создаешь нужное количество объектов, каждый со своим адресом. Собираешь из них массив.
Пишешь функцию трассировки.
Сложностей возникнуть не должно.
Мне кажется, что ответ находится в даташите на MCP23017. Если Вы не нашли библиотеку (или не искали?), то ее не существует. Пишите ручками. Кстати - можно не библиотеку, а подпрограмму.
Гля, ну что за народ - на все им библиотеки давай... А как мы, старперы, без них писали? Да еще на ассемблере?
А хрен вас старпёров знает!
Логично, Евгений. Но это не отменяет того, что адепты должны учится
Вопрос по MCP23017-E/SP.
Использую с WT32-ETH01. Arduino IDE. Библиотека DFRobot_MCP23017.h. Суть вопроса в помехоустойчивости. Когда дотрагиваюсь до шины I2C, или когда есть помехи, например блок питания рядом в сеть вставляю, который даже не питает схему, а питает что-то отдельное, то MCP23017 реагирует как сработка пинов. Все пины сконфигурированы как вход, все подтянуты резисторами 3,3кОм к GND. Если входа трогаю - никакой реакции. Если докоснуться до шины I2C - то начинает сыпаться мусор типа входы хаотично срабатывают.
MCP23017-E/SP - это голая микросхема. I2C полтянута к Vcc редисторами 4,7 кОм. Но это роли не играет. Также подключил в шину ещё 2 устройства - INA226 и PCF8575. И как бы я над шиной не издевался, ни одно устройство не мусорит данными и не имеет сбоев, а MCP23017 говорит, что сработали входы. Собирал и на макетке, и потом спаял модуль, три микрухи - все одинаково работают. Одна с Алика, две из чип и дип.
Что с ними не так? Почему помехи по шине интерпретируются как полезный сигнал? Такое происходит, даже если вообще отключить микруху. Просто скетч прошит, к I2C ничего не подключаем, трогаем её и происходит сработка входов отключенной микросхемы.
Такое происходит, даже если вообще отключить микруху. Просто скетч прошит, к I2C ничего не подключаем, трогаем её и происходит сработка входов отключенной микросхемы.
То есть , исходя из этого проблема не в микросхеме , а в коде. Библиотеку поменяй , попробуй без библиотеки.