Мультиплексор CD74HC4067: 16 аналоговых датчиков на одном пине

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

Нужен он потому, что источников сигнала обычно больше, чем выводов у контроллера. Особенно полезны аналоговые мультиплексоры, которые передают не просто логический уровень, а само напряжение: входов с АЦП у контроллера ещё меньше, чем цифровых. Ещё одно применение - преобразование параллельного сигнала в последовательный, когда входы поочерёдно подключаются к выходу на заданные отрезки времени.
Разновидности
Мультиплексоры делятся на цифровые и аналоговые. Цифровые могут не пропускать сигнал напрямую, а копировать его. Это даёт гальваническую развязку и при необходимости преобразование уровней, например с 5 В на 3,3 В, что упрощает схему и делает её безопаснее. Кроме того, микросхемы различаются числом входов и выходов и связями между ними.


Классический вариант имеет один выход и число входов, кратное степени двойки: чаще всего 4, 8 или 16. Из совместимых с Arduino микросхем можно назвать четырёхканальную 74HC4052 и восьмиканальную 74HC4051. Существуют и цифровые мультиплексоры с управлением по последовательной шине, например I2C: каждому назначается адрес, и все они переключаются одной цепочкой команд. Такие стоят заметно дороже и встречаются реже.
Плата на CD74HC4067
Один из самых распространённых аналоговых мультиплексоров в любительских проектах - CD74HC4067. Его выпускают на плате, где входы собраны на одной стороне, а выход и управляющие сигналы - на другой.

- C0-C15 - 16 аналоговых входов;
- SIG - единственный аналоговый выход;
- EN - разрешение соединения входа с выходом: 0 включает, 1 выключает;
- S0-S3 - сигналы селектора;
- VCC и GND - питание 5 В.
На время смены сигналов селектора соединение настоятельно рекомендуется отключать выводом EN. Микросхема двунаправленная, то есть может передавать сигнал и от выхода к входам, хотя применение этому найти трудно: селектор придётся синхронизировать с приёмной стороной. По даташиту при пятивольтовой логике переключение занимает не более 500 нс, то есть на все 16 каналов уйдёт 8 мкс. Функция digitalWrite() всё равно работает медленнее.
Как задаётся номер канала
Состояния S0-S3 совпадают с двоичной записью номера входа: 13 - это 0b1101. Поэтому адрес достаточно разложить на четыре младших бита. В источнике описаны три способа:
- функция bitRead(): на каждый вывод подаётся соответствующий бит, например digitalWrite(S0, bitRead(a, 0));
- битовые операции сдвига и маски с тем же результатом;
- прямая запись байта адреса в порт: DDRB = 0b00001111, затем PORTB = a.
Третий способ самый быстрый и позволяет одновременно управлять двумя независимыми мультиплексорами. Но выводы селектора при этом должны идти строго по порядку битов выбранного порта, а остальные четыре вывода порта не должны быть заняты чем-то посторонним.
Пример: 16 фоторезисторов
В демонстрационном проекте 16 датчиков освещённости на фоторезисторах читаются одним аналоговым входом A0 и четырьмя цифровыми выводами. Селектор подключён к пинам 11, 10, 9 и 8, сигнал EN - к пину 12.
Скетч в цикле перебирает номера от 0 до 15. Для каждого он подаёт на EN высокий уровень, выставляет на селекторе биты номера, возвращает EN в низкий уровень и считывает значение через analogRead(). Результаты всех каналов выводятся одной строкой в монитор порта на скорости 9600, после чего следует пауза 500 мс.
Та же схема с небольшими доработками превращается в лазерный тир с 16 мишенями, в панель из 16 потенциометров или в измеритель влажности почвы на 16 точек. Датчики могут быть любыми аналоговыми, в том числе разнотипными.
Наращивание числа входов
Каналов можно сделать больше двумя способами. При параллельном включении несколько мультиплексоров получают общие сигналы селектора, а выход каждого идёт на свой аналоговый вход контроллера: так опрашивается до 8 x 16 = 128 датчиков. При последовательном выход одного мультиплексора подключается ко входу другого, образуя дерево. Здесь ограничением становятся выводы селектора, поскольку каждой микросхеме нужны свои четыре. Нехватку цифровых выводов можно закрыть сдвиговыми регистрами.
По сравнению со входным сдвиговым регистром мультиплексор проще для понимания и, главное, передаёт аналоговый сигнал.