Опубликовано

С 2004 схема подключения

Описание микросхемы tlc5940

микросхема TLC594

Из статьи вы узнаете, как подключить ШИМ генератор TLC5940 в качестве драйвера светодиодов к Ардуино, как подключить несколько драйверов в цепочке и как управлять ими с помощью библиотеки tlc5940. Также рассказано, как освободить SPI выводы Arduino, занимаемые микросхемой при стандартном подключении. Для повторения схемы, рассмотренной в статье, вам понадобятся: любой контроллер arduino (в статье используется Nano в качестве примера), макетная плата, соединительные провода, набор перемычек (желательно), как минимум один светодиодный драйвер, на каждый драйвер потребуется 16 светодиодов, резисторы на 2 кОм и на 10 кОм.

Купить микросхему у проверенного мной продавца можно или сразу десяток со скидкой

Микросхема драйвера имеет по 14 выводов с каждой стороны. С одной стороны корпуса можно заметить небольшую выемку. Расположите микросхему этой выемкой вправо и установите на макетной плате. Лучше установить её на краю макетки. Но у нас на макетной плате расположена ещё и Arduino Nano. Если драйвер расположен выемкой вправо, то нумерация выводов начинается с левого нижнего и идет слева-направо, затем наверх и справа налево (против часовой стрелки). То есть левый нижний вывод — первый, левый верхний — двадцать восьмой. Более наглядно на фото:

Драйвер светодиодов TLC5940

Подключение микросхемы tlc5940 к arduino

Подключите выводы драйвера к arduino в следующем порядке:

19 и 21 выводы подключаются к рельсе питания +5В (на фото жёлтые перемычки)
22 и 27 выводы подключаются к рельсе земли (белые перемычки)
18 вывод соединяется с 3 цифровым выводом Arduino (белая перемычка)
24 вывод соединяется с 9 цифровым выводом Arduino (белая перемычка)
23 вывод соединяется с 10 цифровым выводом Arduino (зелёный провод)
23 вывод дополнительно соединяется через подтягивающий резистор 10 кОм к рельсе питания, что бы при включении драйвера все светодиоды были погашены.
26 вывод соединяется с 11 цифровым выводом Arduino (оранжевый провод)
25 вывод соединяется с 13 цифровым выводом Arduino (синий провод)
20 вывод нужно через резистор 2 кОм соединить с землёй. Таким способом мы ограничим ток на выводах для подключения светодиодов 20 мА. Рассчитывается этот резистор по формуле: R = 39.06 / I (в Амперах). Максимальный ток составляет 120мА на канал.

Подключение самого драйвера окончено. Соедините перемычками рельсы питания и земли с соответствующими выводами Arduino. Примерно вот так это должно выглядеть:

TLC5940 установлен на макетную плату а подключён к контроллеру

Рисунок для тех, кому это кажется более наглядным:

Подключение драйвера светодиодов TLC5940. Показан только один подключённый светодиод, чтобы не загромождать рисунок.

Теперь подключаем светодиоды по порядку к управляемым выводам драйвера. 28 вывод — это нулевой светодиод (OUT0), далее с первого по пятнадцатый номер вывода совпадает с номером светодиода (первый вывод — OUT1, второй — OUT2 … пятнадцатый — OUT15). Драйвер управляет землёй, а не питанием. Поэтому, светодиоды подключаются к выводам драйвера катодами.

Устанавливаем на макетку светодиоды. OUT0 и OUT15 соединены с катодами перемычками:

TLC5940 и 16 светодиодов

Для работы с драйвером нужно скачать библиотеку Tlc5940. Распакуйте содержимое архива в папку с файлами среды arduino IDE в папку libraries. Загрузите в контроллер следующий код:

C++

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <Tlc5940.h>; void setup() { //Инициализируем драйвер Tlc.init(); } void loop() { //Устанавливаем нулевую яркость всех светодиодов Tlc.clear(); //Для каждого из 16 каналов: for (int channel = 0; channel < 16; channel += 1) { //Устанавливаем максимальную яркость Tlc.set(channel, 4094); } //Применяем изменения (зажигаем светодиоды) Tlc.update(); }

После загрузки скетча все светодиоды должны засветиться с максимальной яркостью. В этом скетче хорошо виден принцип управления драйвером. Первым делом должна быть вызвана функция Tlc.init(), которая произведёт инициализацию микросхемы или микросхем, если у нас их подключено несколько. Переменная NUM_TLCS, равняется количеству микросхем, подключённых в цепочке (об этом ниже). Обратите внимание, что автоматически количество драйверов в цепочке не определяется и задаётся вручную в файле библиотеки Tlc5940/tlc_config.h в строке 55. Tlc.clear() вызывается для установки яркости всех каналов в ноль (т.е. для выключения всех светодиодов). Tlc.set() устанавливает яркость светодиода. Функция принимает номер канала (нумерация начинается с нуля, как уже упоминалось) и уровень яркости (фактически, скважность ШИМ). Уровни яркости изменяются от 0 до 4095. Наконец, функция Tlc.update() фактически устанавливает яркость. До вызова этой функции изменения не вступят в силу.

Теперь усложним пример. Запустим «бегущий огонь». Загрузите вот этот скетч (он есть в стандартных примерах библиотеки и называется BasicUse):

C++

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 #include <Tlc5940.h>; void setup() { //Инициализируем драйвер Tlc.init(); } void loop() { int direction = 1; //Обратите внимание, на использование переменной NUM_TLCS. //Если умножить её на 16, то мы получим число выводов //На всех драйверах подключённых цепочкой //Таким образом, OUT0 второго драйвера будет 16 каналом //OUT0 третьего будет 32 каналом и т.д. for (int channel = 0; channel < NUM_TLCS*16; channel += direction) { //Гасим выводы: Tlc.clear(); //Устанавливаем яркость в зависимости от направления волны if (channel == 0) { direction = 1; } else { Tlc.set(channel — 1, 1000); } Tlc.set(channel, 4095); if (channel != NUM_TLCS * 16 — 1) { Tlc.set(channel + 1, 1000); } else { direction = -1; } //Применяем изменения Tlc.update(); delay(75); } }

После загрузки скетча, вы увидите нечто подобное:

Драйвер светодиодов TLC5940 с шестнадцатью подключёнными светодиодами.

Теперь установите второй драйвер рядом с первым. Лучше оставить промежуток между микросхемами. иначе вы намучаетесь потом, снимая их с макетной платы. Все выводы второго драйвера подключаются параллельно выводам первого (просто соедините их проводами или перемычками), кроме 26 вывода. 26 (SIN) вывод второго драйвера должен соединяться с 17 выводом (SOUT) первого. Теперь в папке с библиотекой откройте файл Tlc5940/tlc_config.h, найдите 55 строку и замените

C++

1 #define NUM_TLCS 1

на

C++

1 #define NUM_TLCS 2

Это позволит без правки кода скетча адаптировать код программы для разного количества драйверов. Честно говоря, у автора статьи возникают сомнения, что этот подход удобнее правки кода скетча, но оставим всё так, как задумано авторами библиотеки.
После подключения ещё 16 светодиодов ко второму драйверу, перезалейте скетч в контроллер, чтобы изменения, внесённые нами в библиотеку, применились, и наблюдайте:

Драйвер светодиодов TLC5940 с тридцатью двумя подключёнными светодиодами. Светодиоды второго драйвера не удалось выстроить в ряд, и линия светодиодов «завалена».

Решение проблемы с SPI

Вариант подключения по умолчанию, рассмотренный выше — использует интерфейс SPI. Особенности библиотеки Tlc5940 не позволяют подключать к arduino одновременно с драйвером другие модули, использующие интерфейс SPI. Например, беспроводной модуль подключить уже не получится. Авторы библиотеки предлагают в качестве решения проблемы использовать другой интерфейс драйвера «bitbang». Он сравнительно медленнее SPI, но это проявляется только на действительно огромном количестве микросхем, соединённых в цепочку. Для использования интерфейса bitbang нужно в папке с библиотекой открыть файл Tlc5940/tlc_config.h и в строке 45 заменить

C++

1 #define DATA_TRANSFER_MODE TLC_SPI

на

C++

1 #define DATA_TRANSFER_MODE TLC_BITBANG

и переключить выводы драйвера:

25 вывод соединить с 4 цифровым выводом Arduino
26 вывод соединить с 7 цифровым выводом Arduino

Теперь библиотека драйвера не занимает SPI интерфейс, а сам драйвер полностью сохранил свою функциональность.

Напоминаю, микросхему у проверенного лично мной продавца можно или сразу десяток со скидкой . Ну а полный список товаров, которые я заказал и убедился в их качестве по ссылке: Где всё это купить?

16-ти канальный светодиодный драйвер TLC5940 — чтобы на даче было светло и комфортно

Как и обещал, поделюсь еще одной поделкой для комфортной жизни в дачных условиях. Многие за эту зиму запаслись светодиодными лентами, светодиодами и прочим осветительным оборудованием по различным акциям. Конечно, я не исключение, и коробочка с подобными штуками ждет дачного сезона (некоторые из них я уже тут обозревал). Оставался открытым вопрос управления всем этим делом. В этот раз будем конструировать устройство для управления несколькими мощными светодиодными источниками света. Под катом разработка устройства на микроконтроллере с применением предмета обзора.
TLC5940 16-ти канальный драйвер светодиодов, поддерживает аппаратный 12 битный ШИМ, имеющий 4096 градаций яркости для каждого канала независимо. Согласно datasheet, драйвер умеет ограничивать ток в диапазоне 0-120 mA. Поддерживает питание источников до 17V, а сама микросхема способна питаться от 3 до 5.5V. Микросхема имеет последовательный интерфейс, поддерживает передачу данных с частотой до 30 MHz. Также она умеет выдавать информацию о ошибках в работе на соответствующие выводы. Микросхема выпускается в 3-х корпусах: PDIP (28) 35.69 mm × 6.73 mm, HTSSOP (28) 9.70 mm × 4.40 mm и VQFN (32) 5.00 mm × 5.00 mm. В данном обзоре рассмотрим PDIP версию.
Обозначения выводов:

Их назначение:
OUT0-OUT15 — подключение светодиодной нагрузки;
VCC и GND — питание микросхемы
SIN — вход даных
SCLK — тактовый сигнал данных (максимальная частота тактовых импульсов – 30 МГц)
SOUT — выход данных (для каскадного соединения)
XLAT — сигнал защелкивания данных из сдвиговых регистров
BLANK — обнуление счетчика ШИМ и выключение каналов OUT0-OUT15
GSCLK — тактовый сигнал ШИМ
IREF — ограничение по току для одного канала
XERR — выход для сигналов ошибок
VPRG — задает режим работы (0 – режим ШИМ, 1 – режим коррекции тока каналов)
DCPRG — задает режим работы с данными коррекции тока каналов (0 – EEPROM, 1 – DC Register)
Блок схема микросхемы выглядит таким образом:

Основной принцип работы заключается в следующем: данные последовательно пропихиваются в сдвиговый регистр Input Shift Register. В зависимости от предназначения этих данных (значения ШИМ (GrayScale) или коррекция тока каналов (Dot Correction)) они по приходу сигнала XLAT и состояния VPRG записываются в регистры ШИМ (GS Register) или коррекции тока каналов (DC Register). Далее ШИМ-контроллер заземляет или отключает от земли свой вывод OUTn. То есть микросхема работает со светодиодами по схеме общего анода, что не всегда удобно.
Микросхема TLC5940 позволяет ограничить максимальный выходной ток ШИМ-каналов с помощью резистора, который тянет вывод IREF к земле. Номинал резистора между IREF и землей выбирается согласно графику:

В частности, для 20 mA (обычные светодиоды) требуется резистор на 2 kOhm. Также, значение этого резистора можно посчитать исходя из формулы:
Imax = V(IREF) × 31.5 / R(IREF), где V(IREF) = 1.24V — опорное напряжение, Imax (5-120 mA) — максимальный ток одного выходного канала, R(IREF) — искомое сопротивление.
Тут есть (как обычно) один нюанс: когда мы работаем со светодиодами разных цветов, то, как правило, номинальный ток не одинаковый. Если мы будем ограничивать ток диодов одним значением, передача цвета исказится. Для устранения проблемы можно использовать 64-ступенчастую коррекцию тока канала (Dot Correction) – на каждый канал приходится по 6 бит (96 бит на все каналы). Предел коррекции тока – от 0% до 100%. В режим коррекции тока канала можно войти подняв вывод VPRG к напряжению питания. Начинаем отправку со старшего бита 15-го канала и заканчиваем младшим битом 0-го канала запись осуществляется по нарастанию тактового импульса SCLK. Когда все 96 бит прошли, защелкиваем их в регистры DC Register импульсом на XLAT.
К счастью, большинство низкоуровневых моментов реализуется в специальных библиотеках.
Возможно каскадное соединение микросхем:

Для Arduino есть библиотека скрывающая все низкоуровневые хитрости микросхемы и делающая управление светодиодами с помощью драйвера TLC5940 максимально простым. Далее мы рассматриваем типовое (простое) подключение драйвера, с ограничением тока выхода в 20 mA. Предупрежу сразу, перенос пинов в библиотеке возможен только двух SIN(26) и SCLK(25) и то в режиме BITBANG, остальные используют специфические возможности конкретных пинов.
Подключить данный драйвер к Arduino можно двумя способами, первый наиболее производительный, но отнимающий шину SPI (а соответственно большинство коммуникативных возможностей контроллера), второй менее производительный, но достаточный для большинства задач, не требующий SPI — называется BITBANG.
Рассмотрим схему подключения к Arduino (первый вариант, отнимающий SPI):
DCPRG(19) и VCC(21) подключаются к +5V
GND(22) и VPRG(27) подключаются к земле
GSCLK(18) соединяется с 3 цифровым выводом Arduino
XLAT(24) соединяется с 9 цифровым выводом Arduino
BLANK(23) соединяется с 10 цифровым выводом Arduino, этот вывод подтягивается резистором 10 кОм к +5V, чтобы погасить диоды при включении питания
IREF(20) через резистор 2 кОм соединяется с землёй
SIN(26) соединяется с 11 цифровым выводом Arduino
SCLK(25) соединяется с 13 цифровым выводом Arduino
Во втором (BITBANG) варианте необходимо:
SIN(26) соединить с 7 цифровым выводом Arduino
SCLK(25) соединить с 4 цифровым выводом Arduino
Помимо этого в папке с библиотекой, в файле tlc_config.h заменить:

#define DATA_TRANSFER_MODE TLC_SPI
на
#define DATA_TRANSFER_MODE TLC_BITBANG
Ну а теперь перейдем к самой интересной DIY части, с поделками и реальными штуками + программами 🙂
На mysku уже было описание проекта с использованием данной микросхемы. Однако выбор элементной базы и полученное решение для меня не являются подходящими. В том обзоре существенно больше философских выводов, чем в этом, но я не считаю что это недостаток читаемого вами обзора.
Поэтому сформулируем требования к нашему устройству:
— устройство должно управляться через локальную сеть (на даче везде она имеется с соответствующими коммутаторами);
— устройство должно управлять не менее чем 10-ю источниками света;
— каждый источник потенциально должен уметь потреблять до 4А при 12V;
— устройство должно иметь не менее 5 выводов (лучше аналоговых, которые можно использовать как цифровые) для подключения дополнительных датчиков (освещенность, датчик движения и тп);
— необходимо иметь возможность управления всеми источниками независимо;
— ШИМ и управление яркостью должно быть доступно для каждого источника света:
— детали должны быть доступны, самих деталей минимальное количество, цена приемлемая для обычного дачника;
— устройство должно уметь собираться в домашних условиях, даже кривыми руками (типа моих).
Основные требования ясны, теперь подходы к решению.
Дешево и достаточно эффективно снабдить устройство сетевым интерфейсом можно за счет использования модуля ENC28J60, дороже но более эффективно W5100. Чтобы выполнить требования по количеству и яркости нам потребуется предмет обзора (конечно сейчас бы я купил их в планарном исполнении, но в дип — они уже есть, поэтому будем использовать их). Остался нерешенным вопрос с выходной мощностью, при том, что TLC5940 предусматривает схему с общим анодом. Нам нужно компактное устройство управляющее достаточно большим током при напряжении 12V, причем открываемое нулевым сигналом (нам ведь совсем не нужны дополнительные инверторы).
Вся современная цифровая электроника построена, в основном, на полевых МОП (метал-оксид-полупроводник) транзисторах, как более экономичных, по сравнению с биполярными транзисторами. Иногда МОП-транзисторы называют МДП (металл-диэлектрик-полупроводник). Международный термин таких транзисторов — MOSFET (metal-oxide-semiconductor field effect transistor). Существуют два типа MOSFET транзисторов n-канальные и p-канальные. Наиболее распространены n-канальные транзисторы, из-за простоты подключения и, как следствие, массовости производства. Однако в нашем случае лучше подходят p-канальные, так как TLC5940 рассчитана на подключение по схеме с общим анодом.
Схема подключения к TLC5940 p-канального транзистора будет следующей (на примере двух):

Приведенные на схеме IRF7314 выпускаются как сборка состоящая из двух полевых p-канальных транзисторов (datasheet).

Основные характеристики: Напряжение (Vdss) 20V, Ток 5.3A, сопротивление сток-исток: 58 mOhm, корпус SO-8. Такие характеристики нас более чем устраивают.
Схема (достаточно условно и не на конкурс, но кому нужно думаю все поймут):

Питание по входу фильтруется электролитическим конденсатором на 470mF. Из 12V с помощью понижающего dc-dc преобразователя (на ШИМ схеме cn1584) получается 5V, которые также фильтруются электролитом на 470 mF, указанная плата на входе и выходе уже имеет керамические конденсаторы. 5V используются для питания контроллера и микросхемы TLC5940. Модуль связи требует для питания 3.3V, которые формируются из 5 линейным стабилизатором ams1117 на 3.3V, после стабилизатора также стоит электролит на 470 mF и добавляется керамика на 100nF.
В качестве контроллера я использовал ATmega328 в корпусе tqfp32 с внешним кварцевым резонатором (16 MHz), от которого работает встроенный в микроконтроллер генератор. Оба вывода кварца соединяются с землей через конденсаторы на 22pF. V+ и GND соединяются керамическим конденсатором в 100 nF возле самого контроллера. RESET подтянут к питанию резистором в 10kOhm. Для загрузки программ Serial (TX, RX), RESET, +V и GND выведены на отдельные 5 пинов — обозначены как J1. Кнопка S1 позволяет соединять RESET и GND (нужно при заливке скетчей и для перезагрузки устройства).
Сопряжение с сетью обеспечивает модуль ENC28J60, который имеет одинаковую распиновку с модулем W5100, и, соответственно, с легкостью может быть заменен (я даже сделал его съемным, что позволит в дальнейшем использовать для связи любой SPI модуль: Nrf24L01, W5100, W5500, ENC28J60 — в зависимости от конкретных потребностей).
В качестве драйвера открывающего сборки полевых транзисторов — предмет обзора (конечно в режиме BITBANG — ведь SPI нам нужен для связи). В данном случае задействовано 14 выводов микросхемы. Неиспользуемые 2 вывода согласно документации соединены с землей через резисторы в 10 kOhm. Между землей и IREF подключен резистор в 2 kOhm, обеспечивающий ограничение тока в 20 mA. Вывод BLANK подтянут к питанию резистором в 10 kOhm.
По периметру платы расположились винтовые клемники, обеспечивающие подключение источников света рассчитанных на 12V. Каждый клемник подключен к земле и одному из стоков транзисторной сборки irf7314. На истоки сборки подается 12V. На затвор сборки подается сигнал от TLC5940 через резистор 1 kOhm, также затвор, для закрытия транзистора при отсутствии открывающего сигнала от TLC5940, подтянут к +12V через резистор в 33kOhm зашунтированный керамическим конденсатором в 100 nF.
Дополнительно выведены 7 аналоговых пинов и 1 цифровой. Помимо этого имеются пины +5V, GND, +12V — для удобства подключения дополнительных устройств (пины питания и земли, довольно часто требуются, и один раз столкнувшись с их нехваткой, стараюсь не забывать об этом теперь). Еще один нюанс, я не захотел сверлить под переходы через дорожки и сделал переходы резисторами номиналом 0 Ohm. Надо сказать, что расположение выводов микросхемы TLC5940, в данном случае, оказалось не сильно удачным и таких переходов оказалось довольно много (переназначение пинов не прошло удачно — поэтому оставил как есть).
Печатная плата (фото вид):

Печатная плата (обычный вид):

Да уж, технологический процесс усложнился, но приступим к изготовлению.
Термотрансфером (грубо говоря, утюгом через бумажку — ЛУТ) перенесли рисунок платы на текстолит:

Лудим (на фотке как будто кривовато вышло, на самом деле все ровно и красиво 🙂 — обман зрения):

Напаиваем компоненты (рекомендую сразу прозвонить критические участки):

Сторона элементов:

Со вставленным сетевым модулем:

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


По моему, получилось вполне красиво (на мой криворукий взгляд 🙂 ), все удалось уместить на плате 7 на 10 см — что меня очень даже устраивает.
Если кто-то хочет повторить — вот файл платы.
Контроллеры еще до пайки к плате (отчасти, чтобы убедится, что с ними до процесса все в порядке) я прошил с помощью адаптера, рассмотренного мной ранее. Паял SMD компоненты в держателе для плат, который описал . Если кто то забыл поставить там ‘+’, сейчас это сделать самое время 🙂 — шучу конечно. Паял феном на паяльную пасту. Флюс использовал KINGBO RMA-218. Как видите, все это вполне пригодно для получения дачных поделок. При пайке таких маленьких деталек в большом количестве, нужно тщательно прозванивать схему особенно на предмет появления контакта там где его не должно быть, иначе есть риски получить волшебный дым.
Итого, для построения этого замечательного устройства требуются:
— контроллер ATmega328 в корпусе tqfp32 — 1 шт;
— кварц на 16 MHz — 1 шт;
— светодиодный драйвер Tlc5940 в корпусе dip28 — 1 шт;
— dc-dc преобразователь cn1584 — 1 шт;
— сборка из двух p-канальных MOSFET irf7314 (или аналоги под ваш ток и напряжение) в корпусе so8 — 7 шт;
— линейный стабилизатор ams1117 (3.3V) в корпусе sot223 — 1 шт;
— сетевой модуль enc28j60 mini либо w5100 — 1 шт;
— конденсатор электролитический 470 mF (25V) — 3 шт;
— конденсатор керамический smd1206 100nF — 16шт;
— конденсатор керамический smd1206 22pF — 2шт;
— резистор smd1206 10kOhm — 4шт;
— резистор smd1206 33kOhm — 14шт;
— резистор smd1206 1kOhm — 14шт;
— резистор smd1206 2kOhm — 1шт;
— резистор smd1206 0Ohm — 10шт;
— клемники винтовые 2pin — 14 шт (либо собрать из 3pin и 2 pin);
— разъем питания 2.1 x 5.5 мама — 1 шт;
— штыри лучше разных 5 цветов по одной линейке;
— разъемы типа мама 2.54 — 2 по 6 или один двойной по 6 пинов;
— кнопка 6.3 на 6.3 мм — 1 шт;
— фольгированный текстолит 10 на 7 см — 1 шт.
Ну и конечно паяльный инструмент, флюс и материалы для ЛУТ.
И, самое главное, хорошее настроение и желание получить готовое устройство.
Переходим к программной части.
Первым делом, припаяв контроллер и обвес для него, я загружал blink, чтобы проверить что с ним все в порядке (код тут не привожу он стандартный в примерах среды Arduino). Потом переходил к дальнейшей пайке. Собрав всю схему, кроме 13 каналов с винтовыми клемниками, транзисторными сборками и обвеса к ним (проверял на одном канале). Загружал первую программу тестирования:
#include «Tlc5940.h» void setup() { Tlc.init(); } unsigned int br = 4095; void loop() { for (byte i=0; i<16; i++){ Tlc.set(i, br); } Tlc.update(); delay(1000); if (br==0) br = 4095; else br=0; }
Данный код раз в секунду включает и выключает все выводы. Нехитрое видео с лампой на 1А (про нее я рассказывал в одном из новогодних обзоров):

Подключим к осциллографу:

Видим ряд импульсов с периодом 2с, заполнение 1с, напряжение соответствует 12V.

Передний фронт вполне норм.

Задний немного завален.
В данном конкретном случае это совсем не критично.
Затем тестировал связку сетевого модуля и управления светодиодами:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // yurok (last change 4.04.2016) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <EtherCard.h> #include <Tlc5940.h> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PIN configuration //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define ETHERNET_PIN 5 #define ETHERNET_RST_PIN 20 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // set constants //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// comment for disable #define SERIAL 1 // buffer size for get and send network messages #define NETWORK_BUFFER_SIZE 850 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Network configuration //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ethernet mac address — must be unique on your network static byte mymac = { 0x74,0x69,0x69,0x2D,0x30,0x34 }; // ethernet interface ip address static byte myip = { 192,168,1,42 }; static byte gwip = { 192,168,1,1 }; static byte dnsip = { 192,168,1,1 }; static byte mymask = { 255,255,255,0 }; byte Ethernet::buffer; // tcp/ip send and receive buffer BufferFiller EtherBufferFiller; // prepare the webpage by writing the data to the tcp send buffer //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Other global setup //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // for count motors template<typename T, size_t n> inline size_t arraySize(const T (&arr)){return n;} const char HTTP_BEGIN PROGMEM = «HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n<html><title>LED</title>»; const char HTTP_END PROGMEM = «<p><a href=/>refresh</a></p></html>»; // global time unsigned long CurrentTime = 0; // in setup set count of LEDs byte NumberLEDs = 0; // type LED typedef struct { byte On; // state } LedType; // all led: LedType MC = { {0}, //0 {0}, //1 {0}, //2 {0}, //3 {0}, //4 {0}, //5 {0}, //6 {0}, //7 {0}, //8 {0}, //9 {0}, //10 {0}, //11 {0}, //12 {0}, //13 }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // init //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setup(){ #ifdef SERIAL Serial.begin(57600); #endif // Ethernet init if(ether.begin(sizeof Ethernet::buffer, mymac, ETHERNET_PIN) == 0){ #ifdef SERIAL Serial.println( «Failed to access Ethernet controller»); #endif exit(0); }else{ #ifdef SERIAL Serial.println( «Ethernet controller ok»); #endif }; digitalWrite(ETHERNET_RST_PIN, LOW); delay(20); digitalWrite(ETHERNET_RST_PIN, HIGH); ether.staticSetup(myip, gwip, dnsip, mymask); #ifdef SERIAL ether.printIp(«IP: «, ether.myip); ether.printIp(«GW: «, ether.gwip); ether.printIp(«DNS: «, ether.dnsip); ether.printIp(«SRV: «, ether.hisip); #endif NumberLEDs = arraySize(MC); Tlc.init(); delay(1); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // main loop //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop(){ CurrentTime = millis(); unsigned int len = ether.packetReceive(); unsigned int pos = ether.packetLoop(len); if (pos) { // check if valid tcp data is received EtherBufferFiller = ether.tcpOffset(); char* data = (char *) Ethernet::buffer + pos; #ifdef SERIAL Serial.println(data); #endif ////////////////////////////////////////////////////////////////////////// // LEDS ////////////////////////////////////////////////////////////////////////// // on if (strncmp(«GET /?e», data, 7) == 0){ // get number active motor byte cm = atoi(&data); if(cm>=0 && cm<NumberLEDs) { Tlc.set(cm, 4095); Tlc.update(); MC.On = 1; } homePage(EtherBufferFiller); // off }else if (strncmp(«GET /?d», data, 7) == 0){ // get number active motor byte cm = atoi(&data); if(cm>=0 && cm<NumberLEDs) { Tlc.set(cm, 0); Tlc.update(); MC.On = 0; } homePage(EtherBufferFiller); ////////////////////////////////////////////////////////////////////////// // Default reaction for reply ////////////////////////////////////////////////////////////////////////// }else{ homePage(EtherBufferFiller); } } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Web server main page //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static void homePage(BufferFiller& buf) { EtherBufferFiller = ether.tcpOffset(); EtherBufferFiller.emit_p(PSTR(«$F»), HTTP_BEGIN); // print state and control button for each LED for (byte i=0; i<NumberLEDs; i++){ EtherBufferFiller.emit_p( PSTR(«$D ($F) <a href=/?e$D>e</a> <a href=/?d$D>d</a> «), i, MC.On==0?PSTR(«d»):PSTR(«e»), i, i ); } EtherBufferFiller.emit_p(PSTR(«$F»), HTTP_END); ether.httpServerReply(EtherBufferFiller.position()); // send web page data } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здесь нам уже потребуется библиотека для работы с сетевым модулем enc28j60. Программа очень простая, но тестирует все возможности данной платы, позволяя включать и выключать любой источник света через сетевое соединение.
Законченную программу я буду писать по месту, решив что и как я хочу делать, в частности, на лом пойдет логика управления описанная в этом обзоре. Но на основе простых приведенных примеров, думаю, каждый сможет построить решение для своей задачи со светом. Конечно, кто-то разочаровался отсутствием «Вау эффектов» — которые на данной плате легко реализовать программно, я их обязательно реализую, в каждом конкретном случае свои, если будет интерес, выложу код и сниму видео. Просто не хочется делать бесполезную тестовую работу, библиотека очень хорошо описана и написать соответствующие программы для многих не составит труда.
Мне полученное решение очень понравилось, и на следующий вечер я изготовил дополнительно еще 3 платы (слегка модифицировал изначальную), например, перенеся кнопку на другую сторону. По ссылке в обзоре доступна уже модифицированная версия. Получилось как-то так:


Единственное, на новых платах не хватает сборок полевых транзисторов, так как личные запасы кончились, а в местных магазинах они стоят неадекватных денег — теперь дождусь посылку и припаяю.
Конечно можно было заказать платы в Китае, это сейчас модно, но несколько штук для себя я в состоянии изготовить за вечер, полученное качество меня вполне устраивает, а стоимость заготовки порядка 30 рублей (менее 0.5$)… Тут уж каждый делает выбор сам.
Планирую реализовать с помощью данных плат освещение на веранде дома, веранде бани, сделать подсветку лестницы (причем управляемую по сети — например завязанную на сигнализацию) и, наверное, освещение в сарае, туалете, поленнице (у меня это один комплекс).
На этом заканчиваю. Спасибо тем кто дочитал до конца, надеюсь кому-то информация окажется полезной! Если заинтересует, опишу еще парочку новых «дачных разработок».
Хищник обнюхал устройство и многозначительно отвернулся

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *