Arduino увеличение портов ввода. Расширение аналоговых входов в Arduino. Платы расширения для прототипирования

Как я уже , я заказал три более или менее не пересекающихся набора датчиков для Ардуино. В обоих комплектах ко мне приехала микросхема 74HC595, которая так и осталась лежать в боксе до поры до времени. До поры до времени я даже не знал, что это за микросхема, и как вообще этот черный тараканчик промаркирован.

Но настали черные дни, когда мне перестало хватать выходных сигналов Arduino Nano, когда я занимался созданием устройства для тестирования шаговых двигателей. (TODO: вставить ссылку на статью о тестере ШД, когда будет готова). Моё устройство для тестирования ШД в результате вышло довольно комплексным - двухстрочный дисплей 1602 с системой меню, управляемое полнофункциональной клавиатурой 4x4, 3 цифровых разряда для установки величины микрошага ШД, сигналы Step и Dir для шагового двигателя, и тп. Казалось бы, самое время мигрировать на другую версию Arduino. Но моя природная лень воспротивилась этой миграции. И ленивая голова стала искать решение.

Было принято решение искать решение на базе уже того, что есть. Перебирая платки и детальки из наборов, я заметил 16ти-пинового черного "жука". Сначала в одном наборе, потом в другом. Решил поинтересоваться, что же это за деталь, и зачем её добавляют в наборы. Зачем её кладут в кит-наборы, я не понял, но саму микросхему нашел на сайте NXP .

Оказалось, что это довольно интересная микросхема - сдвиговый регистр с последовательным входом и параллельным выходом.

(из даташита)

Описание выводов

Контакт Наименование Описание и подключение
10 ~MR Master Reset - сброс, активный уровень низкий. В идеальном случае неплохо бы сделать схему сброса, которая сначала подает низкий уровень на этот вход, а затем переводит его в единичное состояние. Но можно не возиться, и подключить его на +5В. В этом случае на выходе до первой записи будут случайные значения
13 ~OE Output Enable - разрешение выхода, активный уровень низкий. При подаче 0 на выходы подается содержимое регистра, при подаче 1 - выходы отключаются, переводятся в Z-состояние, что позволяет использовать одну шину попеременно разным устройствам. Подключаем на землю, если не нужно управлять состоянием выходов
14 DS Serial Data In - последовательный вход. На этот вход следует подавать значение входного сигнала до подачи тактового сигнала сдвига SHCP
11 SHCP Shift Register Input clock - тактовый вход сдвигового регистра. Для вдвигания бита в регистр следует подать переход с 0 на 1. Когда возвращать в 0 - на усмотрение. Можно - сразу же, можно - непосредственно перед вдвиганием. В первом случае можно считать, что переключение происходит по фронту прямого сигнала, во втором - по спаду инверсного. См. также ниже замечания по быстродействию. Также по приходу этого сигнала изменяется значение последовательного выхода Q7/S
12 STCP Storage Register Clock Input - тактовый вход регистра защелки. По фронту данного импульса происходит перенос значения со сдвигового регистра на параллельные выходы Q0-Q7
9 Q7S Serial Data Output - последовательный выход. На него выводится значение старшего разряда сдвигового регистра. Данный выход может использоваться для масштабирования сдвигового регистра до 16ти-разрядной, 24х-разрядной и т.д. схемы
15, 1-7 Q0, Q1-7 Выходы регистра-защелки . Сигнал на них переносится с внутреннего сдвигового регистра по приходу сигнала STCP
8 GND Питание - общий провод
16 VCC Питание - +

Питание

HC версия микросхемы требует от 2В до 6В питания, версия HCT (TTL-совместимая) - от 4.5В до 5.5В. HCT - TTL - а оно вообще еще используется? Ардуино же вроде само по себе CMOS, так что HCT не нужно, но если нужно согласовывать уровни с внешними TTL потребителями, то можно запитать HC от 3.3В, тогда уровни сигналов будут совместимы с TTL. А вообще, с 5ти-вольтовым Ардуино должны работать и HC, и HCT. В интернетах так пишут.

