Подключение катода диода к выходу мультиплексора

Судя по изображению, диоды имеют один и тот же анод, который управляется "Сделай что-нибудь". Мой вопрос: используя Arduino IDE, какой код я должен написать, который соединяет выход мультиплексора (Z) с катодом определенного диода (Y0 или Y1 или ... или Y7), который, в свою очередь, подключен к "Делать что-то", что, вероятно, управляет катодом? В этом коде я хочу, чтобы микроконтроллер ESP32 подключил этот катод, чтобы "Сделать что-то", скажем, на 3 секунды, а затем переключился на катод следующего диода с задержкой 0,1 секунды [где катоды диодов не подключены к Z] (и так далее: в непрерывном цикле).

Вот некоторый код, который я нашел в Интернете, но не уверен, что нужно добавить, чтобы получить надлежащую функциональность:

int outputs[4] = {4,0,2}; // контакты для выбора светодиода
int inhibit_pin = 15; // pin для выключения всех светодиодов


void setup() {
  for(int i;i<3;i++){
    pinMode(outputs[i],OUTPUT); // выбор выхода для управления светодиодами
  }
  pinMode(inhibit_pin,OUTPUT);
  digitalWrite(inhibit_pin,LOW); // поднять высоко, чтобы отключить все
 
}


void loop() {
  // цикл через все 8 светодиодов
  for (int j=0;j<8;j++){
    // включение светодиодов на основе преобразования битов
    for(int i=0;i<3;i++){
      digitalWrite(outputs[i],bitRead(j,i));
    }
    delay(100); // задержка .1 сек
  }
}

Я не думаю,что "digitalWrite(outputs,bitRead(j, i));" на самом деле необходим, и я не совсем уверен в том, что он делает.

, 👍0

Обсуждение

bitRead(j,i) считывает i-й бит из битовой строки. например, число 6 имеет двоичное представление 110. bitRead(6,2) считывает 1, начиная с правого бит0 = 0, бит1 = 1, бит2 = 1. В вашей программе этот код записывается на выходные контакты, которые управляют мультиплексором для использования Y6. Вот и все. Программа должна работать так, как она есть. Кстати: Вы увидите эффект только в том случае, если диоды на схеме / рисунке являются светодиодами, а "Do Somethig" делает что-то, то есть обеспечивает постоянное или быстрое пульсирующее напряжение., @Peter Paul Kiefer

Что такое МУЛЬТИПЛЕКСОР?, @Majenko

- скажем, на 3 секунды, а затем переключитесь на катод следующего диода с задержкой 0,1 секунды. Если вы имеете в виду, что хотите, чтобы ** ни один из восьми выходов не приводился в действие в течение периода "0,1" секунды, вы должны [обновить свой вопрос] (https://arduino.stackexchange.com/posts/80871/edit ) для уточнения. Как есть, это не то, что делает ваш код., @timemage

какие диоды вы используете? ... зачем они тебе вообще нужны?, @jsotola

Моя идея состоит в том, чтобы использовать микроконтроллер только для управления мультиплексором (каждый раз, когда один Y0 подключен к Z). Блок "Сделай что-нибудь" непрерывно подает соответствующие сигналы для возбуждения анода диода и Z (катода диода). На диаграмме показана лишь небольшая часть моего проекта, а "Сделай что-нибудь" - очень сложная система. Это хорошо работает, когда один диод подключен напрямую [без мультиплексора], чтобы "сделать что-то", но теперь мне нужно 8 диодов, каждый раз, когда один диод подключается к "Сделать что-то"., @William

Почему бы не использовать 1 диод на Z и не удалить 8 диодов между контактами Y0...Y7 вашего мультиплексора и вашего блока "Сделай что-нибудь"? Это позволило бы току течь только в одну сторону между Yx и Z, используя один диод вместо 8., @Duncan C

Я откатил вашу последнюю правку, потому что вы удалили URL-адрес изображения, но оставили тег изображения, а также содержание вашего вопроса ссылается на это изображение. Если у вас есть * веская причина * получить изображение, и * неясно, что вы это делаете *, удалите и тег, и URL-адрес, и ссылки на него., @timemage

Ваш общий анодный вход "сделай что-нибудь", вероятно, должен иметь подтягивание, чтобы избежать плавающего состояния., @Peter Willard

Вы должны отредактировать свой вопрос и вернуть изображение обратно. Без этого вашему описанию будет очень трудно следовать., @Duncan C


1 ответ


Лучший ответ:

0

Код, который вы опубликовали, должен проходить через 8 возможных контактов MUX in / out (Y0 ... Y7), соединяющихся по одному с контактом 3.

Предполагая, что ваши Y0-Y7 подключены к контакту на вашем блоке "сделай что-нибудь", мультиплексор должен подключить каждый из 7 контактов на вашем блоке "сделай что-нибудь" к Z.

Одна из проблем, которую я вижу, заключается в том, что ваш код изменяет значения выбора контакта на MUX, пока MUX включен. Когда вы выполняете цикл for(int i=0;i<3;i ++) и переключаете различные биты select на S0 ...S2, MUX будет подключать разные Y0...Y7 выводится на Z, пока он не остановится на конечном наборе значений для S0 ...S2. Вы действительно должны установить inhibit_pin на HIGH (отключив mux перед входом в цикл for(int i=0; i<3;i ++), а затем снова установить его на LOW в конце цикла. цикл i и перед задержкой. (чтобы снова включить мультиплексор на теперь полностью выбранном выводе.)

Вашему описанию немного трудно следовать, но похоже, что это то, что вы хотите.

Если вы хотите, чтобы каждый вывод был подключен в течение 3 секунд, а затем не подключался ни к одному выводу в течение 1 секунды, прежде чем перейти к следующему выводу, вы можете переписать свой цикл следующим образом:

void loop() {
  // цикл через все 8 светодиодов
  for (int j=0;j<8;j++){

    // отключите mux при выборе pin
    digitalWrite(inhibit_pin,HIGH); 

    // выберите вывод MUX
    for(int i=0;i<3;i++){
      digitalWrite(outputs[i],bitRead(j,i));
    }
    // повторно включите mux теперь, когда мы выбрали pin
    digitalWrite(inhibit_pin,LOW);
 
    delay(3000); // оставьте контакт активным на 3 секунды.

    // отключить мультиплексор на 1 секунду
    digitalWrite(inhibit_pin,HIGH); 
    delay(100); 
  }
}
,

Большое вам спасибо!! Из любопытства, если бы у меня было два одинаковых MUXS [одинаковые контакты] и 16 диодов, то как бы был изменен код для подключения каждого из 8 контактов к Z обоих MUXs в одном и том же порядке / времени [т.е. Y0 к Z MUX1 и Y0 к Z MUX2, затем Y1 к Z MUX1 и Y1 к Z MUX2 и так далее]? Извините за формулировку моего вопроса, так как мне трудно облечь свои мысли в слова., @William

Вы можете управлять 2 мультиплексорами с помощью Arduino, а еще лучше получить 16-канальный мультиплексор (хотя с 1 16-канальным мультиплексором вы можете выбрать только один канал за раз). Если вы использовали 2 мультиплексора, то свяжите их контакты Z вместе и используйте 3 разных контакта Arduino для селектора каналов на каждом мультиплексоре. Я бы написал функцию выбора канала, которая принимала бы номер MUX в качестве входных данных (скажем, MUX 1 или MUX 2) и использовала бы его для поиска номеров контактов, чтобы выбрать и включить канал для этого MUX, а затем мой цикл вызывал бы функцию для каждого MUX по очереди., @Duncan C

Похоже, вам нужно 4 уникальных контакта для каждого мультиплексора (3 контакта выбора канала и контакт включения). Вы можете снизить это до 3 уникальных контактов и общего пина включения, если вы написали свой код, чтобы отключить оба мультиплексора, сделать выбор канала, а затем включить оба одновременно., @Duncan C

Сначала я подумал, что поскольку два мультиплексора должны работать одинаково, то код можно использовать как есть. Но поскольку я мало использовал Arduino IDE и аппаратное программирование в целом, я написал свой первоначальный комментарий, чтобы перепроверить, и, как вы сказали, мне нужна функция для вызова каждого из мультиплексоров. Да, я согласен, что два мультиплексора могут совместно использовать сигнал включения, VCC и т. Д., За исключением Y0-Y7 и Z., @William

если вам известны какие-либо соответствующие веб-страницы, пожалуйста, поделитесь ими со мной, @William

Если вы всегда хотите, чтобы MUX1 и MUX2 подключали одни и те же контакты одновременно, вы можете просто разделить выходы Arduino и управлять обоими MUX с помощью одних и тех же 4 управляющих контактов., @Duncan C