16 портовый 12 битный расширитель портов ардуино. Как расширить количество аналоговых входов и выходов на вашем Arduino? Зачем нужны шилды arduino

Одним из ключевых преимуществ платформы 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.

Обычно выводы микроконтроллера реализуют несколько различных функций, поэтому расширители бывают разные:

  1. Расширитель стандартных портов ввода-вывода GPIO
  2. Расширитель выходов ШИМ
  3. Расширители аналоговых входов – мультиплексоры и внешние АЦП

Отдельно стоит упомянуть цифро-аналоговые преобразователи (ЦАП) и расширители адресного пространства шины I2C. Эти устройства не дублируют функции портов напрямую, но расширяют возможности микроконтроллеров.

В первой статье цикла мы поговорим о самых простых и полезных экспандерах, которые работают в качестве цифровых портов ввода-вывода. Это микросхемы и . Они устроены и работают абсолютно идентично, и различаются только количеством портов.

Выбираем модуль расширителя для Arduino

Самый популярный и недорогой модуль изготовлен на микросхеме PCF8574 (рис. 1)

Рис. 1. Популярный модуль расширителя портов PCF8574

Достоинства:
  • Низкая цена.
  • Модули можно соединять цепочкой, просто вставляя штекеры одного модуля в гнезда предыдущего. Не забудьте установить перемычками разные адреса модулей!
Недостатки:
  • Нельзя вставить прямо в макетную плату (рекомендую перепаять разъем портов на обратную сторону).
  • Всего восемь портов в одном модуле.

Если вы настроены на более серьезные проекты, закажите на Aliexpress 16-разрядный модуль на PCF8575 . Настоятельно рекомендую именно модуль, изображенный на рис. 2.

Рис. 2. Модуль расширителя портов PCF8575

Достоинства:
  • Вдвое больше портов.
  • Встроенный источник питания на 3.3 вольта, можно питать другие модули.
  • Встроенное согласование логических уровней для шины I2C при разном напряжении питания.
  • Удобный формат для макетной платы.
Недостатки:
  • Выше цена.

Принцип работы расширителя портов GPIO PCF8574/PCF8575

Обмен данными происходит по шине I2C. Для подключения к плате Arduino требуется лишь четыре провода, включая питание. Адрес расширителя задается тремя перемычками на входах A0…A2, поэтому к шине можно одновременно подключить восемь одинаковых микросхем и получить максимум 8*8=64 дополнительных порта с PCF8574 или 8*16=128 с микросхемой PCF8575.

Чтобы вывести данные в порт, записывают байт данных по адресу модуля на шине I2C. Чтобы прочитать данные с порта, читают байт по этому же адресу. Байт всегда пишется и читается целиком, работа с отдельными разрядами происходит программно.

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

Порты работают по схеме, аналогичной открытому коллектору и оснащены внутренними подтягивающими резисторами. Если в выход записан логический ноль, то открывается выходной транзистор, который принудительно тянет вывод «на землю». Чтение из такого порта всегда будет возвращать ноль.

Будьте осторожны – при подаче прямого напряжения питания на вывод с низким уровнем или при превышении допустимого тока 50 мА вы испортите микросхему!

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

Чтобы одновременно использовать часть портов как входы, а часть как выходы, перед каждой записью байта данных в экспандер необходимо при помощи операции «логическое ИЛИ» накладывать маску из единиц на те разряды, которые соответствуют входам. Вот и все)))

Генерация прерывания

Расширители портов PCF857* генерируют импульс прерывания низкого уровня на выходе INT при любом изменении входного сигнала на любом входе микросхемы. Это удобно, если расширитель обслуживает кнопочную панель. Но вы должны сами определить в обработчике прерывания, какая кнопка была нажата или отпущена. Генератор прерывания оснащен фильтром подавления дребезга контактов.

Пример 1. Использование модуля PCF8574

Соберем простую схему из четырех светодиодов, модуля PCF8574 и платы Arduino (рис. 3 и 4). При такой схеме включения нам даже не требуются гасящие резисторы для светодиодов. Ток протекает через светодиод и встроенный резистор, подключенный к шине питания.

