Управление irobot create с помощью беспроводного геймпада через arduino

Как подключить джойстик к Arduino

  • Arduino;
  • двухосевой джойстик;
  • 3 резистора номиналом 220 Ом;
  • 1 RGB или 3 обычных светодиода.

Джойстик – удобное и лёгкое в использовании устройство для передачи информации.

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

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

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

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

2Схема подключения аналогового джойстика к Arduino

Подключим джойстик по приведённой схеме. Аналоговые выходы X и Y джойстика подключим к аналоговым входам A1 и A2 Arduino, выход кнопки SW – к цифровому входу 8. Питание джойстика осуществляется напряжением +5 В.

Схема подключения аналогового джойстика к Arduino

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

Аналоговый джойстик, подключённый к Arduino

3Считывание показаний с аналогового джойстика

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

const int switchPin = 8; // кнопка джойстика const int pinX = A1; // Ось X джойстика const int pinY = A2; // Ось Y джойстика const int ledPin = 13; void setup() { pinMode(ledPin, INPUT); pinMode(pinX, INPUT); pinMode(pinY, INPUT); pinMode(switchPin, INPUT); digitalWrite(switchPin, HIGH); // включаем встроенный подтягивающий резистор Serial.begin(9600); } void loop() { int ledState = digitalRead(switchPin); // считываем состояние кнопки digitalWrite(ledPin, ledState); // вкл./выкл. светодиод по нажатию кнопки int X = analogRead(pinX); // считываем аналоговое значение оси Х int Y = analogRead(pinY); // считываем аналоговое значение оси Y Serial.print(X); // Выводим значение в Serial Monitor Serial.print(” “); // табуляция Serial.println(Y); } Значения X и Y с аналогового джойстика,выведенные в монитор последовательного порта

Объявим пины, зададим им режимы работы. Обратите внимание, в процедуре setup() мы подали на вход switchPin высокий уровень.

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

Это повлечёт за собой нежелательные хаотичные ложные срабатывания.

В процедуре loop() мы постоянно опрашиваем состояние кнопки и отображаем его с помощью светодиода на выходе 13. Из-за того, что вход switchPin подтянут к питанию, светодиод постоянно горит, а при нажатии кнопки гаснет, а не наоборот.

Далее мы считываем показания двух потенциометров джойстика – выхода осей X и Y. Arduino имеет 10-разрядные АЦП, поэтому значения, снимаемые с джойстика, лежат в диапазоне от 0 до 1023. В среднем положении джойстика, как видно на иллюстрации, снимаются значения в районе 500 – примерно середина диапазона.

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

4 Управление яркостью и цветом светодиодас помощью аналогового джойстика и Arduino

Обычно джойстик используют для управления электродвигателями. Но почему бы не использовать его, например, для управления яркостью светодиода? Давайте подключим по приведённой схеме RGB светодиод (или три обычных светодиода) к цифровым портам 9, 10 и 11 Arduino, не забывая, конечно, о резисторах.

Подключение RGB светодиода и джойстика к Arduino

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

Из-за того, что джойстик может быть не точно отцентрирован производителем и иметь середину шкалы не на отметке 512, а варьироваться в диапазоне примерно от 490 до 525, то светодиод может слегка светиться даже когда джойстик находится в нейтральном положении. Если вы хотите, чтобы он был полностью выключен, то внесите в программу соответствующие поправки.

Диаграмма распределения яркости красного, синего и зелёного каналов светодиода в зависимости от положения ручки джойстика

Ориентируясь на приведённую диаграмму, напишем скетч управления Arduino яркостью RGB светодиода с помощью джойстика.

const int pinRed = 9; const int pinGreen = 10; const int pinBlue = 11; const int swPin = 8; const int pinX = A1; // X const int pinY = A2; // Y const int ledPin = 13; boolean ledOn = false; // текущее состояние кнопки boolean prevSw = false; // предыдущее состояние кнопки void setup() { pinMode(ledPin, OUTPUT); pinMode(pinRed, OUTPUT); pinMode(pinGreen, OUTPUT); pinMode(pinBlue, OUTPUT); pinMode(pinX, INPUT); pinMode(pinY, INPUT); pinMode(swPin, INPUT); digitalWrite(swPin, HIGH); // включаем встроенный подтягивающий резистор } void loop() { if (isLedOn()) freeMode(); // если нажата кнопка и горит светодиод на пине 13, включаем режим “фонарик” else discoMode(); // иначе включаем “цветомузыку” } boolean isLedOn() { // ОПРЕДЕЛЯЕМ НАЖАТИЕ КНОПКИ if (digitalRead(swPin) == HIGH && prevSw == LOW) { ledOn = !ledOn; prevSw = HIGH; } else prevSw = digitalRead(swPin); digitalWrite(ledPin, ledOn); // включаем светодиод на пине 13 return ledOn; } void freeMode() { // РЕЖИМ “ФОНАРИК” int X = analogRead(pinX); // считываем положение джойстика int Y = analogRead(pinY); int RED = map(Y, 512, 1023, 0, 255); // маппинг значений int GREEN = map(X, 512, 1023, 0, 255); int BLUE = map(X, 511, 0, 0, 255); analogWrite(pinRed, RED); // включение каналов R,G,B analogWrite(pinGreen, GREEN); analogWrite(pinBlue, BLUE); } void discoMode() { // РЕЖИМ “ЦВЕТОМУЗЫКА” for (int i=0; i

