Управление светодиодами ws2813 с адресацией с помощью attiny

საუკეთესო ვიდეოები

404

7 Funny and Useful Beauty Hacks

  • Crafty Panda
  • ნახვები 10 997 315

KILLSHOT [Official Audio]

  • EminemMusic
  • ნახვები 115 516 515

Sen Anlat Karadeniz 22. Bölüm

  • Sen Anlat Karadeniz
  • ნახვები 3 866 366

Söz | 51.Bölüm

  • Söz Dizi
  • ნახვები 4 845 889

Комеди Клаб, 14 сезон, 30 выпуск

  • Comedy Club
  • ნახვები 131 154

როგორ ვაკეთებ “ცეზარს”

  • Milena Shelia
  • ნახვები 27 853

ჩხუბები და გარჩევები | ნაწილი 2

Ранняя Пташка 13 серия 2 фраг русские субтитры

სწავა დაიწყო/swavla

ლეგენდარული ფინტები ჩვენი შესრულებით

  • Go Lets Play
  • ნახვები 25 284

World Judo Championships 2018: Day 7 – Elimination

Elimi Bırakma 9. Bölüm

  • Elimi Bırakma
  • ნახვები 919 674

Lil Peep & XXXTENTACION – Falling Down

  • Lil Peep
  • ნახვები 25 029 988

როგორ გადავრჩეთ ექსტრემალურ პირობებში ?

КОРОЧЕ ГОВОРЯ, Я ЛЕНИВЫЙ

Самый дорогой IPhone | провал Apple?

  • Дима Масленников
  • ნახვები 508 529

მამაოს ჯიგრული გამოსვლა კომიტეტის სხდომაზე

  • GANATLEBA TV
  • ნახვები 61 806

Archery Trick Shots 2 | Dude Perfect

  • Dude Perfect
  • ნახვები 6 457 194

Кавказец офигел от ботаника!

  • Body Mania
  • ნახვები 5 780 071

Eminem – Lucky You ft. Joyner Lucas

  • EminemVEVO
  • ნახვები 41 696 608

World's Strongest Hands ✅

  • Mr. Fast 2018
  • ნახვები 20 092 833

Хачу Миллион – Серия 1

  • ДНЕВНИК ХАЧА
  • ნახვები 382 940

Gülperi | 2.Bölüm

Что если затопить блютус колонку?

  • Тимур Сидельников
  • ნახვები 651 349

Замуж за Бузову – 1 сезон, 5 выпуск

  • ТНТ Смотри еще!
  • ნახვები 115 644

Менять власть Путина #СергейУдальцов

Sweetie Bean | Funny Clips | Mr Bean Official

Что делать, когда скучно – 12 идей!

  • Трум Трум СЕЛЕКТ
  • ნახვები 862 658

TSERIES EXPOSED?

  • PewDiePie
  • ნახვები 5 032 024

ЧТО, ЕСЛИ ты можешь БЫТЬ ЛЮБОГО РАЗМЕРА

EN RAHATLATICI YEMEK VİDEOLARI (Tepki)

  • Enes Batur
  • ნახვები 1 750 566

Avlu 13. Bölüm Fragman

Источник: https://gefilm.net/v-%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B2%D0%B5%D1%82%D0%BE%D0%B4%D0%B8%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8-ws2813-%D1%81-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0%D1%86%D0%B8%D0%B5%D0%B9-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-attiny-IKs2_0VAB1E.html

Подключение адресной светодиодной ленты WS2812B к Arduino

Введение

Приветствую всех. Мы продолжаем знакомить Вас со светодиодными лентами. На этот раз мы рассмотрим адресную RGB светодиодную ленту WS2812B.

Лента основана на светодиодах WS2812B в корпусе LED 5050, куда в корпус производители поместили не только три встроенных светодиода (Красный, Зеленый, Синий), но и управляемый ШИМ драйвер, управляющий их яркостью.

Благодаря этому мы можем получить произвольный цвет, изменяя яркость встроенных светодиодов, а так же управлять отдельно взятым пикселем на ленте. Собственно, три встроенных разноцветных светодиода вместе с ШИМ драйвером и образуют светодиод WS2812B.

Немного запутывает, не правда ли? Светодиод, который содержит себе три разноцветных светодиода, но при этом сам – не светит, а светятся те три, что в него встроены. Поэтому мне проще называть его пикселем, нежели светодиодом. И далее, если я упоминаю пиксель – знайте, что это светодиод WS2812B.

На фото справа вы можете увидеть этот самый светодиод WS2812B, где большой черный прямоугольник это ШИМ драйвер, а вот три встроенных в него светодиода настолько малы, что их с трудом видно, и можно отследить только по золотым нитям, идущим от драйвера к трем разноцветным светодиодам.

Технические характеристики

Теперь давайте немного пройдемся по техническим характеристикам из datasheet который мне удалось раскопать в интернете.

  • Светодиод WS2812B работает от напряжения 5В (±0.5).
  • Ток ~20мА на один встроенный светодиод, то есть ~60мА на пиксель в целом.
  • Рабочая температура от -20 до +80 ℃.

Остальное можете посмотреть самостоятельно в даташите.

Подключение

Подключается светодиодная лента довольно-таки просто, необходимо подать на +5V и GND, плюс (+) и минус (-) от 5В блока питания, а контакт DIN соединить с портом Arduino, как правило, по умолчанию используется 6-й порт Arduino, но вы вправе выбрать и любой другой свободный порт. Так же рекомендуется соединить земли Arduinoи блока питания, как нарисовано на рисунке ниже.

Будьте внимательны, лента на светодиодах WS2812B имеет направление, с одной стороны она имеет контакты DIN, +5V, GND, а с другой стороны DO, +5V, GND, подключать необходимо именно вход, то есть DIN, иначе лента не будет работать. Так же на ленте нарисованы стрелки, указывающие на направление.

Протокол

Теперь, когда мы разобрались, как подключить нашу ленту к Arduino, нам надо понять, как ею управлять, для этого в даташите есть описание протокола, который мы сейчас и рассмотрим.