Что более важно, так это блокировочные конденсаторы. Без них схема может работать не так, как задумано, и более того, непредсказуемо. Теоретически, в цепи питания каждого корпуса нужно ставить 0.1мкФ конденсатор. Это значение ёмкости я вычислил как среднее по интернету. Моя схема вполне заработала и без него. Чтобы уточнить, залез было в библию схемотехника, чтобы уточнить - Хилл и Хоровиц, "Искусство схемотехники" - это почти как "Искусство Программирования" Дональда Кнутта, но только для железячников (к слову, Хилл и Хоровиц гораздо ближе к народу, Кнутт через-чур умничает) - но там блокировочными конденсаторами похоже называют развязывающие по входам конденсаторы. Жаль, хорошая книга, но очень отстала уже от жизни. У меня второе или третье русское издание конца 90ых или начала 0ых годов, оригинал скорее всего ещё лет на 10 старше. На третьем, розовом томе, обнаружил наклейку - "14руб" - как же дешево тогда всё было, по современным меркам. А прошло-то всего 15 лет или чуть больше. Аж ностальгия замучала.

Быстродействие

В титле даташита 74HC595 пишут, что она работает на 100МГц. Беглый взгляд на графики и таблицы даташита говорит, что самые большие тайминги в диапазоне температур от -40C до +85C при питании 4.5В - 10-20нс (100-50МГц). С теми частотами, на которых работают Ардуино, ничего больше знать не требуется. Возможно, только то, что стандартные библиотечные digitalRead/digitalWrite - огромнейшие тормоза из-за различных проверок, и их можно (и нужно) переписать в виде более быстрой версии. В планах есть поковырять это и написать поподробнее, но пока у меня нет особой нужды.

Быстродействие Arduino Nano и библиотеки Arduino в плане скорости переключения выходов и обработки входов по моим наблюдениям где-то посередине от единиц килогерц до десятков килогерц. Так что, на мой взгляд, при написании кода для управления сдвиговым регистром 74HC595 нет нужды озадачиваться какими-либо задержками при установке управляющих сигналов.

Другое дело, что для 8ми разрядного последовательного расширителя следует делить максимальную доступную на Ардуино частоту переключения выходов - установили DS, установили SHCP в 1, сбросили SHCP (в 0) - 8 раз, и установка/сброс STCP. Итого, на вскидку, 3*8 + 2 = 26 операций digitalWrite. Итого выходит примерно в 25 раз медленнее, чем может сама Ардуинка.

При масштабировании до 16ти, 24х или 32х выходов замедление будет соответственно примерно 3*16 + 2 = 50, 3*24 + 2 = 74 и 3*32 + 2 = 98 раз.

Для управления чем-то действительно быстрым, очевидно, такой расширитель на сдвиговом регистре 74HC595 не подходит, но, в некоторых применениях, для задания редко меняющихся статичных сигналов вполне подходит. Так, например, я использовал такой расширитель для задания 3х-разрядного режима микрошага для установки режима микрошага для драйвера ШД DRV8825 в тестере для шаговых двигателей. К слову, мне это пока не особо пригодилось - шаговики из матричных принтеров ужасно работают в микрошаговом режиме, по крайней мере, под управлением драйвера DRV8825 - так, например, в режиме микрошага 1/2 половина шага какая-то вялая и не уверенная, только вторая половина бодрая и мощная. Поэтому при использовании микрошага при малейшем усилии на ось ШД он первые пол-шаги начинал пропускать. Остальные режимы микрошага я как-то после этого и не исследовал на имеющихся принтерных ШД.

Масштабирование

Расширитель выходов Ардуино на базе 74HC595 достаточно элементарно из 8ми-разрядной версии может быть переделан в схему любой разрядности. Для этого последовательный выход младшего регистра Q7S нужно соединить со входом DS более старшего, а линии SHCP и STCP соединить параллельно. Ну, и, в зависимости от принятого схемотехнического и программного решения, нужно выбрать, как подключать линии ~MR и ~OE.

Расширение ввода

Расширение линий ввода для Ардуино в принципе похоже на расширение вывода, с учетом того, что нужно не задавать значение DS на выходе, а считывать его на входе, и использовать микросхему типа 74HC597. Впрочем, это я пока на практике не проверял.

Мультиплексирование

Увеличить количество выходных линий, которыми управляет Ардуина, можно двумя способами: 1) увеличить разрядность одного последовательного выхода, что при увеличении разрядности в два, три или четыре раза соответственно уменьшает в два, три или четыре раза быстродействие расширителя; 2) параллельным подключением нескольких расширителей, при этом задействуя один дополнительный выход на каждый расширитель, что может сохранить быстродействие на приемлемом уровне, но требует использования как минимум одного выхода Ардуино для каждого расширителя.

