Працюємо з 09:00 до 19:00 Пн-Пт
Київ біля ТЦ Квадрат бул.Перова

Чарліплексинг

Пропоную вашій увазі корисне робоче рішення, як за допомогою трьох пінів контролера незалежно управляти шістьма світлодіодами. Його придумав співробітник компанії Maxim Чарлі Аллен. У цій статті ми навчимося принципам роботи так званого «чарліплексінга».

Це повинно бути мега цікаво тим, хто юзає дрібні контролери типу Attiny та інші.


Але так само наприклад мені особисто такого методу не вистачало при конструюванні щитків керування різними пристроями, де на передній панелі щитка потрібно було розміщувати кілька світлодіодів індикації включення виконавчих механізмів, а так само пару кнопок зі світлодіодною індикацією. Однією кнопкою наприклад включається автоматичний режим, а інший ручний режим, або однієї пуск, а другий стоп і їх потрібно підсвічувати при зміні режиму. І на такі нібито дрібниці іде порядна кількість пінів. Припустимо є три виконавчі механізми та дві кнопки з підсвічуванням. Це виходить 5 світлодіодів та 5 виходів контролера тільки на індикацію. Для Arduino Nano або Uno, наприклад, це багато в більш менш серйозному проекті там, де ще необхідно управляти декількома реле і декількома датчиками плюс пристрій на шині SPI.


У декількох проектах мені довелося все-таки застосувати розширювачі входів-виходів з керуванням по I2C. Але що, якщо можна було обійтися без розширювача, з меншою кількістю пінів і навіть з меншою кількістю обмежувальних резисторів. Чарлі Аллен показав свого часу світу, як можна використовувати третій стан Піна контролера для управління більшою кількістю світлодіодів ніж всі звикли.

Використання третього стану виводу контролера

Пін в режимі дискретного виходу:
   Логічна “1” -> На вихід надходить напруга живлення
   Логічний “0” -> На вихід підключено загальний дріт (мінус живлення)
Пін в режимі входу -> Високоомний стан

Тобто у нас в руках є наступні стани піна контролера: одиниця - це перемикання на плюс живлення; нуль - це перемикання на мінус живлення або на загальний провід; і третє - це високоомний стан, коли пін налаштований як дискретний вхід. Ці три значення можна обіграти для комутації шести світлодіодів.


Схема наступна.

До неї входить контролер Arduino Nano, три резистори на 150 Ом і 6 світлодіодів. Цікаво, що до них не потрібно навіть вести загальний провід. Світлодіоди включені попарно паралельно зі зворотним полярністю один до одного. Тут, щоб включати одночасно тільки один з шести світлодіодів, необхідна різна стан на трьох висновках контролера Arduino. Кожному світлодіоду буде відповідати своя комбінація відмінних один від одного станів трьох пинов. Уявімо, що потрібно запалити світлодіод LED1. Для цього на висновок D5 потрібно подати сигнал високого рівня, а на висновок D6 - сигнал низького рівня. Якщо при цьому не повинен запалюватися жоден інший світлодіод схеми, то висновок D7 потрібно перевести в режим входу. Тим самим ми попередимо протікання струму через будь-який з світлодіодів, безпосередньо підключених до нього.

D5,D6,D7
1, 0,-1 - LED1
0, 1,-1 - LED2
-1, 0, 1 - LED4
-1, 1, 0 - LED3
0,-1, 1 - LED6
1,-1, 0 - LED5

Комбінація сигналів для окремих світлодіодів така.

В табличку зведені стану виходів контролера для запалювання кожного світлодіода. І тут стає зрозуміло, що одночасно ми статично не зможемо запалювати кілька світлодіодів, для цього завдання необхідно динамічно перемикати стану виходів з такою швидкістю, щоб людському оку ці перемикання не були помітні. Добре, що контролери з цим чудово справляються, якщо їх не надто навантажувати іншими завданнями.


З'єднаємо всі компоненти на монтажці. Я беру звичайні світлодіоди, а потім заміню їх ультраяскравими. Сподіваюся висячі дроти не сильно будуть закривати світлодіоди.

Перша пробна програма

void setup()
{
pinMode(6, OUTPUT); // 1
digitalWrite(6, 1);
digitalWrite(7, 0);
pinMode(7, OUTPUT); // 0
pinMode(5, INPUT); // -1 } void loop() {
}

Відкриваємо Arduino IDE і накидаємо програму. Для початку просто для світіння першого світлодіода, щоб переконатися у функціонуванні ідеї. П'ятий пін конфігурується як вихід і виставляється в одиницю. Шостий теж як вихід і виставляється в нуль. Сьомий висновок конфігуруємо як дискретний вхід. На ньому буде високоомне стан. Клацаю завантажити скетч в контролер. І перший світлодіод горить за милу душу. Добре, один може світити. Тепер спробуємо, наприклад, третій запалити. Невеликі зміни в програмі: одиницю ставлю на 6-й пін; нуль - на сьомий пін, а мінус один на п'ятий. Завантажую скетч в контролер і о диво! Добре, таким чином можна світити один конкретний світлодіод з шести. Але ж ми тут зібралися, щоб навчитися світити багато одночасно.

Програма динамічного керування світлодіодами