Рис. 3. Схема подключения модуля PCF8574

Рис. 4. Макет схемы с модулем PCF8574

Скопируйте и запишите в плату Arduino скетч 1:

// Адрес модуля на шине (A0, A1, A2 = 0) int address = 0x38; // Данные, прочитанные из модуля uint8_t dataReceive; // Данные для записи в модуль uint8_t dataSend; void setup() { Wire.begin(); Serial.begin(9600); // Высокий уровень во все порты PCF8574 dataSend = B11111111; pcf8574_write(dataSend); } void loop() { // Читаем байт из модуля dataReceive = pcf8574_read(); // Выводим в монитор в двоичном формате Serial.println(dataReceive, BIN); // Сдвигаем биты влево на полубайт dataSend = dataReceive << 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

Во все порты микросхемы изначально записывается высокий уровень, поэтому порты P0…P3 могут работать, как входы.

Уровни на выводах порта считываются каждые 500 мс и результат считывания выводится в монитор. Если вы соединяете один из входов P0…P3 с общим проводом, в его разряде появляется ноль. Затем считанное значение сдвигается влево на четыре бита, результат выводится в порт и гаснет один из светодиодов. Например, если прочитан ноль на выводе P0, то погаснет светодиод, подключенный к выводу P4.

Обратите внимание, что мы должны перед каждой записью в расширитель наложить битовую маску из единиц на все разряды, которые должны быть входами: dataSend |= B00001111;

Подпрограммы работы с шиной I2C предельно упрощены, никакие ошибки не обрабатываются.

Совет: для поиска и проверки адреса модуля на шине I2C можно использовать . Он выводит в терминал адреса всех устройств, которые отвечают на запрос шины.

Пример 2. Использование модуля PCF8575

Особенность модуля PCF8575 состоит в том, что у него 16 портов, поэтому в него всегда записывают по два байта и читают по два байта . Это правило надо соблюдать, даже если второй байт не нужен.

Немного изменим схему. Светодиоды подключим к портам P10…P13, а соединять перемычкой с общим проводом будем порты P00…P03 (рис. 5 и 6).

Рис. 5. Схема подключения модуля PCF8575

Рис. 6. Макет схемы с модулем PCF8575

В скетче 2 сначала записываются единицы во все порты, затем каждые 500 мс читается их состояние. Процедура чтения возвращает 16-разрядное слово, которое разделяется на байты. Содержимое младшего байта (выводы P00…P07) копируется в старший байт и выгружается обратно в модуль. Если соединить с общим проводом один из выводов P00…P03, то погаснет один из светодиодов, подключенных к P10…P13.

// Библиотека для работы с I2C #include // Адрес модуля на шине по умолчанию int address = 0x20; // Данные, прочитанные из модуля uint8_t hi, lo; uint16_t dataReceive; uint8_t dataHighByte; // Старший байт (P10...P17) uint8_t dataLowByte; // Младший байт (P00...P07) void setup() { Wire.begin(); Serial.begin(9600); // Высокий уровень во все порты PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_write(dataLowByte, dataHighByte); } void loop() { // Читаем байт из модуля dataReceive = pcf8575_read(); // Выводим в монитор в двоичном формате Serial.println(dataReceive, BIN); // Выделяем младший байт из длинного слова dataLowByte = lowByte(dataReceive); // Копируем младший байт в старший байт dataHighByte = dataLowByte; // Накладываем маску на младший байт dataLowByte |= B11111111; // Записываем новые данные в модуль, два байта pcf8575_write(dataLowByte, dataHighByte); delay(500); } // Процедура записи байта в модуль void pcf8575_write(uint8_t dtl, int8_t dth) { Wire.beginTransmission(address); Wire.write(dtl); // Записываем младший байт (P00...P07) Wire.write(dth); // Записываем старший байт (P10...P17) Wire.endTransmission(); } // Процедура чтения байта из модуля int16_t pcf8575_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 2); lo = Wire.read(); // Читаем младший байт (P00...P07) hi = Wire.read(); // Читаем старший байт (P10...P17) return (word(hi, lo)); // Возвращаем длинное слово }