Сначала объявим соответствие пинов и две переменные – ledOn и prevSw – для работы с кнопкой. В процедуре setup() назначим пинам функции и подключим к пину кнопки подтягивающий резистор командой digitalWrite(swPin, HIGH).

В цикле loop() определяем нажатие кнопки джойстика. При нажатии на кнопку переключаем режимы работы между режимом «фонарика» и режимом «цветомузыки».

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

Функция map() очень полезна и удобна в применении. Она переносит измеренные значения (отНижнего, отВерхнего) по осям джойстика в желаемый диапазон яркости (кНижнему, кВерхнему). Можно то же самое сделать обычными арифметическими действиями, но запись с помощью функции map() существенно короче.

В режиме discoMode() три цвета попеременно набирают яркость и гаснут. Чтобы можно было выйти из цикла при нажатии кнопки, каждую итерацию проверяем, не была ли нажата кнопка.

В результате получился фонарик из трёхцветного RGB светодиода, яркость свечения каждого цвета которого задаётся с помощью джойстика. А при нажатии на кнопку происходит включение режима «цветомузыка». Я сделал специальную печатную плату с Arduino Pro Mini и джойстиком, и у меня он используется в качестве ночника для ребёнка 🙂

Управление яркостью и цветом RGB светодиода с помощью аналогового джойстика, подключённого к Arduino

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

Источник: https://soltau.ru/index.php/arduino/item/384-kak-podklyuchit-dzhojstik-k-arduino

Управление машинкой через WiFi с помощью ESP8266 NodeMCU

Итак будем управлять двумя реверсивными (вращение в обе стороны) двигателями: основным и рулевым. Питать их будем от аккумулятора 3,7 В, но можно и до 12 В в принципе подавать, если согласовать питание контроллера или организовать его отдельным аккумулятором.

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

WiFi контроллер использован мой любимый , но можно использовать и меньший размером WeMos D1 mini.

Аккумулятор можно зарядить через микро-USB, после чего он питает драйвер двигателей напрямую и WiFi-контроллер через .

Код программы:

#include const char* ssid = “имя вашей сети вайфай”;const char* password = “пароль вашей сети”;int up = 2; //номера дискретных выходовint down = 14;int left = 4;int right = 12;// Create an instance of the server// specify the port to listen on as an argumentWiFiServer server(80);void setup() {  Serial.begin(9600);  delay(10);  //подготовка выходов  pinMode(up, OUTPUT);  digitalWrite(up, 0);  pinMode(down, OUTPUT);  digitalWrite(down, 0);  pinMode(left, OUTPUT);  digitalWrite(left, 0);  pinMode(right, OUTPUT);  digitalWrite(right, 0);    // Connect to WiFi network  Serial.println();  Serial.println();  Serial.print(“Connecting to “);  Serial.println(ssid);    WiFi.begin(ssid, password);    while (WiFi.status() != WL_CONNECTED) {    delay(500);    Serial.print(“.”);  }  Serial.println(“”);  Serial.println(“WiFi connected”);    //Запуск сервера  server.begin();  Serial.println(“Server started”);  //выводим IP адрес в монитор порта  Serial.println(WiFi.localIP());}void loop() {  //проверяем подключился ли клиент  WiFiClient client = server.available();  if (!client) {    return;  }    //Ожидаем пока клиент не пришлет какие-нибудь данные  Serial.println(“new client”);  while(!client.available()){    delay(1);  }    //Чтение первой строки запроса  String req = client.readStringUntil('
');  Serial.println(req);  client.flush();    //обработка команды  if (req.indexOf(“/gpio/up”) != -1){    digitalWrite(up, 1);    digitalWrite(down, 0);    delay(1000);    digitalWrite(up, 0);    digitalWrite(down, 0);    }  else if (req.indexOf(“/gpio/down”) != -1){    digitalWrite(up, 0);    digitalWrite(down, 1);    delay(1000);    digitalWrite(up, 0);    digitalWrite(down, 0);    }  else if (req.indexOf(“/gpio/left”) != -1){    digitalWrite(up, 1);    digitalWrite(down, 0);    digitalWrite(left, 1);    digitalWrite(right, 0);    delay(1000);    digitalWrite(up, 0);    digitalWrite(down, 0);    digitalWrite(left, 0);    digitalWrite(right, 0);    }    else if (req.indexOf(“/gpio/right”) != -1){    digitalWrite(up, 1);    digitalWrite(down, 0);    digitalWrite(left, 0);    digitalWrite(right, 1);    delay(1000);    digitalWrite(up, 0);    digitalWrite(down, 0);    digitalWrite(left, 0);    digitalWrite(right, 0);    }      else {    Serial.println(“invalid request”);  }    client.flush();  // подготовка к ответу  String s = “HTTP/1.1 200 OK
Content-Type: text/html

“;    s += “
UP
“;  s += “
LEFT     ”;  s += “RIGHT
“;  s += “
DOWN”;  s += ”
“;  // Send the response to the client  client.print(s);  delay(1);  Serial.println(“Client disonnected”);

}

Программа написана в Arduino IDE.  посмотрите по ссылке.После загрузки программы в контроллер, монитором порта можно прочитать IP-адрес, который плата получит после соединения с вашим WiFi-роутером.

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

Она будет выглядеть следующим образом:UP