Каждый светодиод WS2812B имеет один вход (DIN) и один выход (DO). Выход каждого светодиода подключается ко входу следующего. Подавать сигналы же надо на вход самого первого светодиода, таким образом, он запустит цепь, и данные будут поступать от первого ко второму, от второго к третьему и т. д.

Команды светодиодам передаются пачками по 24 бита (3 байта, один байт на каждый цвет, первым передается байт для зеленого, потом для красного, и заканчивает байт для синего светодиода. Порядок бит – от старшего к младшему). Перед каждой пачкой идет пауза в 50 мкс.

Пауза больше 100 мкс воспринимается как окончание передачи. Все биты, будь то 0 или 1, имеют фиксированное время 1.25 мкс. Бит 1 кодируется импульсом в 0.8 мкс, после чего идет пауза в 0.45 мкс. Бит 0 кодируется импульсом в 0.4 мкс, после чего идет пауза в 0.85 мкс.

Собственно, наглядная диаграмма на фото ниже. Так же допускаются небольшие погрешности в 0-150 нс на каждый фронт. Ну и следует учесть, что подобное необходимо повторить для каждого светодиода на ленте, после чего сделать паузу минимум в 100 мкс.

Потом можно повторить передачу.

Глядя на все эти цифры, становится ясно, что сделать все это, используя стандартные функции digitalWrite, delay и тому подобные – попросту невозможно, ввиду их долгой работы и неточности. Реализовать подобный протокол можно только использовав специальные библиотеки вроде CyberLib или написав собственную на чистом Си или, того хуже для нынешнего программиста, на Ассемблере.

Но не все так плохо, как кажется. Светодиоды WS2812B довольно таки популярны в Arduino сообществе, а это значит, что нам не придётся вдаваться в такие сложности, и достаточно выбрать одно из понравившихся решений.

Библиотеки

Поискав в интернете, вы найдете, как минимум, две большие библиотеки для работы со светодиодами WS2812B.

Под большими библиотеками я подразумеваю не количество функций и возможностей, хотя и это то же, а количество людей, участвовавших в их разработке.

Конечно, поискав, еще можно найти и другие библиотеки, разработанные отдельно взятыми ардуинщиками, но работающими не на всех микроконтроллерах Arduino и с большим количеством багов.

  • Библиотека FastLED, разрабатывается Даниэлем Гарсиа и Марком Кригсманом. Имеет свой сайт, справочную систему и большое сообщество в ~5000 человек. Библиотека написана на чистом Си, без использования Wiring. FastLED поддерживает все виды Arduino (и не только), а так же умеет работать с кучей различных протоколов и интерфейсов. В том числе и протокол для управления лентами на светодиодах WS2812B.
  • Библиотека Adafruit NeoPixel (Полное описание на нашем сайте), разрабатывается компанией Adafruit Industries. Предназначена для работы со светодиодными лентами и неопиксельными кольцами, продаваемыми в их интернет магазине. Библиотека написана на Си и Ассемблере с небольшим использованием Wiring. Эдакая солянка. Поддерживает все виды Arduino. Содержит меньший функционал по сравнению с FastLED, немного медленней, но имеет более компактный вид, только основное для работы.

Теперь давайте напишем наш излюбленный пример Blink, используя обе эти библиотеки, и затем сравним их.

Пример Blink используя ленту WS2812B (с 30 светодиодами) и библиотеку FastLED