const int pins[] = {5, 6, 7};
const int pinLEDstates[6][3] = {
{1, 0, -1}, // LED 1
{-1, 1, 0}, // LED 3
{0, 1, -1}, // LED 2 {-1, 0, 1}, // LED 4
};
{1, -1, 0}, // LED 5 {0, -1, 1} // LED 6 int ledState[6];
ledState[1] = 0;
void setup() { } void loop() { ledState[0] = 1; ledState[2] = 1;
refresh();
ledState[3] = 0; ledState[4] = 1; ledState[5] = 1; }
if (ledState[led])
void refresh() { for (int led = 0; led < 6; led ++) { clearPins(); {
}
setPins(led); } else { clearPins(); } delay(1); }
if (pinLEDstates[led][pin] == -1)
void setPins(int led) { for (int pin = 0; pin < 3; pin ++) { { pinMode(pins[pin], INPUT);
digitalWrite(pins[pin], pinLEDstates[led][pin]);
} else { pinMode(pins[pin], OUTPUT); } } } void clearPins() {
}
for (int pin = 0; pin < 3; pin ++) { pinMode(pins[pin], INPUT);
}

Для цього ускладнюємо прогу до невпізнання. Спочатку йде оголошення номерів пінів в масиві pins []. Наступний двовимірний масив містить комбінації станів виходів для кожного світлодіода. Масив ledState [] буде містити необхідні стани ледів (0 - вимкнено, 1 - включений). Функція setup залишається порожньою. У функції loop виставляємо необхідні стани світлодіодів, а функція refresh () динамічно поперемикає світлодіоди так як ми робили в першому скетчі, тільки набагато швидше. Вона в циклі шість разів спочатку переводить всі три виходи в режим входу за допомогою функції clearPins. При цьому всі світлодіоди гаснуть на короткий час. Далі перевіряється необхідний стан для чергового світлодіода, і, якщо його треба засвітити, програма йде в функцію setPins, яка виставить стани трьох пінів для цього леда. Якщо світлодіод не повинен світитися, обробник кидається в функцію clearPins. Далі в будь-якому випадку чекаємо одну мілісекунду і йдемо знову по циклу перебирати світлодіоди. Простіше кажучи прога циклічно періодично засвічує або гасить наступний по черзі світлодіод на одну мілісекунду, а в проміжках між обробкою наступного по порядку світлодіода, їх усі гасить на кілька мікросекунд. До речі, міняти стани світлодіодів можете за допомогою масиву ledState. Завантажуємо програму та бачимо, як світяться усі світлодіоди і досить яскраво. Тепер згасимо другий і четвертий світлодіоди. Завантажимо скетч. Все працює, ставимо галочку в своїй трудовій книжці.


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



Заходьте на наш канал Youtube

Висновки

Тепер які ж висновки можна зробити за цією схемою включення світлодіодів. Це хороший варіант дешевого вирішення питання нестачі входів-виходів контролера. До речі є схеми і на більшу кількість світлодіодів та пінів відповідно. Цікавість так само може представляти можливість підключати якісь виконавчі механізми в цю схему, використовуючи замість наших світлодіодів індикації оптопари. Уявіть, що ви таким чином зможете управляти шістьма оптопарами. Це буде не просте управління навантаженням, адже тут управління імпульсне, але в деяких випадках можливо буде вигідно заморочитися. Недоліки схеми бачу такі: низька надійність, в тому сенсі, що, якщо один світлодіод виходить з ладу, інші поведуть себе непередбачувано. Неможливість застосування апаратної ШІМ на пінах контролера. Хоча теоретично можна управляти яскравістю світлодіодів обігравши тривалості світіння та згасання програмно. З недоліків так само відзначаємо складність програми, яка так само може накладати обмеження і на основну програму. Ми наприклад не зможемо переривати цикл програми іншими затримками типу delay, бо світлодіоди почнуть підморгувати. Хоча ця проблема вирішується при оперуванні світлодіодами в перериванні по таймеру. Напишіть в коментах які плюси і мінуси я ще не згадав. Так що, не дивлячись на програмні складнощі, за цією схемою проглядаються багато корисних застосувань. Я в ній бачу більше плюсів і для себе точно беру її на замітку. Дякую за увагу! Підпишіться на наш канал і групу в фейсі - там багато цікавого. До зустрічі.

17/01/2021
<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Резистори 0,250 Вт

Резистори 0,250 Вт

Мініатюрні резистори різних номіналів з точністю +-1%. Товщина виводів добре підходить під стандартн..

0.57грн.

Плата ESP32 (ESP-32)

Плата ESP32 (ESP-32)

Плата WiFi та Bluetooth контролера ESP-32 з програматором CP2102На платі вже встановлено у..

189.39грн.

Драйвер крокового двигуна RAMPS 1.4 для CNC або 3D-принтера

Драйвер крокового двигуна RAMPS 1.4 для CNC або 3D-принтера

Драйвер A4988 під шилд RAMPS 1.4Є можливість налаштовувати робочий струм двигуна за допомогою з..

40.32грн.

RFID брелок 13,56 МГц

RFID брелок 13,56 МГц

Самий розповсюджений безконтактний RFID брелок для ідентифікації людини або в якості ключа від ..

13.56грн.

Цифровий датчик температури та вологості DHT11

Цифровий датчик температури та вологості DHT11

Вимірювання відносної вологості в межах 20 ... 90 %Точність вимірювання вологості ± 5,0 %RHВимірюван..

27.01грн.