LEFT     RIGHT

DOWN

При нажатии на ссылку UP, машинка проедет вперед в течении 1сек и остановится. При нажатии на DOWN, машинка 1 секунду будет ехать назад. LEFT – двигатель поворота повернёт колёса влево и машинка проедет 1 сек влево. То же самое и вправо при нажатии на RIGHT.

Вся эта система будет работать только при настроенной WiFi-точке доступа (WiFi-роутере), но в будущем мне интересно поиграться с , который сам будет организовывать точку доступа и выполнять функцию WEB-сервера, тоесть при заходе на его айпи из браузера, будем видеть web-страничку с элементами управления. Так же интересно организовать передачу данных с одного такого контроллера в другой посредством их автономной WiFi-сети.

Удобный плагин кэшбеэка браузерный плагин ePN Cashback 

Источник: http://electronica52.in.ua/proekty-arduino/upravlenie-mashinkoj-cherez-wifi

Подключение двухосевого джойстика к Arduino – RobotChip

Автор: Сергей Мир · 09.01.2017

Двухосевой джойстик (KY-023, PS2) — это модуль манипулятор, позволяющий пользователю управлять различными устройствами (шасси, роботами), состоявший из двух потенциометров и одной тактовой кнопкой.

Технические параметры 

  Напряжение питания: 5 В
  Поворот ручки: 360°
  Размеры: 34 мм х 26 мм х 34 мм

Общие сведения

Модуль двухосевого джойстика состоит из двух потенциометров на 10 кОм, определяющие положение осей X и Y изменение сопротивления осуществляется рычагом.

Средняя нога каждого потенциометра выведена на разъем J1 (контакты VRX и VRY), а вторая и третья нога подключена к питанию и массе.

Дополнительно установлена тактовая кнопка, показания снимаются с разъема J1 (контакт SW), так-же предусмотрено посадочное место для подтягивающего резистора (R1).

Принципиальную схему модуля, можно посмотреть ниже, резистор R1 указан без номинала.

Для считывания данных с выводов VRX (ось X) и VRY (ось Y) необходимо использовать аналоговые порт Arduino. (значение от 0 до 5В или от 0 до 1023), а для считывания данных с вывода RW используем цифровой порт (значение 0В и 5В или 0 и 1).

Так-как один вывод тактовой кнопки подключен к земле и при нажатии на джойстик вниз, происходит замыкание цепи, но возможно ложные срабатывания (наводки).

Для получения стабильных показаний, вывод RW необходимо подтянуть к питанию +5В, через подтягивающий резистор R1 или использовать встроенный подтягивающий резистор.

Подключение двухосевого джойстика к Arduino

Необходимые детали:
  Arduino UNO R3 x 1 шт.
  Провод DuPont x 1 шт.
  Кабель USB 2.0 A-B x 1 шт.
  Двухосевой джойстик (KY-023, PS2) x 1 шт.

Подключение:
Обратите внимание, в примере используется встроенный подтягивающий резистор (можно использовать и внешний, для этого необходимо добавить на модули резистор R1, типа размера 0805). Подключаем провода, VRX к аналоговому порту А0, VRY к аналоговому порту A1, SW к цифровому порту 3, осталось подключить питание +5В к выводу 5V и GND к GND на Arduino.

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

Тестировалось на Arduino IDE 1.8Дата тестирования 09.01.2017г.int Xin= A0;                       // Пин к которому подключен VRXint Yin = A1;                      // Пин к которому подключен VRYint KEYin = 3;                     // Пин к которому подключен VRY  pinMode (KEYin, INPUT);          // Установим вывод 5 как вход  Serial.begin (9600);             // Задаем скорость передачи данных  digitalWrite(KEYin, HIGH);       // Включаем подтягивающий резистор  int xVal, yVal, buttonVal;       // Создаем переменные  xVal = analogRead (Xin);         // Считываем значение с порта Xin  yVal = analogRead (Yin);         // Считываем значене с порта Yin  buttonVal = digitalRead (KEYin); // считываем значение с прта KEYin  Serial.print(“X = “);            // Выводим текст  Serial.println (xVal, DEC);      // Выводим значение переменной xVal  Serial.print (“Y = “);           // Выводим текст  Serial.println (yVal, DEC);      // Выводим значение переменной yVal  Serial.print(“Кнопка: “);        // Выводим текст  if (buttonVal == HIGH)           // Если buttonVal равно “1”, кнопка не нежата    Serial.println (“не нажата”);  // Выводим текст    Serial.println (“нажата”);     // Если buttonVal раво “0” кнопка нажатаdelay (500);                       // Ждем 500 мкс.

  Скачать скетч

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

Купить в Самаре и области
  Купить двухосевой джойстик (KY-023, PS2) в г. Самаре

Источник: http://blog.rchip.ru/podklyuchenie-dvukhosevogo-dzhoystika-k-arduino/

Джойстик Ардуино — подключение и скетч

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

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

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

Принцип работы джойстика

Аналоговый джойстик выглядит как ручка, которая закрепляется на шарнире с двумя потенциометрами, определяющими оси X и Y, и кнопкой Z. Наклон или поворот ручки вращает специальный подвижный контакт, из-за чего изменяется выходное напряжение.

Сам геймпад оснащен пружиной, благодаря которой плавно возвращается в первоначальное центральное состояние после отпускания его с какой-либо позиции. Устройство позволяет более плавно отследить степень отклонения от центральной (нулевой) точки.

