Урок 3 – цифровые выходы

Цифровые выводы Arduino

Опубликовано 06.07.2014 13:29:00

На наш взгляд, первое, с чего можно начать знакомство с платформой Arduino это её цифровые выводы. Они нам пригодятся для подключения различной периферии: светодиоды, реле модули и т.п

На плате Arduino UNO их 14 (D0-D13). Они могут работать как входы, как выходы и как выходы с поддержкой ШИМ. 

Конфигурация выводов как вход либо выход задается в void setup

  // Инициализируем цифровой pin 3 как выход
  pinMode(3, OUTPUT);
  // Инициализируем цифровой pin 3 как вход   
  pinMode(3, INPUT);

После конфигурации цифрового вывода как выхода, мы можем придать ему два значения:

// Устанавливает высокий уровень напряжения на 3 пине  
digitalWrite(3, HIGH); // Устанавливает низкий уровень напряжения на 3 пине
  digitalWrite(3, LOW);

При высоком уровне выход  работает как “источник питания” с напряжением 5 Вольт, при низком же уровне выход соединяется с землей МК. В двух этих режимах порт может выдать либо принять ток до 40мА. Это позволит подключать к плате Arduino маломощные нагрузки. При превышении тока в 40мА может выгореть либо отдельно порт, либо весь камень.

В качестве первого примера выполним некий “Hello, World!” в тематике Arduino – помигаем светодиодом. 

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

Для эксперимента нам понадобятся:

Плата Arduino, соединительные провода “папа-папа”, макетная плата на 400 контактов, светодиод, резистор 220 – 1000Ом.

Описание примера:

При установке высокого уровня (HIGH), на выводе D3 появляется напряжение, которое протекая через светодиод (LED1) заставляет его светиться. При установке низкого уровня (LOW), напряжение больше не подается и светодиод не горит. Резистор (R1) необходим для ограничения потребляемого светодиодом тока.

На реальной макетной плате всё будет выглядеть следующим образом:

Примечания по сборке:

Вывод D3 соединяется с анодом светодиода, а катод уходит на резистор. У резистора нет полярности и его можно устанавливать любой стороной.

Пример программного кода:

void setup() {   // Инициализируем цифровой pin 3 как выход
  pinMode(3, OUTPUT); } // void loop прокручивает все записанное в нем раз за разом:
void loop() {
  digitalWrite(3, HIGH); // Включаем светодиод (HIGH выставляет высокий уровень)
  delay(1000); // Ждем секунду
  digitalWrite(3, LOW); // Выключаем светодиод (LOW выставляет высокий уровень)
  delay(1000); // Ждем секунду
}

Чтобы, в случае необходимости перенесения светодиода на другой пин, не пришлось просматривать весь код и менять цифру 3 (номер нашего вывода) на какую либо другую, хорошим тоном будет изначально присвоить ему имя. 

// Присваиваем имя цифровому выводу 3 int led = 3; void setup() {   // Инициализируем цифровой pin 3 как выход
  pinMode(led, OUTPUT); } void loop() {
  digitalWrite(led, HIGH); // Включаем светодиод (HIGH выставляет высокий уровень)
  delay(1000); // Ждем секунду
  digitalWrite(led, LOW); // Выключаем светодиод (LOW выставляет высокий уровень)
  delay(1000); // Ждем секунду
}

2) Цифровые выходы с поддержкой ШИМ

ШИМ (Широтно-Импульсная Модуляция) или PWM (Pulse Width Modulation) представляет собой программное, завязанное на внутренний таймер контроллера, чередование высокого и низкого уровней на порту контроллера с задаваемой скважностью. ШИМ это очень полезная штука, которая пригодится для регулирования яркости светодиодов либо управления скоростью вращения моторов (Более подробно что такое ШИМ).

Не все цифровые выводы имеют поддержку ШИМ. У Arduino UNO их 6 (D3, D5, D6, D9, D10, D11). У других плат количество может отличаться. Смотрите в спецификации.

В программном коде скважность задается числом от 0(min) до 255(max)

// Устанавливает ШИМ сигнал на 3 пине со скважностью 150  
analogWrite(3, 150);

В качестве наглядного примера поупрявляем яркостью светодиода с помощью ШИМ модуляции.

Как уже говорилось, Arduino имеет на своем борту встроенный светодиод подключенный к выводу D13. Однако, этот вывод не имеет поддержки ШИМ. ШИМ поддержку имеет вывод D3. К нему, как и в предыдущем примере, мы подключим светодиод

Для эксперимента нам понадобятся:

Плата Arduino, соединительные провода “папа-папа”, макетная плата на 400 контактов, светодиод, резистор 220 – 1000Ом.

Описание примера:

При установке высокого уровня (HIGH), на выводе D3 появляется напряжение, которое протекая через светодиод (LED1) заставляет его светиться. При установке низкого уровня (LOW), напряжение больше не подается и светодиод не горит. Резистор (R1) необходим для ограничения потребляемого светодиодом тока.

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

Принципиальная схема остается такой же как и в первом примере.

На реальной макетной плате всё будет выглядеть следующим образом:

Примечания по сборке:

Вывод D3 соединяется с анодом светодиода, а катод уходит на резистор. У резистора нет полярности и его можно устанавливать любой стороной.

Пример программного кода:

// Присваиваем имя цифровому выводу 3  
int led = 3; void setup() {   // Инициализируем цифровой pin 3 как выход
  pinMode(led, OUTPUT); } void loop() {
  /* Задаем значение ШИМ равное 25 (10% от max)
   Иными словами (1/10 времени HIGH, 9/10 LOW)
   Такое мигание находится в диапазоне воспринимаемой человеком. 
   Глаз видит мигание */
  analogWrite(led, 25);   delay(4000); // Ждем 4 секунды   /* Задаем значение ШИМ равное 150 (60% от max)
   Иными словами (6/10 времени HIGH, 4/10 LOW)
   Частота смены картинки велика, выше воспринимаемой глазом человека, но не максимальна
   Глаз воспринимает как постоянно горящий светодиод с определенной яркостью */
  analogWrite(led, 150);   delay(4000);   /* Задаем значение ШИМ равное 255 (100% от max)
   Иными словами (10/10 времени HIGH, 0/10 LOW)
   При максимальном значении ШИМ светодиод горит постоянно */
  analogWrite(led, 255);   delay(4000);   // И для финального примера прогоним значения ШИМ от min до max
  for (int i = 0; i < 255; i++)   {     analogWrite (led, i);     delay(50);   }   for (int i = 255; i > 0; i–)
  {
    analogWrite (led, i);
    delay(50);
  }
}

3) Цифровые входы 

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

// Считываем значение с цифрового порта 4
  digitalRead(4);

В ответ получаем значения HIGH или LOW. 

Если к считываемому порту ничего не подключено, то функция digitalRead () может беспорядочно возвращать значения HIGH или LOW. Во избежание ложных срабатываний, входы необходимо подтягивать резистором 10-20кОм. При замыкании кнопки на землю – подтягивать к питанию, при замыкании на питание – к земле.

В данном примере считаем состояние кнопки (нажата/не нажата) и выведем в монитор порта.

Для эксперимента нам понадобятся:

Плата Arduino, соединительные провода “папа-папа”, макетная плата на 400 контактов, кнопка 6×6, резистор 10кОм.

Описание примера:

При нажатии на кнопку (S1) она будет замыкаться на линию +5V. Во избежание ложных срабатываний, порт контроллера притянут к земле резистором R1.

На реальной макетной плате всё будет выглядеть следующим образом:

Пример программного кода:

void setup() {
  Serial.begin(9600); // Скорость работы монитор порта
  pinMode(4, INPUT); // Инициализируем цифровой pin 4 как вход
} void loop() {
  int sensorValue = digitalRead(4); // Задаем переменную sensorValue для считывания состояния
  Serial.println(sensorValue, DEC); // Выводим состояние кнопки в порт
  delay(500); // Ждем пол секунды
}

 

Читать ранее:

•  Урок 0. Монитор порта

Читать далее:

•  Урок 2. Аналоговые входы

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

Источник: http://zelectro.cc/arduino_lesson_1

Аналоговые входы/выхода Arduino

На этом уроке мы закончим знакомиться с возможностями получения и передачи сигналов с помощью Arduino. Рассмотрим аналоговые входы и выходы. Для этого урока нам понадобится: Arduino, макетная плата, фоторезистор, резистор на 200 Ом, резистор на 10 кОм, светодиод и соединительные провода.

Если раньше все было просто – есть сигнал или нет, то теперь все будет гораздо хитрее. Аналоговым сигналом является, например, звук.

Если встать у дороги, где постоянно едут машины, уровень шума постоянно меняется. Однако современные компьютеры цифровые и работать могут только с цифровыми сигналами.

Как же тут быть? Для решения этой проблемы используется Аналого-Цифровые Преобразователи (АЦП).

Эти устройства преобразуют, как не трудно догадаться из названия, аналоговый сигнал в цифровой. Что было понятнее, разберем на примере. Arduino имеет 10 битный АЦП, т.е. подаваемый на вход сигнал может быть преобразован в цифровые значения от 0 до 1023.

Если подключить микрофон к аналоговому входу Arduino и попасть в место с идеальной тишиной, то будет значение 0, на улице днем -200-300, а если встать рядом с взлетающим самолетом – 1023. Цифры абстрактные, но теперь должно быть понятно, как это работает.

Мы можем любой плавный сигнал (звук, свет, напряжение) преобразовать в число от 0 до 1023.

На этом уроке мы соорудим прототип адаптивного светильника – т.е. чем вокруг будет темнее, тем ярче будет гореть светодиод.

Для этого мы используем фоторезистор. Его свойство в том, что он меняет свое сопротивление в зависимости от яркости освещения. Что бы использовать фоторезистор, мы соберем простой делитель напряжения. Эта штука используется постоянно, так что изучить ее действительно очень важно.

По сути это последовательное соединение двух резисторов. Только один из них не простой, а фоторезистор. 

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

Получается, что напряжение на участке будет меняться вслед за сопротивлением. 

Вот так это выглядит в собранном виде на Arduino:

Таким образом, мы сможем определить освещенность – чем больше света падает на фоторезистор, тем больше напряжения пойдет на вход. Под «входом» сейчас мы понимаем аналоговые входы:

В данном случаи мы используем первый.

Рассмотрим код:

int a=0; void setup() { Serial.begin(9600); } void loop() { a=analogRead(1); Serial.println(a); delay(100); }

Тут мы видим кое-что новое. Во-первых, аналоговые входы не нужно инициировать в блоке Setup(). Во-вторых, мы видим новую команду – Serial.

begin(9600); С помощью нее мы сообщаем плате, что будем обмениваться данными с компьютером – нам же нужно как-то увидеть, что у нас приходит на аналоговый вход? В основном цикле программы мы считываем сигнал с входа в переменную и отправляем ее на последовательный порт. Теперь получим эти данные на компьютере.

Отправим программу на Ардуино. После того, как она успешно запишется и начнет работать, необходимо вызвать монитор последовательного порта. Это маленький значек в правом верхнем углу:

Откроется новое окно, в котором мы увидим бегущие числа:

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

Гораздо интереснее наблюдать  эти изменения не на экране, а в реальном мире, поэтому мы соберем «адаптивный ночник»

Для этого просто добавим светодиод (как обычно через резистор на 200 Ом). 

Подключим его к 3 выходу. На ардуино нет отдельных аналоговых выходов, просто некоторые цифровые могут работать как аналоговые. На плате они помечены знаком «тильда». Третий выход как раз такой. 

Для начала давайте определим, какие минимальные и максимальные значения мы получаем. У меня получилось от 300 до 800. Помним, что АЦП Ардуино может выдавать от 0 до 1024. Обрежем крайние значения:

int a=0; void setup() { Serial.begin(9600); pinMode(3, OUTPUT); } void loop() { a=analogRead(1); if(a850) a=1024; Serial.println(a); analogWrite(3, 256- (a / 4)); delay(100); }

Теперь, если значения на входе падают ниже 300, светодиод гаснет, а если выше 800, горит на полную. Обратите внимание, что значения аналогового выхода лежат в диапазоне 0-256, поэтому мы делим приходящие с входа значения на 4. 

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

Источник: http://easy-robots.ru/lessons/urok-3

цифровые микросхемы – начинающим ( занятие_3 )

На этом занятии рас­смотрим (и попытаемся собрать) схемы четырех электронных приборов построенных на микросхеме К561ЛА7 (К176ЛА7).

Принципиальная схема первого при­бора показана на рисунке 1. Это мигаю­щий фонарь.

Микросхема вырабаты­вает импульсы, которые поступают на базу транзистора VT1 и в те моменты, когда на его базу поступает напряжение единичного логического уровня (через резистор R2) он открывается и включает лампу накаливания, а в те моменты, когда напряжение на выводе 11 микросхемы равно нулевому уровню лампа гаснет. График, иллюстрирую­щий напряжение на выводе 11 микросхемы показан на рисунке 1 А.

   Микросхема содержит четыре логических элемента “2И-НЕ”, входы которые соединены вместе. В результате получается четыре инвертора (“НЕ ). На первых двух D1.1 и D1.

2 собран мультивибратор, вырабатываю­щий импульсы (на выводе 4), форма которых показана на рисунке 1А. Частота этих импульсов зависит от пара­метров цепи, состоящей из конденсатора С1 и резистора R1.

Приблизительно (без учета параметров микросхемы) эту частоту можно рассчитать по формуле F = 1/(CxR).

Работу такого мультивибратора можно пояснить так : когда на выходе D1.1 единица, на выходе D1.2 — нуль, это приводит к тому, что конденсатор С1 начинает заряжаться через R1, а вход элемента D1.1 следит за напряжением на С1. И как только это напряжение достигнет уровня логической единицы, схема как-бы “переворачивается”, теперь на выходе D1.

1 будет ноль, а на выходе D1.2 единица. Теперь уже конденсатор станет разряжаться через резистор, а вход D1.1 будет следить за этим процессом, и как только напряжение на нем станет равно логическому нуля схема опять “перевернется”. В результате уровень на выходе D1.2 будут импульсы, а на выходе D1.1 тоже будут импуль­сы, но противофазные импуль­сам на выходе D1.

2 (рисунок 1А).

На элементах D1.3 и D1.4 выполнен усилитель мощности, без которого, в принципе, можно обойтись.

В данной схеме можно исполь­зовать детали самых разных номиналов, пределы, в которые должны укладывать параметры деталей отмечены на схеме. Например, R1 может иметь сопротивление от 470 кОм до 910 кОм, конденсатор С1 иметь емкость от 0,22 мкФ до 1,5 мкФ, резистор R2 — от 2 кОм до 3 кОм, таким же образом подписаны номиналы деталей и на других схемах.

   Лампа накаливания — от карманного фонаря, а батарея питания — либо “плоская” на 4,5В, либо “Крона” на 9В, но лучше если взять две “плоские”, включенные последовательно. Цоколевка (расположение выводов) транзисто­ра КТ815 показана на рисунке 1Б.

Второе устройство — реле времени, таймер со звуковой сигнализацией окончания установлен­ного временного про­межутка (рисунок 2). 

В основе лежит мульти­вибратор, частота кото рого сильно увеличена, по сравнению с лред- идущей конструкцией, за счет уменьшения емкости конденсатора. Мульти­вибратор выполнен на элементах D1.2 и D1.3.

Резистор R2 взять такой же как R1 в схеме на рисунке 1, а конденсатор (в данном случае С2) имеет значительно меньшую емкость, в пределах 1500-3300 пФ. В результате импульсы на выходе такого мультивибратора (вывод 4) имеют звуковую частоту.

Эти импульсы поступают на усилитель, собранный на элементе D1.4 и на пъезокрамический звукоизлучатель, который при работе мульти­вибратора издает звук высокого или среднего тона. Звукоизлучатель — пъезокерамический зуммер, например от звонка телефона-трубки.

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

Мультивибратор работает только тогда, когда на выводе 2 D1.2 будет единица, если ноль — мультивибратор не генерирует. Происходит это потому, что элемент D1.2 это элемент “2И-НЕ”, который, как известно (см.

занятие №1), отличается тем, что если на его один вход подать нуль, то на его выходе будет единица независимо от того, что происходит на его втором входе. Таким образом, когда на вывод 2 D1.

2 поступает нуль, этому элементу будет веера вно разряжен или заряжен конденсатор С2, не зависимо от того, что происходит на выводе 1, на выводе 3 будет единица. Если на вывод 2 подать единицу ситуация изменится на обратную и мульти­вибратор станет генерировать импульсы.

Управление мультивибратором происходит при помощи элемента D1.1. Для запуска реле времени нужно нажать на кнопку S1 и от­пустить её (замкнуть и разомкнуть её контак­ты). При этом конденсатор С1, при замыкании S1 разрядится и, при размыкании контактов S1 начнет заряжаться через R1. Все это время пока он заряжается уровень на входах D1.

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

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

Время, в течении которого заряжается С1 зависит от сопротивления R1 и чем R1 больше тем больше время.

Резистор R1 переменный, если на него накрепить круг со шкалой, проградуированной в секундах, поворачивая его вал, на который нужно надеть ручку, можно будет устанавливать время, через которое, после кратковременного нажатия и отпускания S1 должен прозвучать сигнал. Разместив это устройство в подходящем корпусе можно сделать несложное реле времени для фотопечати.

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

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

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

Принципиальная схема охранного устройства показана на рисунке 3.

    В данной схеме используются два мультивибратора, первый на элементах D1.1 и D1.2, вырабатывающий импульсы низкой частоты, такие как в “мигающем фонаре” (рисунок 1), второй на элементах D1.3 и D1.

4 вырабатывает звуковые импульсы, такие как в схеме на рисунке 2.

На выходе этого мультивибратора включен усилитель мощности на транзисторе VT1, в коллекторной цепи которого включен небольшой динамик от радиприемника (подойдет любой динамик) .

Раздел: [Теоретические материалы]

Источник: http://www.cavr.ru/article/5222-cifrovye-mikrosxemy—nachinayushhim-(-zanyatie_3-)

Добро пожаловать на наш сайт!

Мероприятия 68<\p>

Дистанционные курсы для самых маленьких Robotics and English («Роботехника + английский») начались. Родители, педагоги и наши юные исследователи с удовольствием сели за импровизированные парты и погрузились в мир новых слов и выражений.

Мероприятия 124<\p>

Знакома ситуация, когда набор для творчества есть, а идеи по его использованию подходят к концу? Методические рекомендации РОБОФИШЕК помогут в проведении увлекательных занятий по робототехнике с элементами проектной деятельности и командной работы.

Сен 24, 2018 Мероприятия 30<\p>

Мы продолжаем получать яркие фотографии от участников дистанционного курса Robotics and English («Роботехника + английский»). Наши самые маленькие…

Сен 24, 2018 Мероприятия 9<\p>

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

Сен 24, 2018 Мероприятия 12<\p>

Первый этап Олимпиады НТИ начался! Спешите – вы еще можете успеть принять участие. Регистрация и прием заявок продлятся до 30 октября 2018 г.

Сен 20, 2018 Мероприятия 68<\p>

Дистанционные курсы для самых маленьких Robotics and English («Роботехника + английский») начались. Родители, педагоги и наши юные исследователи с…

Сен 20, 2018 Мероприятия 46<\p>

Говорят, что понять значение какого-то очень важного события в жизни, должно пройти время. Сергею Викторовичу Косаченко, тренеру команды «A…

Сен 20, 2018 Мероприятия 36<\p>

Продолжается регистрация на открытый заочный творческий конкурс для детей младшего дошкольного возраста «ИКаРёнок с пелёнок» «Сохраняя традиции…

Сен 19, 2018 Мероприятия 29<\p>

Мы продолжаем знакомить вас с последними новинками конструкторского мира. На этот раз представляем электронный образовательный набор Robo & Block…

Сен 19, 2018 Мероприятия 18<\p>

Классический реактивный вертолёт летает, кружит, парит, выполняет подъём, снижение и неподвижно зависает в воздухе, повинуясь движениям опытного…

Сен 18, 2018 Мероприятия 46<\p>

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

Сен 14, 2018 Мероприятия 45<\p>

Смотрите, как удачно можно совместить спорт и интеллектуальную деятельность. Наталья Геннадьевна Мельникова и Наталья Александровна Король,…

Сен 14, 2018 Мероприятия 43<\p>

Продолжают поступать очень трогательные детские работы на конкурс «Эмблема ИКаР». Юные икарята вместе с родителями и педагогами присылают небольшие…

Сен 13, 2018 Мероприятия 52<\p>

Большая наука и важнейшие изобретения часто начинались с небольших, порою, забавных изобретений. Вспомните, какими неуклюжими и нелепыми были…

Сен 13, 2018 Мероприятия 49<\p>

Использование развивающих и дидактических игр с конструктором в работе с детьми с ОВЗ способствует совершенствованию конструктивных умений и…

Сен 12, 2018 Мероприятия 79<\p>

Напоминаем, что до начала онлайн-курсов «ИКаРё-Ok» («Роботехника + английский») осталось 3 дня!

Сен 12, 2018 Мероприятия 64<\p>

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

Сен 11, 2018 Мероприятия 45<\p>

Авиамоделизм существует, пока живут люди, «болеющие» небом. И не важно, кто это – обычный школьник, конструирующий и запускающий по выходным модели,…

Сен 11, 2018 Мероприятия 52<\p>

Огромна и многогранна Россия..! Понимаешь это, когда летишь за тысячи километров на протяжении нескольких часов, а внизу мелькают города, реки, моря.…

Сен 07, 2018 Мероприятия 46<\p>

Авиация, как любая другая наукоёмкая отрасль, стремительно меняется. Каждый год появляются истребители и самолёты нового поколения, летающие на…

Всероссийский учебно-методический центр образовательной робототехники объединяет преподавателей дошкольного, общего, профессионального образования, руководителей ресурсных центров по робототехнике, которые ведут научно-методические разработки в области применения образовательной робототехники в предметной среде.Хотите знать:

  • как написать конспекты уроков по физике, информатике, технологии, математики, согласно требованиям ФГОС, с использованием основ образовательной робототехники;
  • как организовать кружок по робототехнике в начальной школе;
  • как составить конспект занятия для кружка по робототехнике
  • как организовать деятельность воспитателя в детском саду по лего -конструированию и образовательной робототехнике
  • как стать участником конкурса технического творчества «Роботенок» для дошкольников; 
  • как организовать собственную команду и победить на Всемирной олимпиаде роботов (WRO); 
  • как стать слушателем курсов повышения квалификации по образовательной робототехнике; 
  • как купить книги по образовательной робототехнике?

 Образовательный портал фгос-игра.рф ответит на эти и многие другие вопросы, которые вы можете отправлять на нашу электронную почту: raormail@gmail.com

Источник: http://xn—-8sbhby8arey.xn--p1ai/?layout=edit&id=1737

Урок 8.4 Триггеры, регистры, счетчики

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

Логические элементы служат основой для создания более сложных цифровых устройств, одним из которых является триггер.

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

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

RS-триггер

Самый простой триггер можно получить из двух логических элементов 2ИЛИ-НЕ:

Cхемотехническое  обозначение:

Такая схема представляет собой асинхронный RS-триггер.

Он имеет два входа: S (set) – установка, R (reset) – сброс, и два выхода: Q (прямой)  и Q с чертой сверху (инверсный, НЕ_Q).

При подаче сигнала логического нуля на оба входа триггера, его выходы будут установлены в произвольное состояние. Допустим, Q = 0, а НЕ_Q =1. Если на вход S подать «1», то состояние выхода Q скачкообразно изменится на «1», а НЕ_Q  – на «0». И это состояние будет поддерживаться в независимости от того «0» или «1» подано на вход  S, что и является проявлением свойства памяти.

Соответственно, при подаче уровня «1» на вход R выход Q станет «0», а НЕ_Q – «1».

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

Ситуация, когда на входах R и S действует высокий уровень, является недопустимой, поскольку при этом схема не может работать корректно. В этом есть недостаток RS-триггера.

RS-триггер также можно построить из двух элементов И-НЕ, такие элементы более распространены:

Установка и сброс триггера на элементах 2И-НЕ, в отличие от предыдущего, производится низким уровнем входного сигнала.

Если к последней схеме добавить  еще два вентиля 2И-НЕ, то мы получим синхронный RS-триггер.

Изменение состояния такого триггера производится только при воздействии на вход С (Clock) синхронизирующего (тактового) импульса.

D-триггер

Немного изменив схему синхронного RS-триггера, можно получить  D-триггер. (D-delay, задержка). У него только один информационный вход D.

Если на этот вход подать «1», а затем подать импульс на вход C, то на выходе Q будет «1», если на вход подать «0», затем импульс на C, то на выходе Q будет «0». Таким образом, D-триггер осуществляет задержку информации, поступающей на вход.

Если вход D соединить с выходом НЕ_Q, то триггер будет менять свое состояние при каждом изменении состояния входа С от «0» к «1» . При изменении от «1» к «0» состояние триггера меняться не будет.

Таким образом, частота выходных импульсов будет вдвое меньше частоты входных импульсов. Такой триггер называется счетным или T-триггером. Делитель частоты используется очень широко в цифровой технике.

Существует разновидность синхронного RS-триггера, не имеющая запрещенной комбинации – JK-триггер. Он имеет три входа: J (вместо R), K (вместо S), и C. Если на оба информационных входа подана «1», то JK-триггер работает как счетный T-триггер с входом C.

Регистр хранения

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

Рассмотри трех битовый регистр хранения на D-триггерах:

Каждый триггер может хранить один разряд (бит) числа. Вход R служит для установки выходов всех триггеров в нулевое (исходное) состояние перед записью числа, которое подается на входы D0,D1 и D2. При подаче импульса на вход C производится запись информации с этих входов. Информация может храниться сколь угодно долго, пока на вход С не подаются импульсы и подается питание.

Регистр сдвига

Другой разновидностью регистров является регистр сдвига. Он предназначен для преобразования информации путем ее побитного сдвига в ту или иную сторону. На следующем рисунке приведена схема простейшего регистра сдвига информации вправо (по схеме):

В отличие от регистра хранения выход предыдущего триггера соединен с входом последующего. Информация в виде логического уровня подается на вход первого (крайнего слева) триггера. При воздействии импульса на входе C присутствующая на входе D информация записывается в первый триггер.

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

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

Счетчик

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

Простейший счетчик с последовательным переносом можно получить с помощью счетных T-триггеров:

Подачей импульса на вход R счетчик приводится в исходное состояние, когда на выходах Q1-Q3 – уровень логического нуля.

На вход C подаются импульсы для счета. С приходом заднего фронта первого импульса первый (левый) по схеме триггер устанавливается в «1». Если читать код справа налево, то он соответствует единице. Для нашего трехразрядного счетчика это код 001.

С приходом второго импульса в «1» переключается второй триггер, а первый переключается в «0». Таким образом, код на выходах счетчика будет 010, что соответствует  десятичной цифре 2. Следующий импульс установит код 011, то есть 3. Трехразрядный счетчик может досчитать до кода 111, что соответствует десятичной цифре 7.

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

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

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

 Из схемы видно, что на вход второго триггера счетный импульс поступит только тогда, когда на выходе первого триггера будет «1», а на третий – когда «1» будет на выходах и первого, и второго триггеров. Очевидно, что с увеличением числа разрядов необходимо увеличивать как число логических элементов И, так и число их входов, что, в свою очередь, является недостатком такого типа счетчиков.

Регистры и счетчики, в свою очередь, могут применяться для построения более сложных цифровых устройств: сумматоров, ОЗУ и ПЗУ (оперативных и постоянных запоминающих устройств),  АЛУ (арифметическо-логических устройств), входящих в состав процессоров, и так далее, к все более сложным цифровым устройствам.

В следующей серии статей мы начнем знакомство с микроконтроллерами – замечательным классом цифровых микросхем, которые являются настоящими компьютерами, умещающимися в одной микросхеме, и входящими входят в состав большинства электронных устройств, от кофемашины до космического корабля!

Источник: https://masterkit.ru/blog/lessons/urok-8-4-triggery-registry-schetchiki

Arduino. Управление цифровыми выходами

Управление выводом микроконтроллера — первый шаг, который позволит зажигать светодиоды, открывать транзисторы, передавать сигнал и т.д. В этой статье мы рассмотрим примеры программ, работающих с цифровыми выходами.

Подготовка к работе

Как уже говорилось выше, все наши примеры описаны и проверены для наших плат EduBoard и TutorShield. Плата EduBoard имеет 20 выводов, которые можно использовать как цифровые выходы. Максимальный ток каждого вывода – 20мА.

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

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

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

Установка перемычек

Первый пример

Теперь разберем пример, который мы использовали для проверки готовности платы к работе:

int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100); }

Запустите Arduino IDE, введите этот код и загрузите его. После завершения загрузки вы увидите, что светодиод, подключенный к 13-му выводу, начнет мигать с частотой 5 раз в секунду.

Это пример простейшей программы. Она состоит из трех частей:

  1. Объявление глобальных переменных
  2. Процедура настройки. Эта подпрограмма выполняется однократно при старте контроллера. В ней необходимо сконфигурировать основные параметры контроллера.
  3. Основной цикл. Пока контроллер включен – он будет выполнять циклически все, что написано в этой части программы.

В программе используется три функции:

  1. pinMode() – имеет синтаксис: pinMode(pin,mode). Предназначена для настройки режима работы вывода как выхода, или входа. Функция имеет два параметра pin (номер вывода) и mode (режим работы вывода). Выводов, которые могут быть настроены на выход у EduBoard 20, следовательно, параметр pin может принимать значения от 0 до 19. Параметр mode может принимать следующие значения: INPUT – конфигурирует цифровой вывод, как вход без подтяжки, OUTPUT – настройка вывода на выход, INPUT_PULLUP – вход с подтяжкой
  2. digitalWrite() – синтаксис: digitalWrite(pin,value). Если вывод настроен на выход эта функция позволяет выставить на выводе напряжение высокого или низкого уровня. Параметр pin такой же, как в предыдущей функции. Параметр value может иметь значение LOW или HIGH. Значение LOW приводит к тому, что на выводе формируется низкое напряжение, близкое к 0В. Значение HIGH выставляет на выводе напряжение питания, то есть 5В при питании от USB-порта.
  3. delay() – синтаксис: delay(ms). Функция вызывает задержку в программе. Единственный параметр задает время задержки в миллисекундах.

В предложенном примере сначала 13-й вывод настраивается на выход.

Затем циклически происходит включение светодиода высоким уровнем напряжения, задержка на 100мс, выключение светодиода, задержка на 100мс.

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

Второй пример

Теперь попробуйте ввести в окно редактора код, предложенный ниже:

int led1 = 13; int led2 = 12; void setup() { pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); } void loop() { digitalWrite(led1, HIGH); digitalWrite(led2, LOW); delay(1000); digitalWrite(led1, LOW); digitalWrite(led2, HIGH); delay(1000); }

Эта программа мигает уже двумя светодиодами.

Использование циклов

По такому принципу можно управлять любым количеством светодиодов, но код становится громоздким и сложным для чтения. Для улучшения качества кода имеет смысл применять циклические алгоритмы, например при помощи оператора for. Пример организации цикла for:

for (int x=0; x

Источник: http://www.customelectronics.ru/arduino-upravlenie-tsifrovyimi-vyihodami/

Урок 2. Плата Arduino UNO R3. Описание, характеристики

В статье рассказывается о контроллере Arduino UNO R3, выбранном для демонстрации программ уроков. Сейчас не обязательно внимательно изучать эту информацию. Рекомендую бегло просмотреть, чтобы иметь понятие об аппаратной части системы. В дальнейшем эту статью можно использовать как справочную информацию.

В качестве контроллера для программ уроков я выбрал плату Arduino UNO R3. Но ничего не мешает использовать и другие платы. Просто UNO R3 самый распространенный вариант контроллеров Ардуино.

Общая информация о контроллере.

Arduino UNO R3 выполнен на микроконтроллере  ATmega328. У него:

  • 14 цифровых портов входа-выхода ( 6 из них поддерживают режим ШИМ модуляции);
  • 6 аналоговых входов;
  • частота тактирования 16 МГц;
  • USB порт;
  • разъем питания;
  • разъем внутрисхемного программирования;
  • кнопка сброса.

У платы есть все необходимые компоненты для обеспечения работы микроконтроллера. Достаточно подключить USB кабель к компьютеру и подать питание. Микроконтроллер установлен на колодке, что позволяет легко заменить его в случае выхода из строя.

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

Тип микроконтроллера ATmega328P
Напряжение питания микроконтроллера 5 В
Рекомендуемое напряжение питания платы 7 – 12 В
Предельно допустимое напряжение питания платы 6 – 20 В
Цифровые входы-выходы 14 (из них 6 поддерживают ШИМ)
Выходы ШИМ модуляции 6
Аналоговые входы 6
Допустимый ток цифровых выходов 20 мА
Допустимый ток выхода 3,3 В 50 мА
Объем флэш памяти (FLASH) 32 кБ (из которых 0,5 кБ используется загрузчиком)
Объем оперативной памяти (SRAM) 2 кБ
Объем энергонезависимой памяти (EEPROM) 1 кБ
Частота тактирования 16 мГц
Длина платы 68,6 мм
Ширина платы 53,4 мм
Вес 25 г

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

Контроллер программируется из интегрированной среды программного обеспечения Ардуино (IDE). Программирование происходит под управлением резидентного загрузчика по протоколу STK500. Аппаратный программатор при этом не требуется.

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

Отличие от других контроллеров Ардуино.

Arduino UNO R3, в отличие от предыдущих версий, не использует для подключения к компьютеру мост USB-UART FTDI. Эту функцию в нем выполняет микроконтроллер ATmega16U2.

Система питания.

Плата UNO может получать питание от USB порта или от внешнего источника. Источник питания выбирается автоматически. В качестве внешнего источника питания может использоваться сетевой адаптер или батарея. Адаптер подключается через разъем диаметром 2,1 мм (центральный контакт – положительный). Батарея подключается к контактам GND и Vin разъема POWER.

Напряжение внешнего источника питания может быть в диапазоне 6 – 20 В. Но рекомендуется не допускать снижение напряжения ниже 7 В из-за нестабильной работы устройства. Также не желательно повышать напряжение питания более 12 В, т.к. может перегреется стабилизатор и выйти из строя. Т.е. рекомендуемый диапазон напряжения питания 7 – 12 В.

Для подключения питания могут быть использованы следующие выводы.

Vin Питание платы от внешнего источника питания. Не связано с питанием 5 В от USB или выходами других стабилизаторов. Через этот контакт можно получать питание для своего устройства, если плата питается от адаптера.
5 V Выход стабилизатора напряжения платы. На нем напряжение 5 В при любом способе питания. Питать плату через этот вывод не рекомендуется, т.к. не используется стабилизатор, что может привести к выходу микроконтроллера из строя.
3 V 3 Напряжение 3,3 В от стабилизатора напряжения на плате. Предельно допустимый ток потребления от этого вывода 50 мА.
GND Общий провод.
IOREF На выводе информация о рабочем напряжении платы. Плата расширения может считать значение сигнала и переключиться на режим питания 5 В или 3,3 В.

Память.

У микроконтроллера три типа памяти:

  • 32 кБ флэш  (FLASH);
  • 2 кБ оперативной памяти (SRAM);
  • 1 кБ энергонезависимой памяти (EEPROM).

Входы и выходы.

Каждый из 14 цифровых выводов может быть использован в качестве выхода или входа. Уровень напряжения на выводах 5 В. Рекомендовано вытекающий и втекающий ток каждого вывода ограничивать на уровне 20 мА. Предельно допустимое значение этого параметра составляет 40 мА. Каждый вывод имеет внутренний подтягивающий резистор сопротивлением 20-50 кОм. Резистор может быть отключен программно.

Некоторые выводы могут выполнять дополнительные функции.

Последовательный интерфейс: выводы 0 (Rx) и 1 (Tx). Используются для приема (Rx) и передачи (Tx) последовательных данных логических уровней TTL. Эти выводы подключены к выводам передачи данных микросхемы ATmega16U2, используемой в качестве моста USB-UART.

Внешние прерывания: выводы 2 и 3. Эти выводы могут быть использованы как входы внешних прерываний. Программно могут быть установлены на прерывание по низкому уровню, положительному или отрицательному фронту, или на изменение уровня сигнала.

ШИМ: выводы 3, 5, 6, 9, 10, 11. Могут работать в режиме ШИМ модуляции с разрешением 8 разрядов.

Последовательный интерфейс SPI: выводы 10(SS), 11(MOSI), 12(MISO), 13(SCK).

Светодиод: вывод 13. Светодиод, подключенный к выводу 13. Светится при высоком уровне сигнала на выводе.

Интерфейс TWI: вывод A4 или SDA и A5 или SCL. Коммуникационный интерфейс TWI.

У платы Arduino UNO есть 6 аналоговых входов, обозначенных A0-A5. Разрешающая способность аналогового цифрового преобразования 10 разрядов. По умолчанию, входное напряжение измеряется относительно земли в диапазоне 0-5 В, но может быть изменено с помощью вывода AREF и программных установок.

Еще 2 вывода платы имеют функции:

AREF. Опорное напряжение АЦП микроконтроллера.

RESET. Низкий уровень на этом выводе вызывает сброс микроконтроллера.

Коммуникационные интерфейсы.

Модуль Arduino UNO имеет средства для связи с компьютером, с другой платой UNO или с другими микроконтроллерами. Для этого на плате существует интерфейс UART с логическими уровнями TTL (5 В), связанный с выводами 0 (RX) и 1(TX). Микросхема ATmega16U2 на плате связывает UART интерфейс с USB портом компьютера.

При подключении к порту компьютера, появляется виртуальный COM порт, через который программы компьютера работают с  Ардуино. Прошивка ATmega16U2 использует стандартные драйверы USB-COM и установка дополнительных драйверов не требуется. Для операционной системы Windows необходим соответствующий .inf файл.

В интегрированную среду программного обеспечения Ардуино (IDE) включен монитор обмена по последовательному интерфейсу, который позволяет посылать и получать с платы простые текстовые данные.

На плате есть светодиоды RX и TX, которые индицируют состояние соответствующих сигналов для связи через USB (но не для последовательного интерфейса на выводах 0 и 1).

Микроконтроллер ATmega328 также поддерживает коммуникационные интерфейсы I2C (TWI) и SPI.

Автоматический (программный)  сброс.

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

Один из сигналов управления потоком данных (DTR) микросхемы ATmega16U2 подключен к выводу сброса микроконтроллера ATmega328 через конденсатор емкостью 0,1 мкФ.  Когда сигнал DTR переходит в низкое состояние, формируется импульс сброса микроконтроллера.

Это решение позволяет загружать программу одним нажатием кнопки из интегрированной среды программирования Андроид (IDE).

Но такая функция может приводить к отрицательным последствиям. При подключении платы UNO к компьютеру с операционной системой Mac Os X или Linux, микроконтроллер будет сбрасываться при каждом соединении программы с платой. В течение половины секунды на плате UNO будет запущен загрузчик.

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

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

На модуле UNO существует дорожка, которую можно перерезать для отключения функции автоматического сброса. Дорожка маркирована надписью ”RESET-EN”. Автоматический сброс также можно запретить, подключив резистор сопротивлением 110 Ом между линией питания 5 В и выводом RESET.

Защита USB порта от перегрузок.

В плате Arduino UNO линия питания от интерфейса  USB защищена восстанавливаемым предохранителем. При превышении тока свыше 500 мА, предохранитель разрывает цепь до устранения короткого замыкания.

Схема контроллера Arduino UNO.

Источник: http://radiocomponents.com.ua/index.php/articles/12-arduino/arduino-lessons/16-urok-2-plata-arduino-uno-r3-opisanie-kharakteristiki

Превращаем аналоговые входы Arduino в цифровые

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

PORTC

Пока АЦП не работает, доступны другие функции ног процессора, занятых под преобразование. 

Смотрим на картинку и видим, что аналоговые входы 0…5 находятся на ногах 23…28. Однако основная функция этих ног – PC0…5. 

PC означает PORTC, или по-русски “Порт Цэ”. Порт – это устройство ввода-вывода, где каждый бит может вводиться или выводиться отдельно, а может и в составе байта. У процессора ATmega328 три семибитных порта: B, C и D. Каждый пин порта управляется тремя битами в трех регистрах: DDxn, PORTxn, PINxn. Нам сейчас не интересны порты B и D, поэтому поглядим на регистры порта C. 

DDRC – регистр направления данных порта C

7 bit  6 bit  5 bit  4 bit  3 bit  2 bit  1 bit  0 bit 
DDRC DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0 

Каждый бит в этом регистре отвечает за направление данных на соответствующем пине:

0 – вход,

1 – выход. 

Значение по умолчанию – 0.

PORTC – регистр данных порта C

7 bit  6 bit  5 bit  4 bit  3 bit  2 bit  1 bit  0 bit 
PORTC PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 

Если пин сконфигурирован как вход, то при записи 1 в соответствующий бит этого регистра активируется подтягивающий резистор. При записи 0 подтягивающий резистор отключается. 

Если пин сконфигурирован как выход, то при записи 1 в соответствующий бит этого регистра пин подтягивается к питанию. При записи 0 пин притягивается к земле. 

Значение по умолчанию – 0.

PINC – Адреса входов порта C

7 bit  6 bit  5 bit  4 bit  3 bit  2 bit  1 bit  0 bit 
PINC PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0 

Каждый бит этого регистра содержит значение соответствующего пина. Прочитать значение можно независимо от значения DDxn.

Значение по умолчанию – не определено. 

Blink, 1 способ

Напишем всем известную программу Blink для аналогового входа (гы-гы). Подключим светодиодик к аналоговому входу 0:

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

void setup(){
  DDRC = (1<\p>

Источник: http://greenoakst.blogspot.com/2012/06/arduino_29.html

Ссылка на основную публикацию
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}