Библиотека Arduino для PCF8574/PCF8575

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

Тринадцать цифровых линий и шесть аналоговых входов – это все, что может предложить Arduino в качестве средств ввода/вывода. Но в некоторых случаях (особенно в проектах с большим количеством периферийных устройств) такого набора линий портов недостаточно.



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


Возможно, вы знаете, что 6 аналоговых контактов также могут использоваться как цифровые линии ввода/вывода таким образом:


Аналоговый вход 0 = линия 14
Аналоговый вход 1 = линия 15
Аналоговый вход 2 = линия 16
Аналоговый вход 3 = линия 17
Аналоговый вход 4 = линия 18
Аналоговый вход 5 = линия 19

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


Технически мы можем использовать линии последовательного порта TX/RX. Но в некоторых случаях это сделать крайне затруднительно, особенно когда в коде используются функции типа Serial.begin(), нужные для работы последовательного порта. Таким образом, общее количество контактов, доступных для пользователя, все же будет 17. Но разве можно с семнадцатью выводами управлять большим количеством светодиодов или сервомоторов? В этом случае лучше воспользоваться специальными внешними микросхемами. Зачастую в этих целях используют сдвиговый регистр вроде 74HC595. Но он требует три дополнительных линии для управления и не позволяет одновременно «расширить» все линии. Дисплейные драйверы, такие как MAX7219 тоже фактически «расширяют» количество контактов. Но MAX7219 является дорогостоящей микросхемой. Поэтому дешевле и рациональнее взять микросхему расширителя портов MCP23017. Эта микросхема рассчитана на 16 линий, имеет широкий диапазон рабочего напряжения от 1.8 до 5.5 В и управляется по интерфейсу I2C.


MCP23017 будет использовать 2 контакта Arduino и даст 16 линий ввода/вывода. Так что технически вы можете использовать 8 штук MCP23017 для расширения одного 16-контактного Arduino до 16 x 8 = 128 контактов. Arduino имеет библиотеку для шины I2C под названием Wire.h, поэтому взаимодействие с MCP23017 будет очень простым. Ниже приведена схема подключения Arduino и MCP23017.




#include "Wire.h" void setup() { Wire.begin(); // активируем шину I2C // устанавливаем линии на выход Wire.beginTransmission(0x20); Wire.write(0x00); // регистр IODIRA Wire.write(0x00); // устанавливаем все линии порта A на выход Wire.endTransmission(); } void loop() { Wire.beginTransmission(0x20); Wire.write(0x12); // адресный банк A Wire.write((byte)0xAA); // отправляемое значение - все линии в лог. 1 Wire.endTransmission(); delay(500); Wire.beginTransmission(0x20); Wire.write(0x12); // адресный банк A Wire.write((byte)0x55); // отправляемое значение - все линии в лог. 1 Wire.endTransmission(); delay(500); }

Новые статьи

● 5.4. Расширение цифровых портов для NodeMCU ESP8266 с помощью микросхемы MCP23017

Введем светодиодную индикацию и звуковую сигнализацию и при использовании в качестве контроллера умного дома модуля Nodemcu. Количество выводов у модуля Nodemcu гораздо меньше, чем у Arduino Mega, поэтому нам понадобится микросхема расширителя входов MCP23017. Микросхема MCP23017 добавляет 16 портов,которые можно настроить как на вход,так и на выход (рис. 5.7). Микросхема использует популярную двухпроводную шину I2C.

Рис. 5.7. Выводы микросхемы MCP23017

Адрес микросхемы MCP23017 для протокола I2C можно установить комбинацией сигналов на цифровых входах A0 - A2 (рис. 5.8), что позволяет к микроконтроллеру подключиь одновременно 8 микросхем MCP23017, соответственно 16*8=128 контактов.

Рис. 5.8. Установка адреса микросхемы MCP23017

Микросхема имеет 2 банка портов A (GPA0- GPA7) и B (GPB0- GPAB), каждый из которых можно настроить на ввод или вывод.
В листинге 5.3. показан пример настройки банков выводов A и B.