Подключение джойстика к ардуино

Подключение джойстика к Arduino Uno выполняется по схеме, приведенной ниже.

На модуле имеется 5 выходов – Vcc, Gnd, X, Y и Key (обозначения могут различаться в зависимости от устройства).

Данные по оси X выводятся на вход А0, по оси Y – на А1. Для визуального контроля нажатия кнопки также можно подключить светодиод D11. Питание осуществляется напряжением 5 Вольт. Пин GND присоединяется к такому же пину на плате Ардуино. Контакт SW можно подсоединить к любому цифровому пину.

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

Как отслеживать текущее положение или направление джойстика

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

Узнать, в каком положении в текущий  момент находится устройство, можно в зависимости от значений потенциометров. Перемещение происходит по направлению находящихся перпендикулярно осей X и Y.

Считывание информации с геймпада происходит с помощью функции analogRead() – она показывает значения в диапазоне от 0 до 1023.

В качестве аргументов ей поступают номера пинов, к которым произведено подключение джойстика:

Serial.println(analogRead(A0)); // показывает положение X координаты

Serial.println(analogRead(A1)); // показывает положение Y координаты

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

const byte PIN_ANALOG_X = A0; // постоянная для координаты Х

const byte PIN_ANALOG_Y = A1; // постоянная для координаты Y

Определение направления движения джойстиком

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

По значению положений  осей X и Y можно узнать, находится ли джойстик в центре или произошло смещение. Значения во всех направлениях находятся в диапазоне от 0 до 1023, как говорилось ранее. В первую очередь приходит мысль, что центральная точка будет находиться примерно в значении 511-512. Это заключение не совсем правильно, так как абсолютно точное положение определить нельзя.

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

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

Полученные значения записываются в код в виде постоянных:

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 518;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

Следующим шагом будет преобразование координат в диапазон от -1 до 1.  Для X -1 – это перемещение влево, 0 – нет движения, 1 – вправо. По Y -1 – движение вниз, 0 – центральное значение, 1 – вверх. Изначально устанавливаем все значения в центр 0. Для проверки, происходит ли перемещение, используем выражения if/else.

Подводные камни в работе геймпада

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

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

Плата расширения JoyStick shield

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

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

Шилд содержит несколько  стандартных кнопок (4 обычных сбоку и кнопка выбора). В зависимости от модели, на плате могут быть добавлены разъемы для подключения модулей bluetooth или wifi. Традиционно, с помощью выходов пинов и гребенки можно подключать внешние устройства.

Заключение

Джойстик ардуино — незаменимая вещь во моих проектах. Благодаря этому виду датчиков вы можете добавить в свое устройство удобные и современные средства управления.

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

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

Источник: https://ArduinoMaster.ru/datchiki-arduino/dzhojstik-arduino/

Уроки Arduino: управление устройствами со смартфона для чайников

Когда-нибудь задумывались о том, чтобы управлять любыми электронными устройствами с помощью смартфона? Согласитесь, управлять роботом или любыми другими устройствами с вашего смартфона было бы очень круто.

Предлагаем простой урок для начинающих и чайников о том как с помощью Arduino через Bluetooth управлять смартфоном.

Если вам после этого урока захочется познакомиться с Arduino поближе – вы можете найти книги о нём здесь.

Шаг 1. Что нам необходимо

Устройства

Модуль – Bluetooth Module HC 05/06 Плата – Arduino Светодиод (LED) Резистор – 220Ω

Android-устройство

Программное обеспечение

Arduino IDE
Android Studio (на самом деле не нужно, т.к. приложение для Андроида вы найдете ниже)

Шаг 2. Как это работает

Обычно мы делаем этот шаг в конце, но, чтобы вы понимали к чему мы должны прийти – посмотрите на результат на этом промежуточном шаге. Также ниже мы опубликовали видео урока по шагам.

Шаг 3. Начинаем собирать схему

Цепь в нашем уроке настолько проста и мала, что нам нужно сделать всего несколько соединений:

Arduino Pins___________Bluetooth Module Pins
RX (Pin 0)___________________TX
TX (Pin 1)___________________RX
5V_________________________VCC
GND_______________________GND

Подключите минус светодиода к GND на Arduino, а плюс к контакту 13 через сопротивление 220 Ом – 1 кОм. В целом, на нашем рисунке ниже всё довольно наглядно.

Шаг 4. Загрузка программы в Arduino

Теперь нам нужно написать программу и загрузить её в наш Arduino. Если вы этого пока еще не умеете делать – скачайте книги здесь. Код ниже именно то, что нам нужно загрузить в Ардуино.

12345678910111213141516171819202122232425 /* Bluetooh Basic: LED ON OFF* Coder – Mayoogh Girish* Website – http://bit.do/Avishkar* Download the App : https://github.com/Mayoogh/Arduino-Bluetooth-Basic* This program lets you to control a LED on pin 13 of arduino using a bluetooth module*/char data = 0; //Variable for storing received datavoid setup(){Serial.begin(9600); //Sets the baud for serial data transmissionpinMode(13, OUTPUT); //Sets digital pin 13 as output pin}void loop(){if(Serial.available() > 0) // Send data only when you receive data:{data = Serial.read(); //Read the incoming data and store it into variable dataSerial.print(data); //Print Value inside data in Serial monitorSerial.print(”
“); //New lineif(data == '1') // Checks whether value of data is equal to 1digitalWrite(13, HIGH); //If value is 1 then LED turns ONelse if(data == '0') // Checks whether value of data is equal to 0digitalWrite(13, LOW); //If value is 0 then LED turns OFF}}

Шаг 5. Как происходит процесс

Модуль HC 05/06 работает по последовательному каналу связи. Андроид-приложение последовательно отправляет данные на модуль Bluetooth, когда вы нажимаете определенную клавишу. Bluetooth на другом конце получает данные и отправить на Arduino через TX-соединение модуля Bluetooth (RX-соединение Arduino) .

Код загруженный в Arduino проверяет полученные данные и сравнивает их. Если получена “1” – светодиод включается и выключается при получении “0”. Откройте монитор последовательного порта и наблюдайте полученные данные.

Шаг 6. Приложение для Андроид-устройств

В этом уроке мы не будем касаться создания приложений для устройств на основе Андроида. Вы можете скачать приложение на GitHub.

Как использовать приложение?

После того как мы подключились через Bluetooth – нам нужно скачать и установить приложение, которое при помощи смартфона

Источник: https://ArduinoPlus.ru/arduino-upravlenie-smartfonom/

Как подключить джойстик модуль к Ардуино

Опубликовано 07.06.2013 20:14:00

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

Компоненты для повторения (купить в Китае):

Arduino UNO, либо Arduino Nano, либо Arduino Mega

Джойстик 

Перемычки

Сервопривод SG90

Похожие вещи:

Шилд джойстик для платы Arduino

Рука на Arduino 

Подключение к Arduino

Итак, по направлениям отклонения H (horizontal) и V (vertical), на плате джойстика установлены два потенциометра. Основываясь на их показаниях джойстик отслеживает отклонения влево, вправо, вверх, вниз и выдает аналоговый сигнал от 0 до 1023.

Ось Z посажена на кнопку и выдает цифровой сигнал (вкл/выкл).

Джойстик модуль имеет пятипиновый разъем стандарта 2.54мм:

VCC: “+” питания.

V: Вывод выходного аналогового сигнала по оси Y

H: Вывод выходного аналогового сигнала по оси X

KEY: Вывод выходного сигнала с кнопки

GND: “-” питания

Подключение модуля предельно просто: 

VCC на + 5 Вольт Arduino.

GND на любой из GND пинов­­­ Arduino.

H и V на любые аналоговые входы Arduino (в примере H подсоединен к A4, V к A5).

KEY к любому цифровому пину Arduino (в примере подсоединено к D2).

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

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

const int Y_PIN = 5; // Потенциометр оси Y подключен к аналоговому входу 5
const int X_PIN = 4; // Потенциометр оси X подключен к аналоговому входу 4
сonst int BUTTON_PIN = 2; // Кнопка подключена к цифровому выводу 2
float stepSize = 180F / 1024; // Вычисляем шаг. градусы / на градацию
// Угол поворота джойстика 180 градусов, АЦП выдает значения от 0 до 1023, всего 1024 градации void setup()
{
Serial.begin(9600); // Скорость работы с монитором порта
} void loop()
{
int yVal = analogRead(Y_PIN); // Задаем переменную yVal для считывания показаний аналогового значения
int xVal = analogRead(X_PIN);
float yAngle = yVal * stepSize; // Переводим выходные данные yVal в угол наклона джойстика (от 0 до 180)
float xAngle = xVal * stepSize; // Аналогично xVal
boolean isNotClicked = digitalRead(BUTTON_PIN); // Считываем не было ли нажатия на джойстик
Serial.print(“Horisontal angle = “); // Выводим текст
Serial.println(xAngle); // Выводим значение угла
Serial.print(“Vertical angle = “);
Serial.println(yAngle);
if (!isNotClicked)
{
Serial.println(“Clicked”);
}
delay(1000);
}

Открыв монитор порта мы видим значения которые выдает наш джойстик. Опираясь на эти данные уже можно собрать что-то интересное.

Для большей наглядности подключим 2 сервопривода (D9, D10) и пищалку (D12).
При включении дуины сервоприводы принимают положение 90°. Одна отвечает за отклонения по оси X, вторая по оси Y. При нажатии на кнопку срабатывает пищалка.

#include 
Servo servo1;
Servo servo2;
const int Y_PIN = 5; // Потенциометр оси Y подключен к аналоговому входу 5 const int X_PIN = 4; // Потенциометр оси X подключен к аналоговому входу 4
const int BUTTON_PIN = 2;
const int SERVO1_PIN = 9;
const int SERVO2_PIN = 10;
const int LED_PIN = 13;
float stepSize = 180F / 1024; // Вычисляем шаг. градусы / на градацию
// Угол поворота джойстика 180 градусов, АЦП выдает значения от 0 до 1023, всего 1024 градации void setup()
{
  pinMode(LED_PIN, OUTPUT);
  servo1.attach(SERVO1_PIN);
  servo2.attach(SERVO2_PIN);
} void loop()
{
  int yVal = analogRead(Y_PIN); // Задаем переменную yVal для считывания показаний аналогового значения
  int xVal = analogRead(X_PIN);
  float yAngle = yVal * Step; // Переводим выходные данные yVal в угол наклона джойстика (от 0 до 180)
  float xAngle = xVal * Step; // Аналогично xVal
  servo1.write(yAngle); // Задаем сервоприводу полученный угол
  servo2.write(xAngle);   boolean isClicked = digitalRead(BUTTON_PIN);
  if (isClicked)
  {
    digitalWrite(LED_PIN, HIGH);   }
  else   {
    digitalWrite(LED_PIN, LOW);
  }
}

