Продолжаем тему модулей расширения портов для Arduino. Иногда возникает необходимость получать аналоговый сигнал с большого количества сенсоров, опрашивая их по очереди. Но у стандартной платы Arduino на контроллере ATMega328 всего 5 аналоговых входов.

В такой ситуации нас выручит аналоговый мультиплексор 1-в-16 CD74HC4067 (рис. 1). Он работает очень просто: в зависимости от логических уровней на входах адреса S0…S3 соединяет общий вывод Z c одним из выводов Y0…Y15. Двоичное значение адреса соответствует номеру вывода Y. Например, адрес 0000 подключает к выводу Z вывод Y0; адрес 0011 подключает вывод Y3.

Рис. 1. Модуль мультиплексора CD74HC4067

Коммутация работает как обычная проволочная перемычка между выводом Z и одним из выводов Y: направление передачи сигнала не имеет значения, сигнал на входе полностью повторяет сигнал на выходе. Мультиплексор разработан для коммутации аналоговых сигналов, но с равным успехом он может коммутировать и логические уровни – “перемычке” между выводами нет разницы, какой сигнал пропускать через себя.

Разумеется, мультиплексор можно использовать не только для переключения источников сигнала на аналоговом входе Arduino, но и управлять при помощи микроконтроллера распространением аналоговых сигналов между блоками устройства. Например, коммутировать источники звукового сигнала в усилителе НЧ. Кстати, коэффициент нелинейных искажений синусоидального сигнала в канале коммутации составляет не более 0,015%. 

Основные ограничения по параметрам сигнала:

  • Уровень сигнала не может превышать напряжение питания микросхемы VCC.
  • Сквозной ток через канал-перемычку не должен превышать 25 мА. Этого достаточно для управления обычными светодиодами.
  • Собственное сопротивление канала около 55 ом.

Особенности работы мультиплексора

Вывод EN (Enable) управляет активностью микросхемы в целом. При высоком логическом уровне на входе EN все сигнальные выводы мультиплексора переходят в высокоомное состояние независимо от адреса на выводах S0…S3.

При низком логическом уровне на входе EN вывод Z соединяется с одним из выводов Y0…Y15, а остальные выводы Y находятся в отключенном (высокоомном) состоянии. Этот момент важно учитывать, если сигнал поступает на вывод Z, а приемники сигнала подключены к выводам Y. В этом случае входы всех приемников сигнала, кроме подключенного в данный момент к Z, будут “висеть в воздухе” и подвергаться случайным помехам. Обычно это недопустимо, и надо предусмотреть в схеме резисторы номиналом 5…10 кОм, которые будут подтягивать входы приемников к общему проводу.

Если адресные входы S0…S3 подключены к портам Arduino, то адрес выставляется не одномоментно, а по мере записи логических уровней в порты Arduino!!! Мультиплексор работает быстро, и в момент выставления адреса вывод Z на короткое время будет соединяться со случайными выводами Y. Иногда это может быть очень вредно – вы можете соединить Z с ненужным случайным выводом Y. А мы ведь знаем, что если сбой в схеме может случиться, то он обязательно произойдет с наихудшими последствиями в самое неудачное время.

Поэтому лучше занять еще один цифровой порт Arduino для управления выводом EN. Алгоритм работы такой:

  1. Подаем высокий уровень на вывод EN
  2. Выставляем номер вывода Y на входах S0…S3
  3. Подаем низкий уровень на вывод EN

Пример подключения к Arduino

Порты D0…D3 подключим к адресным входам S0…S3; порт D4 соединяем со входом EN. Вывод Z соединяем с аналоговым входом A0 (рис. 2).

Рис. 2. Пример подключения модуля CD74HC4067

Загружаем в плату Arduino простой скетч:

 

В этом скетче мы выставили на выводах S0…S3 адрес вывода Y0 и активировали мультиплексор. Теперь при помощи мультиметра измерьте сопротивление между выводом Z и выводами Y. Только между выводами Z и Y0 низкое будет сопротивление, остальные выводы Y отключены.

Измерьте напряжение на выводах Y. Почему на выводе Y0 напряжение питания? Правильно, потому что командой pinMode(A0, INPUT_PULLUP);  мы включили внутренний подтягивающий резистор, который подтягивает вход A0 к линии питания. Соответственно, это же напряжение проникает через вывод Z на вывод Y0. 

Обратите внимание, чтобы управлять светодиодами, подключенными к выводам Y, достаточно одного гасящего резистора в цепи вывода Z. Второй вывод резистора подключается к общему проводу или линии питания, в зависимости от полярности включения светодиодов. При подборе номинала резистора учитывайте собственное сопротивление канала около 55 ом.