Работа с мультиплексорами для получения постоянного напряжения на выходе

Я работаю над созданием схемы, в которой я пытаюсь иметь возможность переключать несколько нитей светодиодного шнура одновременное включение и выключение с помощью Arduino и мультиплексора.

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

Что я не знаю, как сделать, так это изменить свой скетч / схему, чтобы я мог включать и выключать ВСЕ нити веревки, а также по отдельности.

Ниже показан мой текущий скетч Arduino:

//Выводы управления мультиплексором
int s0 = 8;
int s1 = 9;
int s2 = 10;
int s3 = 11;

//Мультиплексор на выводе "SIG"
int SIG_pin = 3;

int testValue = 255;


void setup(){
  pinMode(s0, OUTPUT); 
  pinMode(s1, OUTPUT); 
  pinMode(s2, OUTPUT); 
  pinMode(s3, OUTPUT); 


  pinMode(SIG_pin, OUTPUT);

  digitalWrite(s0, LOW);
  digitalWrite(s1, LOW);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);

}


void loop(){

  //Проходим и читаем все 16 значений
  //Сообщает значение на канале 6: 346
  for(int i = 0; i < 9 ; i ++){
    delay(1000);
    writeMux(i);    
  }
}


int writeMux(int channel){
  int controlPin[] = {s0, s1, s2, s3};

  int muxChannel[10][4]={
    {0,0,0,0}, //канал 0
    {1,0,0,0}, //канал 1
    {0,1,0,0}, //канал 2
    {1,1,0,0}, //канал 3
    {0,0,1,0}, //канал 4
    {1,0,1,0}, //канал 5
    {0,1,1,0}, // канал 6
    {1,1,1,0}, //канал 7
    {0,0,0,1}, //канал 8
    {1,0,0,1}, //канал 9
    {0,1,0,1}, //канал 10
    {1,1,0,1}, //канал 11
    {0,0,1,1}, //канал 12
    {1,0,1,1}, //канал 13
    {0,1,1,1}, //канал 14
    {1,1,1,1}  //канал 15
  };

  //перебираем 4 знака
  for(int i = 0; i < 4; i ++){
    digitalWrite(controlPin[i], muxChannel[channel][i]);
  }

  //читаем значение на выводе SIG
  analogWrite(testValue, SIG_pin);  


  //возвращаем значение
  return 0;
}

Я использую два мультиплексора для управления несколькими ветвями веревки. Вот примерно как это выглядит:

Я все еще немного новичок в создании прототипов электроники (из-за разработки программного обеспечения); поэтому я не уверен, что то, что я хочу сделать, возможно с мультиплексором

Рад начать предлагать награду за полезный ответ.

Спасибо

, 👍4

Обсуждение

Это будет сложно! Вы должны были купить _цифровую_ светодиодную ленту. Аналоговый, который вы получили, должен _непрерывно_ питаться сигналами ШИМ, а мультиплексоры могут направлять ваш выход ШИМ только на один цветовой канал одной нити за раз. Вы используете PNP или MOSFET? С полевыми МОП-транзисторами можно использовать их емкость затвора (или дополнительный конденсатор) для удержания значения, пока вы быстро переключаете мультиплексор. Не уверен, что вы можете сделать это достаточно быстро, чтобы избежать видимого моргания., @Edgar Bonet

Ах, это имеет смысл. Да, определенно нужно было использовать цифровую светодиодную ленту :/ Интересно, может ли что-то подобное помочь... https://www.adafruit.com/products/1429, @narner

Выглядит хорошо для меня. Обратите внимание, что вам понадобятся подтягивающие резисторы между этим чипом и каждым из ваших транзисторов., @Edgar Bonet

Я бы подумал, что для небольшого количества каналов их циклическое переключение не приведет к мерцанию, но 16 или более каналов — это много для этой техники, особенно если вы хотите иметь достаточный контроль над яркостью, а не просто вкл./выкл. выключенный. Еще одна плата, на которую стоит обратить внимание, может помочь — [SX1509] (https://www.sparkfun.com/products/13601), которая дешевле и, как мне кажется, более программируема, чем TLC5947., @cjs

Я советую использовать ht16k33 (вы будете использовать его с digitalWrite), @user30878


1 ответ


1

Даже я новичок в этом, и я также нахожу это немного сложным с доступной настройкой и желаемым результатом. Хотя это кажется сложным, я хочу, чтобы вы просто попробовали этот код (это небольшая модификация того, что вы опубликовали) и проверили, соответствует ли он ожидаемому результату.

    //Контакты управления мультиплексором
#define s0 8;
#define s1 9;
#define s2 10;
#define s3 11;

//Мультиплексор на выводе "SIG"
#define SIG_pin 3;

#define testValue 255;  //максимальное значение для функции AnalogWrite()

void setup()
{
  pinMode(s0, OUTPUT); 
  pinMode(s1, OUTPUT); 
  pinMode(s2, OUTPUT); 
  pinMode(s3, OUTPUT); 

  pinMode(SIG_pin, OUTPUT);

  digitalWrite(s0, LOW);
  digitalWrite(s1, LOW);
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
}

void loop()
{
  //Проходим и читаем все 16 значений
  for(int i = 0; i < 16 ; i ++)
  {
    delay(1000);
    writeMux(i);
  }
}


int writeMux(int channel)
{
  int controlPin[] = {s0, s1, s2, s3};

  int muxChannel[16][4]=
  {
    {0,0,0,0}, //канал 0
    {1,0,0,0}, //канал 1
    {0,1,0,0}, //канал 2
    {1,1,0,0}, //канал 3
    {0,0,1,0}, //канал 4
    {1,0,1,0}, //канал 5
    {0,1,1,0}, // канал 6
    {1,1,1,0}, //канал 7
    {0,0,0,1}, //канал 8
    {1,0,0,1}, //канал 9
    {0,1,0,1}, //канал 10
    {1,1,0,1}, //канал 11
    {0,0,1,1}, //канал 12
    {1,0,1,1}, //канал 13
    {0,1,1,1}, //канал 14
    {1,1,1,1}  //канал 15
  };

  //перебираем 4 знака
  for(int i = 0; i < 4; i ++)
  {
    digitalWrite(controlPin[i], muxChannel[channel][i]);
  }

  //читаем значение на выводе SIG
  for(int i_testValue = 0; i_testValue < testValue; i_testValue++)
  {
    analogWrite(i_testValue, SIG_pin);      // медленное увеличение интенсивности с задержкой 100 мс
    delay(100);
  }


  //возвращаем значение
  return 0;
}
,