Набор для сборки 2ух осевого вращателя

Использованное в статье железо:

Плата Arduino, Сенсор шилд, Джойстик модуль, Пишалка модуль, Сервоприводы mini 9G

Соединительные провода “мама-мама”

Купить в России  джойстик модуль

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

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

Разрабатываем Z-Wave устройство для управления пылесосом iRobot Roomba

B сново интересное на Geektimes

Подписаться на наш блог.

Без лишних прелюдий сразу к делу. Квартира автоматизирована технологией Z-Wave, а пылесос iRobot Roomba 770 с сетью никак не связан и убирается по своему расписанию. Пришло время добавить пылесос в сеть Z-Wave! В этом мне поможет Z-Wave плата для разработчиков — Z-Uno.Какие преимущества дает автоматизация пылесоса с помощью Z-Wave?

  • Возможность удобно настроить расписание из Веб-интерфейса
  • Получить данные с пылесоса о батареи и сенсорах
  • Управлять из мобильного приложения
  • Использовать в сценариях имитирующих присутствие человека в доме

Документация по управлению iRobot Roomba открыта. Из нее следует, что общение с пылесосом происходит через разъем Mini-DIN по UART со скоростью 115200, уровень TTL 5В.

Вся документация по Z-UNO доступна на http://z-uno.z-wave.me/, в нее входят описание всех доступных функций, примеры, схема.

Z-Uno использует UART с уровнем TTL 3.3В, поэтому на линию Rx Z-UNO нужно поставить делитель напряжения из резисторов номиналом 1кОм и 2.2кОм.

При подключении Roomba к Arduino существует проблема, что Roomba выдает очень маленький ток на Tx, поэтому данные могут теряться, если подобная проблема будет на Z-UNO, то совместно с делителем напряжения нужно использовать транзистор:

http://www.irobot.com/~/media/MainSite/PDFs/About/STEM/Create/Arduino_Tutorial.pdf

Z-Uno может питаться от 3.3В, от 5В через штатный регулятор напряжения и от 7 — 20В через второй штатный регулятор напряжения. Во время уборки напряжение питания iRobot Roomba составляет примерно 14В, когда пылесос находится на базе напряжение поднимается до 20В. Если подключить Z-Uno к питанию iRobot Roomba напрямую, то линейный регулятор напряжения на Z-Uno начинает очень сильно греться, что приведет к отключению питания по температуре, поэтому нужно использовать либо радиатор, либо Switching регулятор напряжения. Я выбрал второй вариант и использую очень компактный китайский регулятор напряжения MP1584EN.
Краткие характеристики регулятора напряжения MP1584EN:

  • Входное напряжение: 4.5-28В
  • Выходное напряжение: 0.8-20В (регулируемое)
  • Выходной ток: 3А
  • Эффективность: 96%

Регулятор напряжения и делитель напряжения уместились на обратной стороне Z-UNO, при этом не увеличив габариты платы.

Подключение Z-Uno к iRobot Roomba 770

Уборка-Док станция

Со скетчом Уборка-Док станция Z-Uno по радио принимает команды ВКЛ/ВЫКЛ и по UART пылесосу отправляет команды Clean (Уборка) и Seek Dock (Искать док станцию). При получении радиокоманды Z-Uno один раз мигает встроенным светодиодом.

Радиокоманду Вкл/Выкл может отправить любое Z-Wave устройство: брелок, выключатель, контроллер и др.
Скетч Уборка-Док станция для Z-Uno по управлению пылесосом Roomba

После заливки скетча нужно добавить Z-Uno в Z-Wave контроллер.

Z-Uno отображается как выключатель с кнопками On и Off.

Чтение заряда батареи

Добавим к функции включение-выключение пылесоса функцию по считыванию заряда батареи.

Со скетчом Чтение заряда батареи Z-Uno периодически или по запросу отправляет заряд батареи пылесоса Roomba на Z-Wave контроллер.

Скетч Чтение заряда батареи пылесоса Roomba и Уборка-Док станция для Z-Uno

Теперь Z-Uno отображается как 2-х канальное устройство с функциями выключателя и многоуровнего датчика, т.е. отображаются кнопки On/Off и заряд в вольтах.

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

Z-Uno конечно же не единственный вариант радио управления Roomba, есть RooWiFi и много проектов типа Arduino+ESP8266, но если у вас уже есть Z-Wave сеть, то почему бы не использовать Z-Uno для управления пылесосом Roomba!

Источник: http://rus.z-wave.me/blog/2016/07/Zuno-irobot-roomba/

DIY: Робоавтомобиль под Arduino с управлением с помощью Android устройств. Пошаговая инструкция по созданию

Это простой проект робо-автомобиля, который управляется через Bluetooth. Здесь используется контроллер Arduino.

Для управления автомобилем используется Androidный гаджет со встроенным акселерометром. Наклон акселерометра вперед продвигает машину ехать вперед, наклон влево – машина поворачивает налево, наклон назад – машина едет назад. Всё предельно просто. Скорость движения или вращения зависит от того, насколько круто вы наклоните устройство.

