Работа с мультиплексорами для получения постоянного напряжения на выходе
Я работаю над созданием схемы, в которой я пытаюсь иметь возможность переключать несколько нитей светодиодного шнура одновременное включение и выключение с помощью 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;
}
Я использую два мультиплексора для управления несколькими ветвями веревки. Вот примерно как это выглядит:
Я все еще немного новичок в создании прототипов электроники (из-за разработки программного обеспечения); поэтому я не уверен, что то, что я хочу сделать, возможно с мультиплексором
Рад начать предлагать награду за полезный ответ.
Спасибо
@narner, 👍4
Обсуждение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;
}
- Как повторить другое действие внутри цикла?
- Проблема с подключением 2 8-разрядных сдвиговых регистров 74HC595 в каскадном соединении
- Почему светодиоды заметно мерцают?
- Код для реализации простого сигнала светофора, а также отображения на ЖК-дисплее, какой цвет включен?
- Как Peggy2 управляет строками с помощью декодера 74HC154?
- Включение и выключение двух наборов светодиодов с помощью двух кнопок
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
Это будет сложно! Вы должны были купить _цифровую_ светодиодную ленту. Аналоговый, который вы получили, должен _непрерывно_ питаться сигналами ШИМ, а мультиплексоры могут направлять ваш выход ШИМ только на один цветовой канал одной нити за раз. Вы используете 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