Чарлиплексинг (Charlieplexing) – это способ управления большим числом светодиодов с помощью использования небольшого числа контактов ввода/вывода. Чарлиплексинг во многом похож на обычную технологию мультиплексирования, однако в нем для значительного уменьшения числа используемых контактов используют трёхзначную логику (высокий уровень, низкий уровень и не подсоединен ни к чему). Цифровые выводы (контакты) большинства современных микроконтроллеров способны использовать подобную логику. Более подробно о чарлиплексинге можно прочитать в соответствующей статье Википедии.
Техника чарлиплексинга была названа по имени ее изобретателя – Чарли Аллена (Charlie Allen), который придумал ее в 1995 году. Примеры использования подобных мультиплексирующих (уплотняющих) технологий на нашем сайте уже рассматривались: в статье про часы на Arduino и 4-х разрядном семисегментном индикаторе и в статье про скроллинг текста на светодиодной матрице 8×8 с помощью Arduino.
Чарлиплексинг позволяет вам управлять N * (N – 1) светодиодами при использовании N контактов. Например, в этой статье мы рассмотрим управление 12 светодиодами с помощью 4-х контактов платы Arduino – 4*(4-1) =12.
Светодиоды по своей сути представляют собой диоды, а в диодах ток течет только в одном направлении. Таким образом, при использовании способа чарлиплексинга, мы соединяем параллельно два светодиода, но в обратных направлениях – при таком способе их включения мы в выбранный момент времени сможем включить только один из этих светодиодов.
Зачем использовать способ чарлиплексинга? Дело в том, что у платы Arduino достаточно мало свободных контактов (по сравнению с обычными микроконтроллерами) и при проектировании более менее сложных конструкций на Arduino, особенно с использованием ЖК дисплеев, светодиодных матриц и т.д., может возникнуть ситуация с нехваткой свободных контактов для подключения светодиодов. Вот в этом случае и может пригодиться технология чарлиплексинга, позволяющая существенно уменьшить число контактов, используемых для подключения светодиодов.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Светодиоды – 12 шт. (купить на AliExpress).
- Резисторы 330 Ом – 4 шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Схема проекта
Схема проекта для демонстрации технологии чарлиплексинга в плате Arduino представлена на следующем рисунке.
В представленной схеме 12 светодиодов подключены к 4 контактам платы Arduino с помощью светодиодов. К каждому контакту платы Arduino подключено 3 светодиода. Всего в схеме 6 групп светодиодов, по 2 светодиода в каждой группе. При этом в каждой группе светодиоды включены параллельно и встречно друг другу, поэтому в выбранный момент времени можно зажечь только один светодиод из группы.
К примеру, чтобы зажечь 1-й светодиод на представленной схеме, необходимо подать сигнал высокого уровня (HIGH) на контакт A и сигнал низкого уровня (LOW) на контакт B, а контакты C и D в это время должны быть отключенными (находиться в состоянии INPUT). Аналогичную процедуру необходимо проделать и для включения других светодиодов в схеме. Полная схема необходимых состояний контактов для включения светодиодов в нашей схеме показана на следующем рисунке.
После осуществления всех соединений в схеме у нас получилась конструкция, показанная на следующем рисунке. На этом рисунке отчетливо видно 6 групп светодиодов, в каждой группе светодиоды включены встречно друг другу. Питание на плату Arduino подается через USB порт.
Объяснение программы для Arduino
Полный код программы и видео, демонстрирующее работу проекта, приведены в конце статьи, здесь же мы кратко рассмотрим основные фрагменты кода программы.
В самом начале программы определим (дадим осмысленные названия) всем используемым контактам. Также в этой части программы определим общее число светодиодов и состояние светодиода.
1 2 3 4 5 6 7 |
#define A 8 #define B 9 #define C 10 #define D 11 #define PIN_CONFIG 0 #define PIN_STATE 1 #define LED_Num 12 |
После этого создадим матрицу для включения и выключения светодиодов в определенной последовательности – вы можете в программе изменить эту последовательность на ту, которая вам необходима. В соответствии с приведенной матрицей первым будет включаться 1-й светодиод, затем 2-й светодиод и т.д.
1 2 3 4 5 6 7 8 |
int matrix[LED_No.][2][4] = { // PIN_CONFIG PIN_STATE // A B C D A B C D { { OUTPUT, OUTPUT, INPUT, INPUT }, { HIGH, LOW, LOW, LOW } }, { { OUTPUT, OUTPUT, INPUT, INPUT }, { LOW, HIGH, LOW, LOW } }, { { INPUT, OUTPUT, OUTPUT, INPUT }, { LOW, HIGH, LOW, LOW } }, ……………………………. …………………………….. |
Затем в функции void loop() мы будем в цикле последовательно включать светодиоды в соответствии с ранее записанной матрицей.
1 2 3 4 5 |
void loop() { for( int l = 0; l < LED_Num; l++ ) { lightOn( l ); delay( 1000 / LED_Num ); } |
После сборки аппаратной части проекта и загрузки программы в плату Arduino можно приступать к тестированию работы проекта.
Применяя рассмотренный пример использования технологии чарлиплексинга, вы можете подключать к плате Arduino большое количество светодиодов, используя для этого небольшое количество ее контактов. К примеру, если вы хотите управлять 20 светодиодами, то просто измените рассмотренную в данной статье матрицу и добавьте условия для этих дополнительных светодиодов.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#define A 8 #define B 9 #define C 10 #define D 11 #define PIN_CONFIG 0 #define PIN_STATE 1 #define LED_Num 12 int matrix[LED_Num][2][4] = { // PIN_CONFIG PIN_STATE // A B C D A B C D { { OUTPUT, OUTPUT, INPUT, INPUT }, { HIGH, LOW, LOW, LOW } }, { { OUTPUT, OUTPUT, INPUT, INPUT }, { LOW, HIGH, LOW, LOW } }, { { INPUT, OUTPUT, OUTPUT, INPUT }, { LOW, HIGH, LOW, LOW } }, { { INPUT, OUTPUT, OUTPUT, INPUT }, { LOW, LOW, HIGH, LOW } }, { { OUTPUT, INPUT, OUTPUT, INPUT }, { HIGH, LOW, LOW, LOW } }, { { OUTPUT, INPUT, OUTPUT, INPUT }, { LOW, LOW, HIGH, LOW } }, { { OUTPUT, INPUT, INPUT, OUTPUT }, { HIGH, LOW, LOW, LOW } }, { { OUTPUT, INPUT, INPUT, OUTPUT }, { LOW, LOW, LOW, HIGH } }, { { INPUT, OUTPUT, INPUT, OUTPUT }, { LOW, HIGH, LOW, LOW } }, { { INPUT, OUTPUT, INPUT, OUTPUT }, { LOW, LOW, LOW, HIGH } }, { { INPUT, INPUT, OUTPUT, OUTPUT }, { LOW, LOW, HIGH, LOW } }, { { INPUT, INPUT, OUTPUT, OUTPUT }, { LOW, LOW, LOW, HIGH } } }; void lightOn( int led ) { pinMode( A, matrix[led][PIN_CONFIG][0] ); pinMode( B, matrix[led][PIN_CONFIG][1] ); pinMode( C, matrix[led][PIN_CONFIG][2] ); pinMode( D, matrix[led][PIN_CONFIG][3] ); digitalWrite( A, matrix[led][PIN_STATE][0] ); digitalWrite( B, matrix[led][PIN_STATE][1] ); digitalWrite( C, matrix[led][PIN_STATE][2] ); digitalWrite( D, matrix[led][PIN_STATE][3] ); } void setup() {} void loop() { for( int l = 0; l < LED_Num; l++ ) { lightOn( l ); delay( 1000 / LED_Num ); } } |
2 ответа к “Чарлиплексинг (Charlieplexing) в Arduino – управление 12 светодиодами с 4 контактов”
По верхней схеме (с шестью светодиодами)
Не понятно: почему если включить светодиод L5, то не будут гореть L1 и L3 ? и в самом ли деле L1 и L3 не будут в этом случае гореть?
Ну если на Pin 11 подать высокий уровень, а на Pin 13 низкий, то светодиод L5 будет гореть. При этом чтобы L1 и L3 не горели, Pin 12 должен находиться в отключенном состоянии (в состоянии INPUT).