// Подключаем библиотеку FastLED. #include “FastLED.h” // Указываем, какое количество пикселей у нашей ленты. #define LED_COUNT 30 // Указываем, к какому порту подключен вход ленты DIN. #define LED_PIN 6 // Создаем переменную strip для управления нашей лентой. CRGB strip[LED_COUNT]; void setup() {   // Добавляем ленту.

  FastLED.addLeds(strip, LED_COUNT); } void loop() {   // Включаем все светодиоды.   for (int i = 0; i

  for (int i = 0; i

Глобальные переменные используют 187 байт (9%) динамической памяти, оставляя 1861 байт для локальных переменных. Максимум: 2048 байт.

Пример Blink используя ленту WS2812B (с 30 светодиодами) и библиотеку Adafruit NeoPixel

// Подключаем библиотеку Adafruit NeoPixel. #include “Adafruit_NeoPixel.h” // Указываем, какое количество пикселей у нашей ленты. #define LED_COUNT 30 // Указываем, к какому порту подключен вход ленты DIN. #define LED_PIN 6 // Создаем переменную strip для управления нашей лентой.

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() {   // Инициализируем ленту.   strip.begin(); } void loop() {   // Включаем все светодиоды.   for (int i = 0; i

  delay(500);   // Выключаем все светодиоды.   for (int i = 0; i

Глобальные переменные используют 40 байт (1%) динамической памяти, оставляя 2008 байт для локальных переменных. Максимум: 2048 байт.

Подытожим

Как вы видите из скетчей выше, работать с обеими библиотеками довольно таки просто. Но библиотека FastLED занимает больше места в памяти Arduino, более того чем больше пикселей в вашей ленте тем больше памяти она зарезервирует для своей работы, а точнее 3 байта на каждый пиксель.

Таким образом подключить к Arduino можно не более 600 пикселей при использовании минимальной логики. По этому, мне больше приглянулась библиотека Adafruit NeoPixel. В ней только нужное для работы со светодиодными лентами и более рациональное использование памяти. Какую из этих библиотек использовать, решать, конечно, вам.

Обе они работают и со своею задачей справляются на 5+.

Ну а мы на этом закончим с обзором ленты. Далее мы сделаем на ее основе несколько проектов, для более наглядной демонстрации, но это уже буду отдельные статьи. Успехов вам и удачи. Оставляйте свои отзывы и комментарии.

Смотрите также

Источник: http://arduino.on.kg/podklyuchenie-adresnoy-svetodiodnoy-lenty-WS2812B-k-Arduino

Ограничения в использовании умных светодиодов WS2812, WS2801 и подобных в современных проектах декоративной светотехники

Уже несколько лет на рынке светотехники можно встретить такие названия, как: «smart led strip», «smart led pixel» и подобные.

Как правило, «умный пиксель» — это сборка из миниатюрного 3-х канального светодиодного драйвера (с интегрированным стабилизатором тока, PWM модулятором и сдвиговым регистром), подключенная к RGB светодиоду.

Читайте также:  Электрошокер

На базе таких пикселей многие производители выпускают «умные» гибкие светодиодные ленты, LED «гвозди» и LED кластера. Также можно встретить такие модели чипов, как WS2812, WS2813, с интегрированным LED драйвером непосредственно в корпус 5050 RGB светодиода.

Малые габариты, большое количество последовательно включенных пикселей (более 1000 шт.), простота управления по 1(2) проводу и сравнительно низкая стоимость решения — более чем оправдывают их применение.

Эта моя первая публикация на Хабре, в которой я хочу донести мой опыт использования и обозначить недостатки таких пикселей. За несколько последних лет я успел поработать со следующими LED драйверами: LPD6803, WS2801, WS2811, WS2812(B), TM1903, UCS1903, TM1804, TM1803, SM16716 и другими менее ходовыми. В интернете часто можно встретить такой термин как «светодиодная лента с пиксельной адресацией» — я с этим совершенно не согласен, и это является первым ограничением.

Информация в такие ленты/пиксели загружается по последовательному каналу, а именно через сдвиговые регистры с 24-х битной разрядностью (как правило), т.е. 3 канала по 8 бит для RGB. Никаких адресов такие LED пиксели не помнят и работают исключительно по последовательному принципу.

Отсутствие сигнала управления на линии данных или синхронизации (если таковая есть), служит командой для преобразования значений в регистрах в PWM сигналы для RGB светодиодов. По этой причине, при выходе из строя информационного канала одного из пикселей, последующие пиксели перестанут корректно работать.

Многие неопытные LED «рекламисты» наступили на эти грабли, применяя такие пиксели для уличных экранов. Рисунок ниже демонстрирует «битые» полоски.

Второе ограничение связанно с температурой использования. В большинстве случаев у пикселей, что управляются только по одному проводу «DATA», к примеру, WS2812B — нижняя температура использования -25 градусов.

На практике, часто от -15 градусов. Это связанно с отсутствием хорошего кварцевого блока регенерации сигнала внутри чипа. Таким образом, при низких температурах пиксель перестает корректно работать, наблюдаются «сверчки» и т.п. до полного отсутствия картинки. Другое дело — чипы с синхронизацией: WS2801, LPD6803, к примеру.

Здесь имеется хорошая регенерация сигналов по уровням, по времени — регенерация не нужна, поскольку имеется линия синхронизации. Рабочая температура в этом случае от -40 градусов. Но и стоят эти чипы вдвое дороже.

Третье ограничение — глубина цвета.

Рисунок ниже демонстрирует экраны собранный на чипах WS2801.Не вооруженным глазом заметно, что экран с фоном засвечен. Низкие уровни градиента «умные пиксели» (WS2812, WS2801 и т.п. практически все) не способны воспроизводить так, как это делают современные экраны.

Это связанно с низкой разрядностью интегрированного в чип PWM генератора (всего 8 бит на канал) и как следствие – отсутствие полноценной гамма коррекции. Проще говоря, светодиод светит слишком ярко, когда хочется совсем чуть-чуть и ничего с этим нельзя поделать.

Ощутимым минусом, во всяком случае для меня, было отсутствие хорошего софта подготовки и конвертирования анимации, непосредственно для вывода на «железки». Это явилось четвертым ограничением.

Источник: https://habr.com/post/305876/

Светодиоды со встроенным ШИМ WS2812 — DRIVE2

RGB-светодиоды и ленты на их базе — вещь изъезженная. Обычно найти три ШИМ-выхода у микроконтроллера не составляет труда, чтобы гирлянда светодиодов монотонно светила заданным цветом. Однако, если требуется задать несколько разных цветов в гирлянде, то уже начинаются проблемы как с количеством ШИМ-выводов микроконтроллера, так и с разводкой платы.

Наткнулся совершенно случайно на светодиоды, обладающие встроенным ШИМ-контроллером: WS2812 от Worldsemi Co.

Всё что нужно — подвести питание 5 Вольт, а на линию данных DIN выдать последовательно 24 импульса, кодирующие три 8-битных значения яркости, соответственно, зелёной, красной и синей составляющей.

Получив свои значения, контроллер зажигает светодиод заданным цветом, а все последующие импульсы передаёт на выход DOUT. Таким образом, светодиоды можно соединить в гирлянду, и управлять 24-битным цветом каждого в отдельности всего по одному проводу данных.

распиновка WS2812B

Выпускаются в корпусах 5050 в двух версиях: WS2812B — четырёхвыводной и WS2812S — шестивыводной, с отдельными линиями питания для светодиодов и логической схемы.

На ebay светодиоды WS2812B россыпью можно купить по цене 10 баксов за 50 штук. По сравнению с “обычными” светодиодами, цена не маленькая, но, в принципе, доступная.

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

5 метров герметичной ленты из 150 светодиодов WS2812B

В случае необходимости ленту можно разрезать на меньшие фрагменты.

Лента WS2812B

ШИМ работает на частоте около 400 Гц, поэтому мерцание на глаз не заметно, однако при съёмке видео могут появляться странные волнообразные эффекты. Незажжённый светодиод потребляет около 1мА, соответственно лента из 150 светодиодов потребляет около 150мА.

Полностью зажжённый светодиод потребляет около 60мА, а значит для питания ленты из 150 светодиодов потребуется 9 Ампер.

Желательно избегать длинных фрагментов лент и подводить питание с обеих сторон, поскольку падение напряжение на 5-метровой ленте при таком токе может быть критическим.

Кроме SMD-светодиодов, существует вариант отдельной микросхемы WS2811, для управления RGB-светодиодом, также продают гирлянды на базе таких чипов и различных RGB-светодиодов.

Кроме того, каким-то другим производителем выпускаются аналогичные и совместимые по протоколу светодиоды PL9823 в виде 5мм и 8мм круглых матовых светодиодов, а также smd 5050.

светодиоды PL9823-F5, 5мм

В момент простоя каждый из PL9823 кушает около 7мА, что весьма значительно.

Протокол управления

Каждый бит данных передаётся в виде отдельного импульса высокого уровня, длительность импульса кодирует передаваемое значение. Тайминги для всех вышеперечисленных моделей разные, но можно ориентироваться на те, что даны в даташите на WS2812B. А именно, длительность высокого уровня: 0.

4 мкс для передачи значения 0, и 0.85 для передачи значения 1. Время передачи одного бита 1.25 мкс, т.е. скорость передачи 800 кбит/с. Иначе говоря, для гирлянды из 300 светодиодов время полного обновления составит всего 9мс, т.е. теоретически можно её обновлять более 100 раз в секунду.

Передача ведётся от старшего бита к младшему. У WS2812 сначала передаётся байт зелёной компоненты цвета, затем красной, затем синей. У остальных вышеперечисленных — сначала красный, затем зелёный и синий.

Получив 24 бита на входе DIN, светодиод зажигается заданным цветом и все последующие биты данных транслирует на выход DOUT, передавая следующему светодиоду в гирлянде.

Сигналом сброса и началом нового цикла обмена считается наличие низкого уровня на линии в течение 50 мкс.

На этом скриншоте показана осциллограмма управляющего сигнала. Зелёным — сигнал от микроконтроллера на входе DIN, жёлтым — сигнал на выходе DOUT. Показан момент, когда завершилась передача первых 24 битов и чип начал ретранслировать данные.

Как видно, фронт ретранслируемого импульса немного задерживается, длительность импульса чип светодиода формирует самостоятельно, поэтому при передаче 1 видно что ретранслированный импульс оказался короче исходного: их срезы практически совпали.

Программирование на AVR

Для отладки я собрал себе тестовую плату:

Тестовая плата

Один бит данных передаётся за 1,25 мкс, а при частоте работы микроконтроллера 8 МГц это составляет всего 10 тактов.

В реализованном примере вывод данных написан на ассемблере. Поддерживается “быстрый” режим — 10 тактов на бит, и медленный — 20 тактов на бит.

Также поддерживается одновременный вывод на две гирлянды также на скорости 10, или 20 тактов на бит. В этом случае они должны быть подключены к выводам одного порта. Более подробные пояснения — в исходном коде. Демонстрационный проект написан на Atmel Studio 6.2 для ATmega8A, по умолчанию настроен на вывод на 1 линейку из 150 светодиодов, подключенную к PD0.

Скачать проект вместе со всеми исходниками здесь (последнее исправление от 04.04.16)

Макрос светодиода WS2812B для Sprint Layout здесь

Другие подобные светодиоды

Полные аналоги WS2812B

WS2812B — (описан в этой статье). Чип встроен в SMD светодиод размера 5×5мм, 4 вывода.

WS2812C — версия WS2812B, также SMD 5×5мм, 4 вывода, но на в 4 раза меньший ток: макс. 5мА на цвет (вместо 18.5мА у WS2812B). Позволяет делать гирлянды и табло с большей плотностью светодиодов и меньшей яркостью.

XT1511 — SMD 5×5мм, 4 вывода, аналог WS2812B. Так же существует версия XT1511-5mA на 5мА.

SK6812-RGB — SMD 5×5мм, 4 вывода.

SK6805 — SMD 5×5мм, 4 вывода, версия SK6812 но на ток 5мА.

Совместимые по протоколу в других корпусах

WS2812S — (был упомянут в статье). SMD 5×5мм, 6 выводов, раздельное питание для светодиодов и чипа.

SK6812-P6 SMD 5×5мм, 6 выводов.

SK6812-WWA SMD 5×5мм, 4 вывода. вместо красного, синего и зелёного его компоненты цвета: холодный белый, тёплый белый и янтарный, для динамического освещения.

WS2811 — отдельные чипы в корпусах soic-8. Продаются также в лентах с smd светодиодами и гирляндах с выводными 5мм светодиодами (пример использования). Может работать на пониженной частоте обмена (400 кГц).

WS2812B-Mini — чипы, встроенные в RGB-светодиод размера 3,5×3,5мм.

TM1804 — отдельная ИС в корпусе soic-8. Может работать на пониженной частоте обмена (490 кГц).

Частично совместимые, или похожие по протоколу

WS2813 — обновлённая версия, 6-контактный корпус, обладают запасным входом, который подключается параллельно входу предыдущего светодиода, таким образом, если один светодиод выходит из строя, то цепочка за ним не перестаёт работать. Менее строгая спецификация по таймингам, допускают паузу между битами до 100мкс. Соответственно, длительность низкого уровня для сброса увеличена до 300мкс. Частота ШИМ поднята до 2кГц.

WS2818 — обновлённая версия 2811; отдельные чипы в корпусах sop8, msop8 или dip8. Допускают менее строгие тайминги.

SK6812-RGBW SMD 5×5мм. Использует не 3 компоненты цвета, а 4: Красный, синий, зелёный, белый. Протокол аналогичен описанному, но на 1 светодиод требуется 32 бита данных. (описание от CAMOKAT-BETEPAHA)

PL9823-5050. SMD 5×5мм, 6 выводов. По описанию, работают на скорости обмена 580 кГц, но, вероятно, смогут принимать данные на 800 кГц.

PL9823-F5 и PL9823-F8 — (были упомянуты в статье) выводные, 4 ножки, диаметр 5 и 8 мм, соответственно. По описанию, работают на скорости обмена 580 кГц, но, по опыту, могут нормально принимать данные на 800кГц.

Несовместимые по протоколу

WS2801 — отдельные чипы в корпусах SOP-14. Продаются также в лентах в сопряжении с 5050 светодиодами. Ток каждого цвета светодиода задаётся резистором. Синхронный протокол (односторонний SPI — линия данных и линия тактирования), обеспечивает большую скорость обновления.

APA102 — встроенные в корпус светодиода 5050. Синхронный протокол (односторонний SPI — линия данных и линия тактирования), обеспечивает большую скорость обновления.

На каждый светодиод выдаётся 4 байта данных: значение яркости красного синего и зелёного и общая яркость.

ШИМ для красного синего и зелёного работает на высокой частоте, что позволяет добиться плавного вывода на движущихся объектах (POV, пример, автор mortonkopf)

LDP8803 и LDP8806 — отдельные чипы в корпусах soic-16, синхронный протокол (односторонний SPI — линия данных и линия тактирования). 3 и 6 управляемых каналов, соответственно.

Источник: https://www.drive2.ru/b/1646666/

Управление RGB светодиодом с помощью аппаратной ШИМ ATmega8

Как известно, RGB светодиод представляет собой три излучающих кристалла, красного, зеленого и синего цвета, на одной подложке.

Смешивая эти три цвета в разных пропорциях, можно получить всю цветовую гамму, воспринимаемую людским глазом. Для управления цветом потребуется включать кристаллы с разной яркостью, то есть управлять током через диод.

Проще всего, это сделать с помощью микроконтроллера, а точнее его аппаратной ШИМ, которой нам потребуется 3 канала.

Микроконтроллер ATmega8 как раз имеет требуемых 3 аппаратных ШИМ канала, так что будем проводить эксперименты с его участием. В качестве подопытного будем использовать RGB светодиод Сree MC-E.

У этого светодиода 4 кристалла: красного, зеленого, синего и как бонус, белого цвета. Белый кристалл задействовать не будем.

Схема включения ничем принципиальным не отличается от той, которую использовали при опытах с аппаратной ШИМ:

Транзисторы Q1-Q3 – ZXTN19020, резисторы R4,R5,R7 – 10 ом (я не проводил балансировку цветов, так как для этого нужен спектрограф, которого у меня нет, все ограничивающие резисторы поставил одного номинала). Резисторы R3,R6,R8 по 1 килоому.

Все остальное – обвес микроконтроллера, с которым должно быть все понятно. X1 – кварцевый резонатор на 4Мгц, конденсаторы С1,С2 – по 18-20 пФ. R1,C7 соответственно по 10 килоом и 0,1 мкФ.

D1– светодиод, показывает, что на схему подается питание, R2 – ограничивающий резистор на 200 ом.

Конденсаторы
C3 – 100мкФ, С5 – 50мкф, С4,С6 – блокировочные, по 0,1мкФ. L7805 – стабилизатор напряжения 5В, подойдет любой аналог: LM7805, КРЕН5А.

D2-D3-D4 – наш RGB светодиод, соответственно синий, зеленый и красный его кристаллы. Гореть одним цветом нашему светодиоду будет скучно. Эффектней будет плавное переливание цветов.

Например, красный цвет постепенно переходит в зеленый, зеленый в синий, а синий в красный, и так по кругу в вечном цикле. Для этого напишем программу:

  1. #include //Стандартная библиотека ввода/вывода

  2. #define R_channel OCR1AL //Определяем канал OCR1AL для Красного цвета

  3. #define G_channel OCR1BL //Определяем канал OCR1BL для Зеленого цвета

  4. #define B_channel OCR2 //Определяем канал OCR2 для Синего цвета

  5. #define RGB_pause 2000 //Пауза для задержки

  6. //Программа формирования задержки

  7. void pause (unsigned int a)

  8. {

  9. unsigned int i; //Переменная для задержки

  10. for (i=a;i>0;i–); //Цикл формирования задержки

  11. }

  12. //Программа инициализации ШИМ

  13. void init_pwm (void)

  14. {

  15. //Инициализация порта

  16. DDRB=0x0e; //OC1A,OC1B,OC2 – выхода

  17. TCCR1A=(1

Источник: https://avrlab.com/node/93

Простая 16 канальная система ИК дистанционного управления на Attiny2313

Это устройство способно при помощи инфракрасного управления включать и выключать до 16 независимых нагрузок. Первое нажатие на одну из кнопок с 1 по 16 приводит к включению, повторное нажатие к выключению нагрузки. Дальность действия до 45 метров.

Управление дистанционным контролем осуществляется при помощи микроконтроллера Attiny2313А. Процессор работает от внутреннего RC осциллятора на частоте 1 МГц.

Команды передаются через ИК-светодиод с длиной волны 940 нм. (TSAL6100, TSAL6200, TSAL5100 или TSAL5300). При нажатии на кнопку, передатчик посылает соответствующий код. Программа обеспечивает полную передачу кода кнопки независимо от того, когда кнопка была отпущена.

Импульсный ток, протекающий через ИК-светодиод, установлен на уровне 320…400 мА, который задается сопротивлением R1. Ток стабилизируется цепью с VT1, VT2, R1, R2, в результате он остается на постоянном уровне, не смотря на снижение напряжения питания.

Необходимо обратить внимание, чтобы протекающий ток через ИК-светодиод не превышал максимально допустимый. Рабочая частота передачи составляете около 37 кГц (частота процессора / 27). Передатчик питается от источника 3В, например две AA или AAA батарейки, или иной источник на 3В. Минимальное рабочее напряжение для Attiny2313A является 1,8 В.

Ток потребления передатчика составляет около 20 – 30 мА. Когда не нажата ни одна кнопка, микроконтроллер переходит в режим Power Down и потребление передатчик снижается до 1мкA (что намного меньше, чем саморазряд батареи, поэтому этим можно пренебречь). Конденсатор C1 необходимо разместить как можно ближе к микроконтроллеру.

Приемник также как и передатчик построен на Attiny2313A с тактовой частотой 1 МГц от внутреннего RC осциллятора.

В качестве ИК-датчика применен фотоприемник TSOP1736 (TSOP4836, TSOP31236, SFH5110-36, OSRB38C9BA, OSRB38C9AA, TSOP4838, TSOP34838, SFH5110-38). Приемник предназначен для работы на частоте от 36…38 кГц.

Встроенный приемник получает, усиливает и демодулирует инфракрасный сигнал.

Он имеет встроенную автоматическую регулировку усиления (АРУ), подавление помех от дневного света, полосовой фильтр, демодулятор и выходной сигнал, согласованный с уровнями TTL.

Все вышеизложенное обеспечивается при длиннее световой волны в районе 940-950 нм, поэтому длинна волны, передающего светодиода должна соответствовать данной величине.

При приеме кода кнопки (образец кода должен быть получен два раза) и следующих за ними контрольных бит, микроконтроллер принятый сигнал декодирует и переключает соответствующий выход. После подачи питания на схему, первоначальное состояние всех входов (по умолчанию) – выключено.

Для коммутации нагрузкой выходы приемника модно подключить по следующей схеме:

Реле можно применить на 5 вольт с контактами, выдерживающими ток потребления нагрузки. Питание приемника осуществляется от стабилизированного источника питания на 5 вольт, построенного на стабилизаторе 78L05 или 7805.

Запрограммировать микроконтроллер можно USB программатором.

Фьюзы передатчика:

Фьюзы приемника:

Скачать прошивку (1,0 Mb, скачано: 1 746)

www.danyk.cz

Источник: http://www.joyta.ru/6198-prostaya-16-kanalnaya-sistema-ik-distancionnogo-upravleniya-na-attiny2313/

Лампа настроения с сенсорным управлением на Attiny13

Дата публикации: 02 февраля 2016.

Рейтинг:  5 / 5

Теперь немного подробнее о режимах. В первом режиме цвета решил менять по цветовому кругу, не стал выдумывать различные случайные генерации, да и размахнуться с этим было некуда в пределах ATtiny13. В принципе, таким образом я обхожу все оттенки цветов по окружности вокруг цветового круга. Любая другая точка, выбранная внутри круга даст нам один из наших оттенков, но с другой яркостью.

Долго эксперементировал с тем, как визуализировать настройку выбора скорости всякими помигиваниями. В итоге остановился на выборе скорости по цветам радуги + розовый цвет. Красный — самая быстрая скорость. Розовый — самая медленная. Настройка яркости осуществляется визуально одним цветом.

Через 30 секунд после того, как мы последний раз переключали режим, происходит следующее. Если мы находимся в одном из основных режимов, то настройки сохраняются. Если мы находимся в одном из настроечных режимов, то лампа возвращается к сохраненным настройкам. При следующем включении лампа возвращается к сохраненным настройкам.

Кому-то будет проще и быстрее посмотреть функционал на видео. Извиняйте за качество, крутыми гаджетами для съемки не обладаю. Цветопередача ужасная. К тому же, на видео настройка яркости видна плохо, т.к. камера постоянно подстраивалась под каждый уровень яркости.

Материалы

В качестве блока питания можно взять зарядник от телефона на подходящий ток. У меня уже очень давно были закуплены блоки питания и плафоны по 2 штуки. Плафон взял от светильника grono из магазина “Икея”. Еще вот похожие по размерам, но круглые — кварне.

Источником света в лампе является один или несколько RGB-светодиодов. Я взял один 3 Ваттный RGB-светодиод, который в номинале держит по 300 мА на каждый канал. Запитал его в щадящем режиме где-то по 200 мА на канал.

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

Схема, реализация

Схема получилась очень простой.

Для управления мощным светодиодом я взял полевики с дохлой материнской платы. И развел макет платы под них, изготовил пару плат.

Собрал все воедино, бросил коробочку на дно плафона. В качестве сенсора сделал кусок лакированной проволоки 0.3 мм, которую пустил по верхнему контуру плафона. Светодиод посадил временно только на термопасту, а проволоку на скотч.

Трудности отладки

Я уже писал как при разработке лампы я использовал бинарную модуляцию (БМ) и работал с сенсором. Так вот, сенсор требовал доработки, потому как он временами срабатывал сам собой.

Я выполнил советы Mail1977, за что его благодарю. Однако, это полностью не решило проблему. Дело оказалось в форме сенсора, в роли которого у нас выступает длинная проволока.

Я думаю, она вела себя как антенна и ловила всякую ерунду.

Тогда мне в голову пришла идея: заэкранировать наш сенсор, чтобы он не ловил помехи. И я сделал не одну проволоку, а витую пару. Второй конец которой подключил к земле нашей схемы управления светодиодом. (Здесь у меня вопрос, есть ли смысл посадить на эту землю и корпус блока питания?) И всё, помехи ушли!

Но это еще не все. Первая моя стабильная версия лампы была реализована с помощью БМ (исходник этой реализации я тоже вложу в архив).

Однако, помаргивания при плавном изменении цветов RGB-светодиода, все же, были видны, даже на частоте БМ 586 Гц. Особенно на маленьких яркостях. Частоту повышать уже больше не стал.

Переделал на программный ШИМ с частотой около 100 Гц. На глаз теперь все происходит плавно!

Перспектива

Когда это все собрал и отладил, то был доволен. Но есть еще задумка. Как-то громоздко все это выглядит.

Подумал, что было бы интересно собрать аналог такой лампы в виде небольшого ночничка, который можно было бы питать от любого разъема USB, ведь у каждого есть зарядник для телефона.

Развел кругленькую плату (часть ее видно справа на фото готовых плат выше) для 9-ти RGB-светодиодов 5050 и разъема microUSB. Может быть в будущем соберу.

Исходник для прошивки написан на C в CodeBlocks под компилятор GCC AVR.

Желаю каждый проект довести до победного конца!

Источник: https://radioparty.ru/device/avr/618-touch-mood-lamp-attiny13

Об управлении микроконтроллером AVR при дефиците выводов

Журнал РАДИОЛОЦМАН, июнь 2015

В. И. Иволгин, г. Тамбов

Можно почти не сомневаться в том, что все «пользователи» микроконтроллеров (МК) прошли через знакомство с задачей управления состоянием светодиода (включить/выключить) с помощью тактовой кнопки.

Идея ее решения проста – надо на один вывод МК подключить кнопку, а на другой – светодиод, например, как показано на Рисунке 1. В этом случае логика работы схемы может быть такой.

Здесь кнопка подключена так, что ее кратковременное нажатие сопровождается изменением на входе PВ1 логического уровня с 1 на 0.

Тогда при обнаружении такого события на входе (кнопку нажали) МК производит изменение логического уровня на выходе РВ0 и, соответственно, включение или, наоборот, выключение светодиода. Разумеется, при наличии необходимого программного обеспечения. Такая схема является системой с раздельными линиями управления и исполнения. А можно ли подобную проблему решить, используя лишь один вывод МК AVR?

Рисунок 1. Один из вариантов подключения
светодиода и кнопки управления.

Это не столь праздный вопрос, как может показаться на первый взгляд, хотя в практике такие задачи и в такой формулировке, действительно, встречаются нечасто.

Но ведь в более общем плане здесь фактически речь идет о возможности управления работой программы МК через вывод, используемый для получения информации из микроконтроллера, когда требуется прервать установленный ход выполнения программы и перейти к выполнению ее другого фрагмента. Именно с этой точки зрения и целесообразно рассмотреть предлагаемый вариант решения этой задачи.

Прежде чем переходить к обсуждению схемы и ее реализации, отметим некоторые характеристики системы ввода/вывода микроконтроллеров AVR, важные с этой точки зрения. И, в первую очередь, то обстоятельство, что практически любой вывод МК по направлению передачи информации можно устанавливать в состояния «вход» или «выход».

При конфигурировании вывода на «вход» он будет обладать свойствами триггера Шмитта с высоким входным сопротивлением. В результате проведения экспериментов с МК ожидаемо выяснилось, что точка перегиба его входной триггерной характеристики примерно равна половине напряжения питания (МК AVR выполняются по КМОП-технологии).

Это означает, что, например, при 5-вольтовом питании МК напряжения от 0 до 2 вольт на таком входе будут восприниматься как уровень логического нуля, а напряжения от 3 до 5 вольт – логической единицы.

Что касается использования вывода на «выход», то при конфигурировании на нем будет устанавливаться выходное напряжение, соответствующие либо логическому 0, либо 1, практически совпадающие, соответственно, или с потенциалом нулевого провода, или с напряжением питания МК.

Отметим, что значение Vcc = 5 В здесь приведено только для удобства проведения расчетов. Эта величина в принципе может быть любой из интервала значений напряжения питания конкретного МК с соответствующей корректировкой приведенных числовых значений.

Рассмотрим теперь логику управления выводом МК AVR, позволяющим совместить функции кнопочного управления ходом выполнения программы и формирования микроконтроллером управляющего сигнала.

Ее основная идея заключается в создании таких условий, при которых управляющий сигнал, формируемый МК на его выходе, изменялся бы только в интервале напряжений, соответствующих одному логическому уровню, например, от 3 В до 5 В, то есть, в зоне уровня логической 1.

В тоже время, необходимо, чтобы, как и в варианте на Рисунке 1, при замыкании кнопки SB1 напряжение на нем уменьшалось бы до уровня логического 0, то есть, до значений в интервале 0…2 В.

Достигается выполнение этих противоречивых требований подключением к используемому выводу кнопки с дополнительными резисторами и варьирования его состояния поочередно на «вход» и «выход». За счет этих мер, в конечном итоге, удалось получить необходимые характеристики используемого вывода МК (Рисунок 2). Каким же образом?

Рисунок 2. Принципиальная схема преобразователя
уровней вывода МК.

Предположим, что первоначально вывод PB0 микроконтроллера на Рисунке 2 сконфигурирован как «вход». И если резисторы R1, R2 достаточно низкоомны (единицы-десятки килоом), то в этом случае напряжение на нем будет определяться только соотношением их сопротивлений.

Допустим, что их величины удовлетворяют равенству R1/R2 = 2/3, например, R1 = 2.2 кОм и R2 = 3.3 кОм. Тогда при Vcc = 5 В напряжение на PB0 будет равно 3 В, и будет определяться МК как уровень логической 1.

При замыкании (нажатии) кнопки SB1, и при соответствующем значении «защитного» сопротивления R3, например, R3 = R1, напряжение на входе уже будет ниже 2 В, что соответствует уровню логического 0.

Пусть теперь вывод PB0 микроконтроллера будет сконфигурирован как «выход». И пусть на нем будет установлен уровень логической 1. Тогда на выходе преобразователя уровней (ПУ) в точке А установится 5 В. И этот уровень практически не зависит от значений сопротивлений используемых резисторов, и не может быть изменен замыканием кнопки SB1.

Для получения же второго уровня напряжения в рамках единичного логического уровня переведем его в состояние «вход». Тогда, как это уже было оговорено выше, на выводе РВ0, а следовательно, и в точке А, установится уровень 3 В.

Выбором из этих двух состояний – 5 В и 3 В, можно формировать либо два разных состояния управляемой системы, либо необходимую импульсную последовательность путем чередования смены состояний вывода.

Изменение логического уровня с 1 на 0 на выводе PB0 при замыкании кнопки SB1 возможно только в том случае, если вывод находится в состоянии «вход».

И, если по условиям управления внешним устройством он периодически или постоянно находится в таком состоянии, то это будет предпочтительным вариантом для обнаружения факта замыкании кнопки SB1. В таком случае ее нажатие, по сути, будет определяться в «фоновом режиме» работы МК.

Но если такой возможности нет, то тогда придется для обнаружения замыкания кнопки с определенной периодичностью переводить его в это состояние. И при этом, конечно, придется мириться с неизбежным усложнением логики управления внешним устройством.

На Рисунке 3 приведена осциллограмма, дающая представление об уровнях напряжений, которые формируются ПУ в разных его состояниях и при напряжении питания МК, равном 4 В.

Важно, что уровни 2 и 3, расположенные симметрично относительно половины напряжения, при оговоренных выше параметрах ПУ считываются МК как, соответственно, логические 1 и 0. Была проверена работоспособность ПУ в интервале напряжений от 2.5 В до 5.

5 В с использованием нескольких экземпляров МК семейств Tiny (2 шт.) и Mega (1 шт.). Выяснилось, что для повышения надежности работы ПУ при низких напряжениях целесообразно за счет перерасчета значений сопротивлений R1-R3 уровень 2 поднять на 0.15-0.25 В, а уровень 3 на ту же величину понизить.

Эту меру целесообразно использовать также и в целях повышения стабильности работы ПУ для предотвращения ложных срабатываний кнопки при высоком уровне внешних помех.

Рисунок 3.

Уровни напряжений, формируемых ПУ (Рисунок 2). 1 – PB0 в состоянии «выход», установлен  логический уровень 1; 2 – PB0 в состоянии «вход», уровень определяется соотношением R1/R2 = 2/3; 3 – то же, что и 2, замкнута кнопка SB1 при R3 = R1; 4 – PB0 в состоянии «выход», установлен логический уровень 0.

Но вернемся к вопросу управления светодиодом, о котором шла речь вначале. Его уже можно было бы подключить, например, между выходом ПУ (точка А схемы на Рисунке 2) и источником питания Vcc, снабдив предварительно МК соответствующим программным сопровождением.

Но целесообразнее все же сделать это так, как предлагается на Рисунке 4а, что позволит характеристики ПУ сделать практически независящими от подключения нагрузки (светодиода), а также обеспечит работу устройства в более широком интервале напряжений. Так, например, при R1 = 2.2 кОм, R2 = 3.

3 кОм и R3 = 1.5 кОм (Рисунок 2) работа преобразователя будет уверено обеспечиваться при изменении напряжения Vcc в пределах от 2.5 В до 5.

5 В, а подключение светодиода потребует лишь уточнения величин R4, R5 в зависимости от параметров используемого транзистора, типа светодиода HL1 и требуемой яркости его свечения (Рисунок 4а).

Рисунок 4. Варианты подключения дополнительных элементов к преобразователю из Рисунка 2.

В рассматриваемом случае управление включением/выключением светодиода осуществляется сигналом, который формируется на выходе преобразователя в точке А (Рисунок 2), изменяющимся в пределах всего 2 В. Такого его уровня, вообще говоря, недостаточно для дальнейшего использования в стандартном режиме работы МК и сопряженных с ним устройств.

Для расширения возможностей МК необходимо восстановить уровни напряжения этого сигнала до обычных значений бистабильных выходов МК – 0 В и Vcc. Этого можно добиться, подключив к выходу ПУ, например, цепь, изображенную на Рисунке 4б.

Характерно, что на выходе этого усилителя замыкание кнопки уже не изменяет параметров импульсной последовательности, если это не предполагается логикой работы программы МК. И, таким образом, управляемый объект не «чувствует» нажатой кнопки, а изменяет свое состояние только после ее отпускания.

На Рисунке 5 в качестве примера приведена осциллограмма, на которой показаны фазы изменения скважности импульсного сигнала, вызванные нажатием кнопки (Vcc = 5 В).

Рисунок 5. Осциллограмма напряжений, формируемых на выходе ПУ (сверху) и после усиления цепью, изображенной на Рисунке 4б (снизу). Цифры указывают состояние

кнопки: 1 – разомкнута, 2 – нажата, 3 – отпущена.

В рассмотренном примере, как следует из Рисунка 5, не используется еще одно состояние вывода PB0 – «выход» с нулевым уровнем напряжения.

При необходимости это обстоятельство можно использовать для создания дополнительного канала управления объектом, например, для его отключения/включения, для структурировании импульсных последовательностей и т. п.

В этом случае для его формирования целесообразно использовать цепь на Рисунке 3в, применение которой позволит на ее выходе получить уровень Vcc только при нулевом напряжении на выходе ПУ, а во всех других ситуациях на нем будет нулевой уровень.

Можно отметить также, что использование этого состояния превращает управляющий сигнал, формируемый на выходе ПУ в точке А (без участия кнопки), фактически, в трехуровневый сигнал, находящий применение в некоторых системах связи. В обычных же условиях работы МК эта его особенность может быть использована для формирования сложных импульсных последовательностей.

В заключение рассмотрим демонстрационный пример реализации устройства для ступенчатого управления яркостью свечения светодиода с помощью тактовой кнопки. И для этой цели будет использоваться только один вывод МК. Его принципиальная схема приведена на Рисунке 6.

Основой устройства является 8-выводной микроконтроллер ATtiny13A в стандартном включении с активированным внутренним RC-генератором на 9.6 МГц без деления на 8 (устанавливается соответствующим фьюзом при программировании). Схема особенностей не имеет.

Принцип изменения яркости свечения сводится к изменению скважности управляющего сигнала при сохранении его частоты около 70 Гц. Нажатие кнопки и ее удержание не приводят к изменению яркости светодиода (управляющей импульсной последовательности), которое возникает только в момент отпускания кнопки.

В соответствии с логикой этого режима вывод PB3 периодически переводится в состояние «вход». Опрос с целью обнаружения замыкания кнопки производится в эти моменты перед переходом вывода в состояние «выход».

Для надежной фиксации размыкания/замыкания кнопки используется программная обработка дребезга контактов. Правильно собранное устройство наладки не требует и может питаться от источника 2.8…5.5 В.

Рисунок 6. Принципиальная схема устройства управления яркостью свечения светодиода.

Следует отметить, что демонстрационная программа, представленная в приложении в виде asm- и hex-файлов, не является оптимальной. И правильнее было бы ее выполнить с использованием прерываний, да и отойти от ее слишком прямолинейной логики.

Но эти недостатки искупаются возможностью простого переноса программы на другие МК серии AVR. В большинстве случаев при этом потребуется лишь заменить файл описания МК “tn13Adef.inc” в asm-файле на соответствующий файл нового МК.

Сам файл описания должен находиться в той же папке, что и asm-файл.

Завершая обсуждение вопроса о расширении возможностей МК за счет выполнения выводом дополнительных функций, можно сказать, что, в общем «и один вывод в поле воин».

По крайней мере, за счет использования на его базе преобразователей уровня, у МК появляются новые возможности. И это позволяет в какой-то мере сгладить проблему дефицита выводов микроконтроллера при их малом числе. Но польза проявляется не только в этом.

В ряде случаев их использование позволяет упростить решение сложных проблем и на «продвинутых» МК.

Загрузки

Файлы демонстрационной программы

Источник: https://www.rlocman.ru/shem/schematics.html?di=163111

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}