RSS блога
Подписка
16-ти канальный светодиодный драйвер TLC5940 - чтобы на даче было светло и комфортно
- Цена: $8.45 за 10 штук
- Перейти в магазин
Как и обещал, поделюсь еще одной поделкой для комфортной жизни в дачных условиях. Многие за эту зиму запаслись светодиодными лентами, светодиодами и прочим осветительным оборудованием по различным акциям. Конечно, я не исключение, и коробочка с подобными штуками ждет дачного сезона (некоторые из них я уже тут обозревал). Оставался открытым вопрос управления всем этим делом. В этот раз будем конструировать устройство для управления несколькими мощными светодиодными источниками света. Под катом разработка устройства на микроконтроллере с применением предмета обзора.
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 заменить:
на
Ну а теперь перейдем к самой интересной 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 каналов с винтовыми клемниками, транзисторными сборками и обвеса к ним (проверял на одном канале). Загружал первую программу тестирования:
Данный код раз в секунду включает и выключает все выводы. Нехитрое видео с лампой на 1А (про нее я рассказывал в одном из новогодних обзоров):
Подключим к осциллографу:
Видим ряд импульсов с периодом 2с, заполнение 1с, напряжение соответствует 12V.
Передний фронт вполне норм.
Задний немного завален.
В данном конкретном случае это совсем не критично.
Затем тестировал связку сетевого модуля и управления светодиодами:
Здесь нам уже потребуется библиотека для работы с сетевым модулем enc28j60. Программа очень простая, но тестирует все возможности данной платы, позволяя включать и выключать любой источник света через сетевое соединение.
Законченную программу я буду писать по месту, решив что и как я хочу делать, в частности, на лом пойдет логика управления описанная в этом обзоре. Но на основе простых приведенных примеров, думаю, каждый сможет построить решение для своей задачи со светом. Конечно, кто-то разочаровался отсутствием «Вау эффектов» — которые на данной плате легко реализовать программно, я их обязательно реализую, в каждом конкретном случае свои, если будет интерес, выложу код и сниму видео. Просто не хочется делать бесполезную тестовую работу, библиотека очень хорошо описана и написать соответствующие программы для многих не составит труда.
Мне полученное решение очень понравилось, и на следующий вечер я изготовил дополнительно еще 3 платы (слегка модифицировал изначальную), например, перенеся кнопку на другую сторону. По ссылке в обзоре доступна уже модифицированная версия. Получилось как-то так:
Единственное, на новых платах не хватает сборок полевых транзисторов, так как личные запасы кончились, а в местных магазинах они стоят неадекватных денег — теперь дождусь посылку и припаяю.
Конечно можно было заказать платы в Китае, это сейчас модно, но несколько штук для себя я в состоянии изготовить за вечер, полученное качество меня вполне устраивает, а стоимость заготовки порядка 30 рублей (менее 0.5$)… Тут уж каждый делает выбор сам.
Планирую реализовать с помощью данных плат освещение на веранде дома, веранде бани, сделать подсветку лестницы (причем управляемую по сети — например завязанную на сигнализацию) и, наверное, освещение в сарае, туалете, поленнице (у меня это один комплекс).
На этом заканчиваю. Спасибо тем кто дочитал до конца, надеюсь кому-то информация окажется полезной! Если заинтересует, опишу еще парочку новых «дачных разработок».
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[NETWORK_BUFFER_SIZE]; // 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)[n]){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[7]);
if(cm>=0 && cm<NumberLEDs) {
Tlc.set(cm, 4095);
Tlc.update();
MC[cm].On = 1;
}
homePage(EtherBufferFiller);
// off
}else if (strncmp("GET /?d", data, 7) == 0){
// get number active motor
byte cm = atoi(&data[7]);
if(cm>=0 && cm<NumberLEDs) {
Tlc.set(cm, 0);
Tlc.update();
MC[cm].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[i].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$)… Тут уж каждый делает выбор сам.
Планирую реализовать с помощью данных плат освещение на веранде дома, веранде бани, сделать подсветку лестницы (причем управляемую по сети — например завязанную на сигнализацию) и, наверное, освещение в сарае, туалете, поленнице (у меня это один комплекс).
На этом заканчиваю. Спасибо тем кто дочитал до конца, надеюсь кому-то информация окажется полезной! Если заинтересует, опишу еще парочку новых «дачных разработок».
Хищник обнюхал устройство и многозначительно отвернулся
Самые обсуждаемые обзоры
+71 |
3340
133
|
+51 |
3545
66
|
+29 |
2535
47
|
+38 |
2871
41
|
+55 |
2043
37
|
вот теперь думаю с чего начать))
подумалось, что что-то гидропонное 8))
Жду с нетерпением следующих обзоров дачных самоделок.
эти устройства делал практически лежа, перевернулся на снегоходе и немного повредил спину, сейчас период реабилитации
И рад, что у вас не было попыток сочинить даташит на микруху. Все ровно и чинно…
на самом деле — больше значит правильный утюг, я не нарадуюсь, когда привез с чердака дачи советский тяжелый:
им и не пользовались года с 2000-го, даже на даче
а с таким текстолитом — не уверен что хорошо выйдет — механическая прочность ему важна
хотя… вот у меня один принтер не печатает на этой специальной желтой бумаге и она лежала мертвым грузом… когда привез с дачи другой принтер и он на ней начал печатать — проверил — получилось отлично, и желание вести эксперименты дальше не возникает. Если все хорошенько прогладить — то дефектов нет
а не смогут ли по spi работать вместе enc и Tlc? там же выборка есть cs.
пока будут меняться данные на tlc — вы не сможете управлять устройством
не просто мне даются такие обзоры большие
при 5 вольтах с ними не хорошо
и сопряжения все + мне часто нужна проводная сеть
Yurok, у вас данные все на сервер заводятся или прямое управление отсылкой команд с телефона или устройств?
маленькие светодиоды можно подключать к микросхеме из обзора — она способна ограничивать ток от 5 до 120 мА. Если нужен больший ток и стоят полевики — то о токе нужно иными способами думать
Открыл для себя SoftPWM хоть на все выводы контроллера. Теперь в расширителях особой надобности не вижу
там написано 17 Вольт
не поделитесь инфой что с ней делали?
К сожалению или к счастью выводы контроллера нужны и для других целей — и ресурсы например при подключении к локальной сети резко расходуются… так что решение имеет рправо на жизнь — нужно выбирать от конкретных условий
на даче большая веранда 8 — светильников — все уже заведены в щиток + настольная лампа + требуется лампа над вторым столом + освещение 4-х ниш — вот и все — все порты будут заняты
в бане примерно та же история
12 Вольт тянуть на расстояние 5-7 метров это нормально, в квартире наверное нецелесообразно, хотя смотря какое освещение
ну я посмотрел, где упоминается данная микросхема.
Я специально постарался вывести несколько пинов контроллера — в обзоре это есть, как раз для подключения датчиков и прочего — для локальной реакции на события, у меня и сейчас на веранде стоят датчики движения и освещенности (такая операция как включение света в общем случае не требует обращения к центральным узлам). По сети например можно отключить локальную реакцию или модифицировать ее (такое во всех моих поделках реализовано — эта не исключение). И система управления водой в бане работает локально — но можно ее поведение изменить вмешавшись через сеть.
Конкретно в этом случае не требуется дробления, а так да, возможно скоро напишу про мелкие решения на слабых контроллерах, компактные для одного двух действий.
У Вас там прям заказ плат на производстве — все серьезно.
Как-то, видимо, пропустил. Это очень мудрое решение. Кстати, Вы полностью довольны PIR модулями как полной заменой выключателей? Пытаюсь найти приемлемое решение, чтобы отказаться от выключателей полностью.
я, если честно, не вижу большого смысла в таком модуле, в 99% случаев хватает 328 атмеги, а там где не хватает — я предпочту роутер на линуксе. Мне больше нравится прям в поделку впаять контроллер — не вижу смысла его делать съемным.
на веранде — полностью доволен — ни разу не выключился свет — я тут реализацию уже описывал, в доме выключатели сподручнее, на веранде было пару раз чуть стемнело а свет нужен был яркий — ну я спокойно включал с телефона — этот функционал то остался. Заменить в доме и квартире выключатели на датчики не готов. Везде поставил ливоловские выключатели и контроллер с передатчиком на 433 MHz — очень удобно
P.S. Судя по всему нужно уменьшать номинал конденсатора…
Подскажите Вы решили эту проблему7
и тогда мосфет открывался не от 5в а от 12в и сопротивление было бы значительно меньше у канала
из минусов только стрёмный выход под Р канал и подключение через спи
вот РСА9685 куда круче
работа с Н каналом и подключение по айтуси но огромный минус это на выходах питание максимум 6в можно снять но это в любом случае намного лучне чем просто шимить от есп32 с её 3,3в на открытие либо ставить драйвера 4422 на вольтдобавку что очень не хочтся