среда, 3 января 2018 г.

Аналоговый мультиплексор/демультиплексор CD4051 - увеличиваем количество аналоговых выводов Ардуино

CD4051 pinout распиновка подключение к Ардуино
CD4051 - это 8 канальный аналоговый CMOS мультиплексор/демультиплексор. Если вам в вашем проекте не хватает аналоговых входов, то данная микросхема поможет решить эту проблему: используя 1 аналоговый и 3 цифровых входа можно получить 8 аналоговых входов.

Мультиплексором называется устройство, которое позволяет передавать сигнал с одного из нескольких входов на единственный выход. Демультиплексор, напротив, передает сигнал с единственного входа на один из информационных выходов. CD4051 совмещает в себе эти две функции, являясь по сути аналоговым коммутатором, принцип ее работы показан на следующей схеме:
Функциональная схема CD4051
Функциональная схема CD4051

Вывод COM подключается к аналоговому выводу микроконтроллера. Значения на цифровых входах A, B, C определяют какой из каналов будет соединен с выводом COM. Соединение возможно только при наличии разрешающего сигнала (низкого уровня) на входе INH.

Технические характеристики микросхемы CD4051 вы можете найти в Даташите.

Теперь о применении микросхемы. С ее помощью можно, например, управлять 8 светодиодами или считывать значения 8 потенциометров. Можно увеличить количество пьезоизлучателей, подключаемых к Ардуино для создания MIDI барабанной установки. Я для примера покажу, как можно подключить 8 фоторезисторов к Ардуино.

Подключение микросхемы CD4051 к Ардуино для работы с 8 фоторезисторами
Схема подключения 8 фоторезисторов к Ардуино с использованием аналогового коммутатора CD4051

Я не хочу управлять выводом INH и подсоединил его к земле. Таким образом чтение/запись сигнала через CD4051 будут всегда разрешены. Вывод COM подключен к пину A0 Ардуино, выводы A, B и C к цифровым пинам 8, 9 и 10 соответственно. Чтобы не устанавливать значение каждого из этих пинов функцией digitalWrite я буду обращаться напрямую к регистру B, который отвечает за значения пинов с 8 по 13. Фоторезисторы я поместил в термоусадочную трубку, так они будут более "направленными".
// Пример работы с микросхемой CD4051
byte AnalogIn = A0; // CD4051 pin 3 (Common in/out)

void setup() {
  Serial.begin(9600);
  pinMode(8,  OUTPUT);  // CD4051 pin 11 (A)
  pinMode(9,  OUTPUT);  // CD4051 pin 10 (B)
  pinMode(10, OUTPUT);  // CD4051 pin 9  (C)
}

void loop() {
  for (byte i = 0; i < 8; i++) {
    PORTB = (PORTB & B11111000) ^ i;
    Serial.print(i);
    Serial.print(": ");
    Serial.println(analogRead(AnalogIn));
  }
  Serial.println();
  delay(1000);
}

После прошивки данного скетча в Ардуино откройте монитор порта, в нем будут отображаться значения, считанные с фоторезисторов. Я же для демонстрации добавил в схему блютуз модуль и вывел полученные значения на смартфон с установленным на нем приложением RemoteXY:



Таким образом с помощью CD4051 можно увеличить количество аналоговых выводов в Ардуино. Но если этого окажется мало, то можно подключить несколько микросхем CD4051. Для этого пины Ардуино, отвечающие за выбор канала, подключаются к выводам A, B и C всех микросхем, а выбор активной микросхемы осуществляется установкой разрешающего сигнала на входе INH, например, с помощью дешифратора.

10 комментариев:

  1. Добрый день, Владимир!
    Столкнулся с интересной проблемой при реализации MIDI барабанов с помощью данного мультиплексора.
    При сильном ударе по пьезодатчику создается высокий сигнал и у других датчиков и они также срабатывают. В итоге несколько звуков от одного удара (и дело не в чувствительности). "Левый" сигнал появляется даже на датчиках, которые отключены от схемы (и этот сигнал может быть больше чем на основном датчике, поэтому чувствительность не решит проблемы). Эксперименты завели меня в еще более интересную ситуацию - подключить пьезодатчик напрямую к ардуино (как в вашем проекте с барабанами). В итоге если подключены сразу несколько датчиков (каждый к своему аналоговому порту у ардуино), то все заработало идеально. Но если оставить один датчик то также появляются эти "левые" сигналы на других итерациях цикла (пробовал даже с вашей прошивкой но получил аналогичные результаты с любой моделью ардуино, в том числе как китайские так и итальянские).
    Очень надеюсь, что вы сможете мне помочь и поймете то, что не могу понять я))).
    Для наглядности, чтоб повторить эксперимент, вы можете так же подсоединить один датчик к любому аналоговому входу ардуино, а в своей прошивке с барабанами добавить
    Serial.print(i);
    Serial.print(" ");
    Serial.println(hit);
    после if ((hit >= Drums[i].Threshold)), где i будет номер аналогового входа, а hit значение с датчика. После неплохого удара (у меня получилось, не отрывая руки от стола, указательным пальцем нанести данное критическое попадание) в отладчике вы должны заметить большие сигналы и на других неподключенных барабаных.
    ЗАРАНЕЕ БОЛЬШОЕ СПАСИБО!

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Насчет "если оставить один датчик то также появляются эти "левые" сигналы" - дело в том, что при чтении аналогового входа, к которому ничего не подключено, всегда присутствует случайный шум. Эта особенность может использоваться для инициализации генератора случайных чисел:
      randomSeed(analogRead(0)); // https://www.arduino.cc/reference/en/language/functions/random-numbers/randomseed/
      Но в данном случае она мешает нормальной работе, поэтому незадействованные аналоговые входы не должны опрашиваться.
      Что касается описанной проблемы при использовании мультиплексора, сходу сказать не могу, надо попробовать воспроизвести.

      Удалить
    2. Ооо! Спасибо!)
      На счет воспроизведения буду ждать тогда)) очень интересно что получится у вас.

      Удалить
    3. Добрый день!
      Воспроизвести удалось. Это так называемые перекрестные помехи - характерная черта аналоговых мультиплексоров, сигнал одного канала влияет на другой. Пока не получилось от них избавиться. Есть идея использовать для этого стабилитроны, но под рукой их не оказалось, купить тоже пока не получилось. Напишу, если продвинусь в этом вопросе.

      Удалить
    4. Здравствуйте, попробуйте сделать как тут
      http://arduino.ru/forum/apparatnye-voprosy/ochen-silno-shumyat-multipleksory-4051#comment-316277

      Удалить
    5. Хм...Garry Brillich, почитал форум который вы скинули, там есть интересные идеи, которые стоит попробовать. Например мне приглянулась идея одну ножку мультиплексора посадить на землю и перебирать датчики чередуя через эту ножку. Если сработает, то мы все равно выигрываем и получаем 7 аналоговых входов взамен 1 аналогового и 3 цифровых.

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

      Удалить
    6. Garry Brillich, попробовал предложенный способ опроса каналов мультиплексора - работает.
      Проверял на четырех пьезоизлучателях, они подключены к каналам мультиплексора CH0 - CH3. CH7 соединен с землей. После опроса очередного канала переключал мультиплексор на CH7:
      PORTB = (PORTB & B11111000) ^ i; // Выбираем очередной канал
      hit = analogRead(0); // Считываем значение с аналогового входа
      PORTB = (PORTB & B11111111); // Переключаемся на CH7

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

      Удалить
    7. Николай, да, я думаю, стабилитрон поможет избавиться от скачков, идущих с пьезо.

      Удалить
    8. Не избавитесь от скачков проверено в реальности, все равно 2 ноты выбивает.

      Удалить
  2. Параллельно пьезодатчику резистор 100 кОм и 1N4148, затем усилитель-формирователь на ОУ и детектор огибающей, вход АЦП посадить на землю через подстроечник 1 кОм, к движку - выход детектора.

    ОтветитьУдалить