Если не управлять прямо сигналами регистра 74HC595 - ~MR, ~OE с Ардуино, то достаточно только трех выходов Ардуино для управления сигналами DS, SHCP и STCP сдвигового регистра, чтобы при помощи микросхемы 74HC595 превратить их в 8 или 16 или больше выходных сигналов.

Для мультиплексирования нескольких расширителей на базе 74HC595 можно пойти двумя путями: 1) для каждого расширителя сигнала выделить отдельный latch сигнал - т.е. все регистры на шине параллельно сдвигают поступающие данные, и, соответственно, сдвигают значения на выходах внутреннего сдвигового регистра, но только один передает значение из внутреннего сдвигового регистра на выходы микросхемы; 2) сигналы сдвига передаются только на один из расширителей, а перенос значений сигналов на выход происходит одновременно для всех модулей расширения.

Я больше склонен использовать вариант, когда во внутренних сдвиговых регистрах может находится всё, что угодно (вариант 1), а на выходе зафиксировано какое-то из предыдущих значений, и вот почему: при переносе значений из внутреннего сдвигового регистра на выход могут происходить неконтролируемые переходы из 0 в 1 и обратно, какой-то дребезг сигнала, даже если исходное значение во внутреннем регистре и на выходе одно и то же. И, на мой взгляд, операцию переноса состояния внутреннего регистра сдвига на выходы 74HC595 следует использовать как можно реже.

Программная поддержка

Программная поддержка этого и подобных расширений заключается в том, чтобы не обращаться к устройствам напрямую через конкретные пины при помощи digitalRead/digitalWrite используемого контроллера Ардуино, а через пины абстрактного устройства ввода-вывода, которое, в свою очередь, может быть инициализировано как привязанное к конкретному типу Ардуино, так и к другому аналогичному абстрактному устройству.

Одним из ключевых преимуществ платформы Arduino является популярность. Популярную платформу активно поддерживают производители электронных устройств, выпускающие специальные версии различных плат, расширяющих базовую функциональность контроллера. Такие платы, совершенно логично называемые платами расширения (другое название: arduino shield, шилд), служат для выполнения самых разнообразных задач и могут существенно упростить жизнь ардуинщика. В этой статье мы узнаем, что такое плата расширения Arduino и как ее можно использовать для работы с разнообразными устройствами Arduino: двигателями (шилды драйверов двигателей), LCD-экранами (шилды LCD), SD-картами (data logger), датчиками (sensor shield) и множеством других.

Давайте сперва разберемся в терминах. Плата расширения Ардуино – это законченное устройство, предназначенное для выполнения определенных функций и подключаемое к основному контроллеру с помощью стандартных разъемов. Другое популярное название платы расширения – англоязычное Arduino shield или просто шилд. На плате расширения установлены все необходимые электронные компоненты, а взаимодействие с микроконтроллером и другими элементами основной платы происходят через стандартные пины ардуино. Чаще всего питание на шилд тоже подается с основной платы arduino, хотя во многих случаях есть возможность запитки с других источников. В любом шилде остаются несколько свободных пинов, которые вы можете использовать по своему усмотрению, подключив к ним любые другие компоненты.

Англоязычное слово Shield переводится как щит, экран, ширма. В нашем контексте его следует понимать как нечто, покрывающее плату контроллера, создающего дополнительный слой устройства, ширму, за которой скрываются различные элементы.

Зачем нужны шилды arduino?

Все очень просто: 1) для того, чтобы мы экономили время, и 2) кто-то смог заработать на этом. Зачем тратить время, проектируя, размещая, припаивая и отлаживая то, что можно взять уже в собранном варианте, сразу начав использовать? Хорошо продуманные и собранные на качественном оборудовании платы расширения, как правило, более надежны и занимают меньше места в конечном устройстве. Это не значит, что нужно полностью отказываться от самостоятельной сборки и не нужно разбираться в принципе действия тех или иных элементов. Ведь настоящий инженер всегда старается понять, как работает то, что он использует. Но мы сможем делать более сложные устройства, если не будем каждый раз изобретать велосипед, а сосредоточим свое внимание на том, что до нас еще мало кто решал.

Естественно, за возможности приходится платить. Практически всегда стоимость конечного шилда будет выше цены отдельных комплектующих, всегда можно сделать аналогичный вариант подешевле. Но тут уже решать вам, насколько критично для вас потраченные время или деньги. С учетом посильной помощи китайской промышленности, стоимость плат постоянно снижается, поэтому чаще всего выбор делается в пользу использования готовых устройств.

Наиболее популярным примерами шилдов являются платы расширения для работы с датчиками, двигателями, LCD-экранами, SD-картами, сетевые и GPS-шилды, шилды со встроенными реле для подключения к нагрузке.

Подключение Arduino Shields

Для подключения шилда нужно просто аккуратно «надеть» его на основную плату. Обычно контакты шилда типа гребенки (папа) легко вставляются в разъемы платы ардуино. В некоторых случаях требуется аккуратно подправить штырки, если сама плата спаяна неаккуратно. Тут главное действовать аккуратно и не прилагаться излишней силы.

Как правило, шилд предназначен для вполне конкретной версии контроллера, хотя, например, многие шилды для Arduino Uno вполне нормально работают с платами Arduino Mega. Распиновка контактов на меге выполнена так, что первые 14 цифровых контактов и контакты с противоположной стороны платы совпадают с расположением контактов на UNO, поэтому в нее легко становится шилд от ардуино.

Программирование Arduino Shield

Программирование схемы с платой расширения не отличается от обычного программирования ардуино, ведь с точки зрения контроллера мы просто подключили наши устрйоства к его обычным пинам. В скетче нужно указывать те пины, которые соединены в шилде с соответствующими контактами на плате. Как правило, производитель указывает соответствие пинов на самом шилде или в отдельной инструкции по подключению. Если вы скачаете скетчи, рекомендованные самим производителем платы, то даже это делать не понадобится.

Чтение или запись сигналов шилдов производится тоже обычным методом: с помощью функций , и других, привычных любому ардуинщику команд. В некоторых случаях возможны коллизии, когда вы привыкли к оной схеме соединения, а производитель выбрал другую (например, вы подтягивали кнопку к земле, а на шилде – к питанию). Тут нужно быть просто внимательным.

Как правило, эта плата расширения идет в наборах ардуино и поэтому именно с ней ардуинщики встречаются чаще всего. Шилд достаточно прост – его основная задача предоставить более удобные варианты подключения к плате Arduino. Это осуществляется за счет дополнительных разъемов питания и земли, выведенных на плату к каждому из аналоговых и цифровых пинов. Также на плате можно найти разъемы для подключения внешнего источника питания (для переключения нужно установить перемычки), светодиод и кнопка перезапуска. Варианты шилда и примеры использования можно найти на иллюстрациях.




Существует несколько версий сенсорной платы расширения. Все они отличаются количеством и видом разъемов. Наиболее популярными сегодня являются версии Sensor Shield v4 и v5.

Данный шилд ардуино очень важен в робототехнических проектах, т.к. позволяет подключать к плате Arduino сразу обычный и серво двигатели. Основная задача шилда – обеспечить управление устройствами потребляющими достаточно высокий для обычной платы ардуино ток. Дополнительным возможностями платы является функция управления мощностью мотора (с помощью ШИМ) и изменения направления вращения. Существует множество разновидностей плат motor shield. Общим для всех них является наличие в схеме мощного транзистора, через который подключается внешняя нагрузка, теплоотводящих элементов (как правило, радиатора), схемы для подключения внешнего питания, разъемов для подключения двигателей и пины для подключения к ардуино.



Организация работы с сетью – одна из самых важных задач в современных проектах. Для подключения к локальной сети через Ethernet существует соответствующая плата расширения.




Платы расширения для прототипирования

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





Arduino LCD shield и tft shield

Данный тип шилдов используется для работы с LCD-экранами в ардуино. Как известно, подключение даже самого простого 2-строчного текстового экрана далеко не тривиальная задача: требуется правильно подключить сразу 6 контактов экрана, не считая питания. Гораздо проще вставить готовый модуль в плату ардуино и просто загрузить соответствующий скетч. В популярном LCD Keypad Shield на плату сразу заведены от 4 до 8 кнопок, что позволяет срзау организовать и внешний интерфейс для пользователя устройства. TFT Shield также помогает



Arduino Data Logger Shield

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




Краткое резюме

В этой статье мы с вами рассмотрели только небольшую часть огромного ассортимента всевозможных устройств, расширяющих функциональность ардуино. Платы расширения позволяют сосредоточиться на самом главном – логике вашей программы. Создатели шилдов предусмотрели правильный и надежный монтаж, необходимый режим питания. Все, что вам остается, это найти нужную плату, используя заветное английское слово shield, подключить ее к ардуино и загрузить скетч. Обычно любое программирование шилда заключается в выполнении простых действий по переименованию внутренних переменных уже готовой программы. В итоге мы получаем удобство в использовании и подключении, а также быстроту сборки готовых устройств или прототипов.

Минусом использования плат расширения можно назвать их стоимость и возможный потери эффективности из-за универсальности шилдов, лежащей в их природе. Для вашей узкой задачи или конечного устройства все функции шилда могут быть не нужны. В таком случае стоит использовать шилд только на этапе макетирования и тестирования, а при создании финального варианта своего устройства задуматься о замене конструкцией с собственной схемой и типом компоновки. Решать вам, все возможности для правильного выбора у вас есть.

→ Как расширить количество аналоговых входов и выходов на вашем Arduino?

Как расширить количество аналоговых входов и выходов на вашем Arduino?

Мультиплексор или демультиплексор позволит вам расширить количество входов и выходов на вашем Arduino.
Микросхема 4051 является 8-канальным аналоговым мультиплексор / демультиплексором, таким образом:
* Если вы используете 4051 как мультиплексор: Вы можете выбрать любой из 8 различных входов и прочитать его состояние в контролер.
* Если вы используете 4051 как демультиплексор вы можете выбрать любой из 8 различных выходов и записать туда нужное вам значение.

Кроме того, 4051 может работать с аналоговыми значения, в вашем Arduino, вы можете использовать аналоговые сигналы с напряжением 0-5В и подключить микросхему к аналоговым входам на Arduino.

Чтобы выбрать нужный вход микросхемы а также режимы работы чтение или запись, мы должны использовать три управляющих сигнала (S0 , S1 и S2). Каждый из этих контактов должен быть подключён к одному из цифровых выходов Arduino. Каждый выход имеет номер (S0 = 1; S1 = 2; S2 = 4) и, если установить на одном из этих выходов высокий логический уровень то, число контактных представляет будет передано 4051.

Например:
* Если на входах микросхемы S0 и S1 установить лог“1» а на S2 лог“0» то выбран вход y3 микросхемы, это выглядит так (1 +2 +0 = 3).
* Если на входах микросхемы S0 и S2 установить лог“1» а на S1 лог“0» то выбран вход y5 микросхемы, это выглядит так (1 +0 +4 = 5).

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

* Z ----- общий сигнал ввода или вывода (соединенный с входом/выходом Arduino)
* E ----- вход разрешения (активный лог «0 ») (подключен к земле (GND ))
* Vee --- отрицательное напряжение питания (подключен к земле (GND ))
* GND --- общий минус (0 V)
* S0-S2 - выбор входов (подключены к трем цифровым выводам Arduino)
* y0-Y7 - независимые входы/выходы
* Vcc --- положительное напряжение питания (5 В)



Левое изображение выше, например, как использовать 9 мультиплексор читать 64 аналоговых входов только с одним аналоговым входом Arduino.
Правое изображение выше пример того, как использовать два 4051 (один настроенный как демультиплексор и одного в качестве мультиплексора) в матрице 8x8 для проверки 64 кнопок или других цифровых входов только с одного цифрового входа на Arduino (со второй установки вы может просто две кнопки в то же время, в противном случае вы должны использовать первый (слева) установки).

Пример кода:

// Пример для использования 4051 аналоговый мультиплексор / демультиплексор
// by david c.

