- Назначение и принцип работы
- Разновидности
- Пример
- Вывод
- FAQ
Назначение и принцип работы
Мультиплексор - устройство имеющее много сигнальных входов и мало (либо вообще один) сигнальных выходов, поочередно соединяемых между собой. Порядок соединения определяется комбинацией других сигнальных входов устройства, так называемого селектора. Мультиплексор в народе также известен под названием ключ или коммутатор.В общем случае внутренняя принципиальная схема мультиплексора выглядит так: Применений такому устройству можно придумать массу, входящих сигналов обычно всегда больше, чем ног у контроллера, а уделить внимание надо всем. Особенно ценен, в этом смысле, мультиплексор аналоговый, то есть передающий не только логический уровень сигнала, но и его напряжение, потому что ног с АЦП на контроллере еще меньше. А еще очень удобен для “механического” преобразования параллельного сигнала в последовательный, достаточно лишь “рубить” сигналы с входов на определенные временные куски.
Где приобрести Ардуино комплектующие?
Купить Arduino запчасти можно в нашем магазине 3DIY
Разновидности
Как уже стало понятно из предыдущего абзаца, мультиплексоры могут быть цифровыми и аналоговыми. Первые могут копировать сигнал, не передавая его напрямую, а значит обеспечивать гальваническую развязку и, при необходимости, преобразовывать уровни, например с 5V на 3.3V, что не только экономит пины, но и упрощает схему подключения а также делает ее безопасной. Кроме того, мультиплексоры отличаются количеством входов, выходов и взаимосвязью между ними. Вот лишь несколько примеров:Пример
Мультиплексор CD74HC4067 выпускается на ассиметричной, но удобной плате, со входами на одной стороне и выходом с управляющими сигналами на второй. Где:- С0-С15 - 16 аналоговых входов,
- SIG - один аналоговый выход,
- EN - сигнал, включающий перемычку между входом и выходом (крайне рекомендуется отключать ее при смене коммутирующих сигналов) 0 - вкл, 1 - выкл,
- VCC и GND - соответственно, питание 5V,
- S0-S3 - коммутирующие сигналы, комбинацией состояния которых подключается тот или иной вход к единственному выходу.
byte a = 10;
digitalWrite(S0, bitRead(a, 0));
digitalWrite(S1, bitRead(a, 1));
digitalWrite(S2, bitRead(a, 2));
digitalWrite(S3, bitRead(a, 3));
Или в виде битовых операций сдвига.
byte a = 10;
digitalWrite(S0, ((a & 1 << 0) >> 0));
digitalWrite(S1, ((a & 1 << 1) >> 1));
digitalWrite(S2, ((a & 1 << 2) >> 2));
digitalWrite(S3, ((a & 1 << 3) >> 3));
Или вообще, прямым копированием байта адреса в порт с пинами. Разумеется, в этом случае пины должны следовать строго по номерам выбранного порта, а остальные 4 пина не иметь недокументированных задач.
DDRB = 0b00001111; // настройка порта
byte a = 10;
PORTB = a;
Третий способ самый быстрый, и он может одновременно управлять двумя независимыми мультиплексорами, но накладывает свои требования на пины и требует некоторой ловкости от программиста и схемотехника.
Создадим простой проект, в котором показания 16 датчиков освещения, в виде фоторезисторов, будем считывать одним аналоговым пином при помощи четырех цифровых.
Соберем схему. Напишем программу.
byte MP[4] = {11, 10, 9, 8}; // пины селектора мультиплексора #define AN A0 // аналоговый пин на выход с мультиплексора #define EN 12 // enable void setup() { pinMode(EN, OUTPUT); // настройка пинов digitalWrite(EN, HIGH); pinMode(AN, INPUT); for (byte i = 0; i < 4; i++) { pinMode(MP[i], OUTPUT); digitalWrite(MP[i], LOW); } Serial.begin(9600); } void loop() { for (byte i = 0; i < 16; i++) { // опрашиваем все 16 датчиков digitalWrite(EN, HIGH); // выключаем "перемычку" на время установки селектора digitalWrite(MP[0], ((i & 1 << 0) >> 0)); // выставляем селектор digitalWrite(MP[1], ((i & 1 << 1) >> 1)); digitalWrite(MP[2], ((i & 1 << 2) >> 2)); digitalWrite(MP[3], ((i & 1 << 3) >> 3)); digitalWrite(EN, LOW); // включаем "перемычку" Serial.print(" "); // выводим информацию на терминал в текстовом виде Serial.print(i); Serial.print("="); Serial.print(analogRead(AN)); } Serial.println(" "); // перевод строки delay(500); // пауза }
Запустим, и увидим в терминале примерно такое: Теперь мы, немного доработав программу, можем сделать, например, лазерный тир с 16 независимыми мишенями. А если заменить фоторезисторы на потенциометры, то панель управления с 16 “крутилками” настроек. Или датчик влажности почвы с 16 точками измерения. И так можно легко работать с любыми аналоговыми датчиками, которых существует великое множество, в том числе одновременно с разнотипными.Для особо ненасытных, функционал можно существенно расширить, увеличивая количество аналоговых входных сигналов до огромного количества. Сделать это можно параллельным или последовательным способом. В первом случае, несколько мультиплексоров параллельно подключаются к сигналам селектора, а выходы к отдельному аналоговому входу. Таким образом можем опрашивать до 8*16 = 128 аналоговых датчиков одним контроллером. Во втором, вход первого мультиплексора соединяем с выходом второго, создавая этакое дерево, количество веток которого множится в арифметической прогрессии с каждым следующим уровнем. Ограничивается такая схема лишь управляющими пинами селектора, т.к. на каждый мультиплексор требуется 4 отдельных пина. Но, в случае если цифровых пинов не хватит, всегда можно почитать на нашем сайте статью про сдвиговые регистры и решить эту проблему тоже.
Вывод
Мультиплексор - простой и удобный инструмент для расширения возможностей контроллера путем увеличения количества его пинов. Он понятнее в работе чем входящий сдвиговый регистр, и, самое главное, имеет возможность передавать аналоговый сигнал, недоступный другим решениям. Знать об этом устройстве и уметь применять его на практике должен каждый уважающий себя DIY-мастер.FAQ
Может ли мультиплексор работать в обратном направлении, от выхода к входу?Если речь идет о герое нашей статьи, то да, может, он двунаправленный. Однако, придумать применение для такого использования довольно сложно, тем более, что потребуется синхронизировать селектор с приемным устройством, иначе смысл в этом подключении пропадает.
С какой максимальной скоростью переключается селектор?
Даташит подсказывает, что при работе с пятивольтовой логикой переключение происходит максимум за 500ns. То есть потребуется 8 мкс на все 16 переключений. Для подавляющего большинства задач этой скорости хватит с большим запасом, тем более, что при помощи функций digitalWrite() переключаться быстрее и не получится.
Какие еще мультиплексоры можно использовать с Ардуино?
Практически любые, которые существуют в природе. Важно лишь выбрать нужный под свою задачу и разобраться как он работает. Например, интересный четырехканальный 74HC4052 или восьмиканальный 74HC4051.
Как еще можно уменьшить количество пинов для переключения селектора?
Использовать цифровые мультиплексоры, управление которыми происходит по последовательному каналу, например i2c. Каждому устройству приписывается свой адрес и все они переключаются одной цепочкой команд от контроллера. Однако, такие мультиплексоры значительно дороже и заметно реже встречаются в продаже.