Читайте также:  Функциональный генератор звукового диапазона

Чувствительность и значение наклона устанавливается в настройках приложения Android. Также предоставляется обычный способ управления – кнопки на экране. В дополнение ко всему можно реализовать сенсорное управление.
Самая важная часть проекта – Androidный гаджет с акселерометром и поддержкой Bluetooth.

Это может быть планшет, смартфон и др. В качестве примера используется дешевый китайский планшет “Ainol Aurora” с внешним USB-Bluetooth модулем, потому что здесь нет собственного, подключенным через USB-хост.Нам понадобится любое шасси с 2 или 4 двигателями постоянного тока.

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

1 – светодиодный Bluetooth маркер2 – контроллер движок L289N3 – двигатель переменного тока4 – модуль Bluetooth5 – литиево-полимерный аккумулятор6 – контроллер Arduino7 – выключатель для контроллера8 – выключатель для двигателя.Для этого проекта нужен Arduino-совместимый контроллер. Контроллер должен поддерживать 2 PWM и UART.

В качестве модуля Bluetooth используется дешевый китайский модуль HC-06 (6-8 $ на eBay). Инструкцию по подключению модуля Bluetooth для Arduino можно посмотреть здесь.

Вы можете использовать HC-05, HC-07 и другие серийные модули Bluetooth.В данном примере используется L298N Dual Bridge, контроллер для двигателя постоянного тока. На eBay эта штука стоит всего 4-5 долларов.

1 – термоусадочные трубки2 – переключатель3 – проводки4 – держатель для батарейВсе расчеты производятся в Android-приложении, и сразу же вычисляют значения 2‹2‹ PWM (широтно-импульсная модуляция) для левого и правого двигателя.

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

Примеры команд, передаваемых через Bluetooth, следующие:

L-255
R-120
L – команда для левого двигателяR – для правогоПрочерк означает вращения двигателя255 – PWM значение (для Arduino это максимальная скорость вращения) r – конец команды.Заданная команда будет двигать автомобиль вперед и слегка наклонять вправо, а правый двигатель будет медленно поворачиваться влево.L255
R-255
С этой командой левый двигатель будет вращаться вперед и назад вправо, заставляя машинку вращаться вокруг своей оси против часовой стрелки.H1
Эта команда требует дополнительный канал, к которому можно подключить, например, свет, звук и т.д.Символы команды L, R и H можно определить в настройках Android-приложения.В программе управления микроблок обеспечивает таймер, который выключает двигатель, если последняя команда продлилась больше нескольких секунд. Данные хранятся в памяти контроллера EEPROM и могут быть изменены с устройством Android. Диапазон этого параметра составляет от 0,1 секунд до 99,9 секунд. Эта установка может быть отключена. Для работы с EEPROM предоставляются команды: Fr – чтение значений 2‹2‹ и Fw – рекордные значения.На картинке представлена блок-схема устройства:Согласно данной картинке мы видим, что Arduino подключается к модулю Bluetooth и контроллеру двигателя с двумя или четырьмя подключенными двигателями.Приложение для Android было написано в Eclipse IDE. Все источники и сам проект Eclipse вы можете скачать ниже. Android версия на устройстве должна быть продвинутей, чем 3.0.Приложение содержит несколько особенностей. Основной особенностью является начальный экран с кнопками запуска различных режимов работы и параметров.Есть 3 режима управления Bluetooth-машинкой: от акселерометра, экранных кнопок и сенсорного управления.

Настройки приложения Android:

Настройки приложения CxemCar Android версии 1.0 изображены на рисунке.МАС-адресЧтобы установить соединение с Bluetooth-модулем автомобиля, вы должны установить MAC-адрес в настройках приложения. Но для этого, во-первых, необходимо настроить пару устройств на Androidном гаджете: откройте Настройки -> Bluetooth и нажмите “Search for devices (поиск устройств)”.

Когда гаджет находит ваш Bluetooth-модуль, нажмите на него и введите пароль для подключения (как правило, “1234”).Узнать MAC-адрес модуля Bluetooth можно из любого приложения, такого как Bluetooth Terminal. Для этого нажмите “Подключить устройство – Безопасность” и в появившемся окне нажмите кнопку “Поиск устройств”.

Программное обеспечение будет сканировать Bluetooth устройства и выводить их MAC-адреса.В схеме используются перемычки (на рисунке Jmp1), потому что с подключенным модулем Bluetooth невозможно загрузить схему Arduino.Припаяйте Bluetooth-модуль к контроллеру Arduino и проведите индикатор состояния. Модуль HC-06 должен быть помещен в термоусадочную трубку 10 мм.

Светодиодный маркер Bluetooth с ограничительным резистором также нужно поместить в термоусадочную трубку.В макетной платформе просверлите отверстия и поместите L298N двигатель. Arduino плата крепится с помощью двухсторонней липкой ленты.Между платформой автомобиля и макетом поместите 3 Li-Po батарейки по 3,7 В емкостью 1100 мАч.

Подключите контроллер и двигатели по отдельности: Arduino питается от одной батареи 3,7 В, а двигатели и контролеры двигателей L298N – от двух батарей 3,7 В, соединенных последовательно. Есть две позиции переключателя питания – первая позиция обеспечивает питание от батарей для потребителей, а другая – заряжает  терминалы.