Листинг 5.3

// подключение библиотеки Wire.h #include byte input=0 ; void setup () { Serial.begin(9600 ); Wire.begin(0 ,2 ); // запуск I2C Wire.beginTransmission(0x20 ); // i2c - адрес (A0-0,A1-0,A2-0) Wire.write(0x00 ); // IODIRA register Wire.write(0x00 ); // настроить PORT A как output Wire.endTransmission(); } void loop () { // чтение данных из PORT B Wire.beginTransmission(0x20 ); Wire.write(0x13 ); Wire.endTransmission(); Wire.requestFrom(0x20 , 1 ); input=Wire.read(); // записать полученные данные в PORT A Wire.beginTransmission(0x20 ); Wire.write(0x12 ); // address PORT A Wire.write(input); // PORT A Wire.endTransmission(); delay(100 ); // пауза }

Использование микросхемы MCP23017 позволит расширить количество цифровых контактов модуля Nodemcu на 16 и позволит организовать светодиодную индикацию и звуковую сигнализацию о критических параметрах датчиков.

Чипы SPI или I2C ADC легко доступны в диапазоне разрешений, скорости дискретизации и количества каналов. Их довольно просто добавить в любой Arduino.

Например, MCP3208 даст 8 каналов 12-битного разрешения на SPI, что означает 3 контакта (MOSI/MISO/SCK) + 1 на микросхему (SS). Таким образом, 1 чип будет 4 булавки, 2 фишки 5 контактов, 3 фишки 6 контактов и т. Д.

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

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

Второй вариант включает использование аналоговых мультиплексоров (например, 4051) для переключения различных источников на существующие аналоговые входы.

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

Развернувшись на ответ Маженко, вы можете использовать аналоговый мультиплексор, такой как 74HC4051, чтобы превратить один аналоговый порт в 8.

Его кузен, 74HC4067, будет мультиплексировать 16 портов. Теперь с 6 аналоговыми входами на Arduino Uno вы можете иметь 6 x 16 входов = 96. Сигналы управления A/B/C могут быть параллельны.

Это позволит вам обрабатывать 96 входов с 6 дополнительными чипами и довольно простым кодом. У меня есть примеры кода на моей странице о мультиплексоре/демультиплексоре 74HC4051 .

Для 8 входов код:

// Example of using the 74HC4051 multiplexer/demultiplexer // Author: Nick Gammon // Date: 14 March 2013 const byte sensor = A0; //where the multiplexer in/out port is connected // the multiplexer address select lines (A/B/C) const byte addressA = 6;//low-order bit const byte addressB = 5; const byte addressC = 4;//high-order bit void setup () { Serial.begin (115200); Serial.println ("Starting multiplexer test ..."); pinMode (addressA, OUTPUT); pinMode (addressB, OUTPUT); pinMode (addressC, OUTPUT); } //end of setup int readSensor (const byte which) { //select correct MUX channel digitalWrite (addressA, (which & 1) ? HIGH: LOW); //low-order bit digitalWrite (addressB, (which & 2) ? HIGH: LOW); digitalWrite (addressC, (which & 4) ? HIGH: LOW); //high-order bit //now read the sensor return analogRead (sensor); } //end of readSensor void loop () { //show all 8 sensor readings for (byte i = 0; i < 7; i++) { Serial.print ("Sensor "); Serial.print (i); Serial.print (" reads: "); Serial.println (readSensor (i)); } delay (1000); } //end of loop

Я точно работал с тем же вопросом. Мне нужна программа, которая читает 100 термисторов... Почему? ну, раз вам это нужно.

Я уже закончил это.

Я попробовал мультиплексор/демультиплексор 74HC4051. Но по какой-то причине я не получил желаемого результата.

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

Я использую протокол I2C, 8 arduino Mega 7 slaves и один мастер. и после отправки send Integer, float и blah blah не помог мне просто сделать это. Он может отправлять аналоговое чтение через I2C, и мастер делает все необходимое преобразование.

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