int led = 13 ; // Настраиваем на 13 ноге светодиод
int r0 = 0 ; // значение выбрать вывод на 4051 (S0 )
int r1 = 0 ; // значение выбрать вывод на 4051 (S1 )
int r2 = 0 ; // значение выбрать вывод на 4051 (S2 )
int row = 0 ; // storeing the bin code
int count = 0 ; // щётчик
int bin = { 000, 1, 10, 11, 100, 101, 110, 111 } ; // Массив двоичных числ определяющих номер выбранного входа/выхода микросхемы 4051, с 1 по 8.
void setup () { // ИНИЦИАЛИЗАЦИЯ
pinMode (2 , OUTPUT) ; // s0 выход
pinMode (3 , OUTPUT) ; // s1 выход
pinMode (4 , OUTPUT) ; // s2 выход
digitalWrite (led , HIGH) ; //зажечь светодиод
beginSerial (9600 ) ; // скорость обмена по UART
}

void loop () {
for (count = 0 ; count ≤ 7 ; count ++) { // цикл перебора элементов массива с 1 по 8
row = bin [ count ] ;
r0 = row & 0x01 ;
r1 = (row >> 1) & 0x01 ; //
r2 = (row >> 2) & 0x01 ; //
digitalWrite (2 , r0) ;
digitalWrite (3 , r1) ;
digitalWrite (4 , r2) ;
Serial.println (bin );
delay (1000 ) ;

Описание Expander Shield

Expander Shield – оригинальный дополнительный модуль, предназначенный для увеличения количества портов ввода/вывода микроконтроллеров на базе платформы Arduino, а также других микроконтроллеров, используя расширители портов с SPI или I2C интерфейсом.


Основным элементами дополнительного модуля Expander Shield являются две микросхемы MCP23S17 или MCP23017 (два 16-разрядных расширителя портов ввода/вывода с SPI или I2C интерфейсом, соответственно), позволяющие добавить четыре 8-битных порта ввода/вывода, то есть 32 дополнительных "ноги".

Комплектация

Модуль Expander Shield поставляется либо в собраном виде в варианте для шин SPI или I2C (с соответствующими микросхемами), либо в виде набора для сборки без микросхем, которые могут быть приобретены отдельно.

На выводы модуля могут быть одеты транспортировочные фиксаторы, которые необходимо снять перед началом работы.

Expander Shield SPI 1100 р. 850 р. В корзину

форме заказа .

ExpanderShield на шину SPI (с микросхемами MCP23S17).

Expander Shield I2C 1100 р. 850 р. В корзину

Внимание! У Вас отключено выполнение JavaScript. Нормальная работа системы заказа и корзины невозможна. Если по каким-то причинам Вы не можете включить JavaScript, просто перечислите заказываемые товары в форме заказа .

ExpanderShield на шину I2C (с микросхемами MCP23017).

Технические характеристики

Приведем наиболее важные функциональные особенности модуля Expander Shield.

  • удобный переключатель режима работы модуля в зависимости от типа установленных в данный момент микросхем расширителей портов;
  • для каждой из двух применяемых микросхем 16-разрядных расширителей портов ввода/вывода с помощью перемычек задается трехбитный адрес на шине, что позволяет размещать на одной шине до 8 таких микросхем;
  • возможность выбора с помощью перемычки номера соответствующего выхода микроконтроллера Freeduino/Arduino (digital pin 8, 9 или 10) для сигнала CS шины SPI;
  • в модуле применены "проходные" разъемы, позволяющие состыковывать несколько модулей без сдвига относительно платы Arduino;
  • сигналы микросхем выведены на четыре разъема PBD-10R с дополнительными контактами "земля" и +5В;
  • возможность выбора отдельного или совместного аппаратного сброса (кнопкой RESET) микросхем 16-разрядных расширителей портов ввода/вывода и микроконтроллера Freeduino/Arduino с помощью перемычек;
  • дополнительный разъем JPIC с выводами прерываний (INTA, INTB), аппаратного сброса (RST) и выбора микросхемы (CS);

Прочие характеристики модуля определяются в первую очередь характеристиками микросхем MCP23S17/MCP23017, техническое описание которых доступно в документации производителя.

Кроме того, перед началом работы с дополнительным модулем Expander Shield рекомендуем ознакомиться с его принципиальной электрической схемой.

Режимы работы

Режим работы Expander Shield выбирается с помощью DIP-переключателя и перемычек.

Выбор интерфейса и управление подтяжкой шины I2C

С помощью DIP переключателя выбирается либо режим SPI (включением контактной группы 1-4) для микросхем MCP23S17, либо режим I2C (включением контактной группы 5-6) для микросхем MCP23017. Также, в режиме I2C с помощью 7 и 8 контактной группы при необходимости шина I2C подтягивается через токоограничивающие сопротивления к шине питания +5В. Как правило, подтягивающие резисторы должны быть подключены если на шине I2C только одно устройство. Если устройств несколько, то резисторы подключаются только у одного из устройств.

Одновременное включение шины SPI и I2C, а также шины SPI и 7, 8 контактной группы не допускается .

Комбинированный режим работы, когда одна из двух микросхем в одном модуле Expander Shield работает по SPI интерфейсу (MCP23S17), а другая по I2C интерфейсу (MCP23017) невозможен.

Если требуется организовать работу одновременно по SPI и I2C интерфейсу необходимо использовать два (несколько) дополнительных модулей Expander Shield, с соотвтетствующим положением переключателей.

Выбор номера вывода для управления сигналом CS шины SPI

Для шины SPI необходимо выбрать вывод микроконтроллера Freeduino/Arduino, используемый в качестве сигнала CS. Обычно используется вывод 10, что соответствует крайнему левому положению перемычки на разъеме SS1. Переставляя перемычку на одно из двух других положений, возможен выбор 9 и 8 вывода соответственно.

Выбор адреса микросхем на шине

Младшие три бита адреса микросхем MCP23S17/MCP23017 выбираются с помощью перемычек на разъемах IC1_addr/IC2_addr притягиванием битов 0, 1, 2 к "земле" (Gnd) или +5В (5V).

Адрес каждой микросхемы должен быть уникальным.

Таким образом, на одной шине можно разместить до 8 микросхем (объединив, например, 4 штуки Expander Shield).

Выбор режима работы аппаратного сброса (кнопкой RESET)

Возможна организация одного из ряда режимов работы кнопки RESET

  • Кнопка RESET сбрасывает Freeduino/Arduino и микросхемы MCP23S17/MCP23017
  • Кнопка RESET сбрасывает только Freeduino/Arduino
  • Кнопка RESET сбрасывает только микросхемы MCP23S17/MCP23017

Соответствующие положения перемычек на разъеме JRS (слева направо) показаны ниже.

Библиотека MCP23xxx

Для упрощения работы с этим, и рядом других модулей, разработана библиотека MCP23xxx, предоставляющая простой интерфейс к функционалу микросхем серии MCP23xxx. Библиотека доступна для свободного скачивания: Библиотека совместима с ПО Arduino версии 1.0.5 (также предполагается совместимость и с более поздними версиями).

Фактически, это набор из двух библиотек: MCP23xxx и LiquidCrystal_MCP23x17.

Более подробно установка библиотек описана в разделе подключение библиотек . Структура каталогов папки libraries после установки должна стать такой:

/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx

В библиотеке MCP23xxx реализованы шаблоны классов, организующие работу с расширителями портов MCP23017, MCP23S17, MCP23008 и MCP23S08. Библиотека LiquidCrystal_MCP23x17 - это модифицированная стандартная библиотека LiquidCrystal, поддерживающая русский язык, и работающая через расширитель портов.

К библиотеке прилагаются примеры, поясняющие работу с ней. Также доступна для скачивания предыдущая версия библиотеки:

Рассмотрим пример работы с модулем для шины I2C:

//В примере считывается состояние выводов 1-го чипа, и такие же значения выставляются на 2-м

//Для I2C версии подключаем Wire.h:
#include
//подключаем библиотеку
#include

//Создаем два объекта класса CMCP23017, но не инициализируем, т.к. шина I2C не готова
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

void setup()
{
//Инициализируем шину I2C ...
Wire.begin () ;
//... и объекты MCP23* с адресами 0 и 1
mcp23_1.init (0 ) ;
mcp23_2.init (1 ) ;

//Все выводы 1-го чипа нужно сделать входами, а 2-го - выходами
//Это можно сделать в цикле
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_1.pinMode (i, INPUT) ;
mcp23_2.pinMode (i, OUTPUT) ;
}
//или за один раз, вызовом метод pinMode16
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

void loop()
{
//Прочесть все входы 1-го чипа, и выставить то же самое на 2-м можно в цикле
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_2.digitalWrite (i, mcp23_1.digitalRead (i) ) ;
}
//или за раз, используя методы digitalRead16 и digitalWrite16
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

Loading...Loading...