Между контактами BT RX (2) и Arduino TX может потребоваться сдвиг уровней. Для этого вы можете использовать делитель напряжения: расчет 5V до 3,3.1 – светодиод и резистор2 – Arduino Nano v33 – модуль Bluetooth НС-06Для Arduino IDE 1.01 была написанная следующая программа, включая EEPROM:

#include “EEPROM.

h”#define D1 2          // direction of motor rotation 1#define M1 3          // PWM left motor#define D2 4          // direction of motor rotation 2#define M2 5          // PWM right motor#define HORN 13       // additional channel 1//#define autoOFF 2500  // milliseconds after which the robot stops when the connection#define cmdL 'L'      // UART-command for left motor#define cmdR 'R'      // UART-command for right motor#define cmdH 'H'      // UART-command for additional channel (for example Horn)#define cmdF 'F'      // UART-command for EEPROM operation#define cmdr 'r'      // UART-command for EEPROM operation (read)#define cmdw 'w'      // UART-command for EEPROM operation (write)char incomingByte;    // incoming datachar L_Data[4];       // array data for left motorbyte L_index = 0;     // index of array Lchar R_Data[4];       // array data for right motorbyte R_index = 0;     // index of array Rchar H_Data[1];       // array data for additional channelbyte H_index = 0;     // index of array Hchar F_Data[8];       // array data for  EEPROMbyte F_index = 0;     // index of array Fchar command;         // commandunsigned long currentTime, lastTimeCommand, autoOFF;void setup() {  Serial.begin(9600);       // initialization UART  pinMode(HORN, OUTPUT);    // additional channel  pinMode(D1, OUTPUT);      // output for motor rotation  pinMode(D2, OUTPUT);      // output for motor rotation  /*EEPROM.write(0,255);  EEPROM.write(1,255);  EEPROM.write(2,255);  EEPROM.write(3,255);*/  timer_init();             // initialization software timer}void timer_init() {  uint8_t sw_autoOFF = EEPROM.read(0);   // read EEPROM “is activated or not stopping the car when losing connection”  if(sw_autoOFF == '1'){                 // if activated    char var_Data[3];    var_Data[0] = EEPROM.read(1);    var_Data[1] = EEPROM.read(2);    var_Data[2] = EEPROM.read(3);    autoOFF = atoi(var_Data)*100;        // variable autoOFF ms  }  else if(sw_autoOFF == '0'){            autoOFF = 999999;  }  else if(sw_autoOFF == 255){    autoOFF = 2500;                      // if the EEPROM is blank, dafault value is 2.5 sec  }  currentTime = millis();                // read the time elapsed since application start}void loop() {  if (Serial.available() > 0) {          // if received UART data    incomingByte = Serial.read();        // raed byte    if(incomingByte == cmdL) {           // if received data for left motor L      command = cmdL;                    // current command      memset(L_Data,0,sizeof(L_Data));   // clear array      L_index = 0;                       // resetting array index    }    else if(incomingByte == cmdR) {      // if received data for left motor R      command = cmdR;      memset(R_Data,0,sizeof(R_Data));      R_index = 0;    }    else if(incomingByte == cmdH) {      // if received data for additional channel      command = cmdH;      memset(H_Data,0,sizeof(H_Data));      H_index = 0;    }       else if(incomingByte == cmdF) {      // if received data for EEPROM op      command = cmdF;      memset(F_Data,0,sizeof(F_Data));      F_index = 0;    }    else if(incomingByte == '
') command = 'e';   // end of line    else if(incomingByte == ' ') command = 't';   // end of line for EEPROM op    if(command == cmdL && incomingByte != cmdL){      L_Data[L_index] = incomingByte;              // store each byte in the array      L_index++;                                   // increment array index    }    else if(command == cmdR && incomingByte != cmdR){      R_Data[R_index] = incomingByte;      R_index++;    }    else if(command == cmdH && incomingByte != cmdH){      H_Data[H_index] = incomingByte;      H_index++;    }       else if(command == cmdF && incomingByte != cmdF){      F_Data[F_index] = incomingByte;      F_index++;    }       else if(command == 'e'){                       // if we take the line end      Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));      delay(10);    }    else if(command == 't'){                       // if we take the EEPROM line end      Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);    }    lastTimeCommand = millis();                    // read the time elapsed since application start  }  if(millis() >= (lastTimeCommand + autoOFF)){     // compare the current timer with variable lastTimeCommand + autoOFF    Control4WD(0,0,0);                             // stop the car  }}void Control4WD(int mLeft, int mRight, uint8_t Horn){  bool directionL, directionR;      // direction of motor rotation L298N  byte valueL, valueR;              // PWM M1, M2 (0-255)  if(mLeft > 0){    valueL = mLeft;    directionL = 0;  }  else if(mLeft 0){    valueR = mRight;    directionR = 0;  }  else if(mRight

  }

            

Данная программа использует библиотеку для работы с EEPROM AVR-памятью. Arduino плата USART с Bluetooth модулем получает готовые данные для левого и правого двигателя. Все основные расчеты производятся в приложении Android.Структуру проекта Eclipse вы можете увидеть на снимке.

Источник: https://robotics.ua/build_robot/medium_robots/1640-diy_arduino_with_roboavtomobil_under_control_with_the_help_of_android_devices

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