Моделирование автопилота на авиасимуляторе / Хабр

Моделирование автопилота на авиасимуляторе / Хабр Лодки

Ppjoy и vspe

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

Программа также содержит и драйвер, который определяется в системе как джойстик. Описание программы PPJOY можно найти в свободном доступе в интернете. Здесь можно найти программу, которая может работать с Win7. К сожалению, драйвер (64b), входящий в программу не имеет цифровой подписи и поэтому приходиться запускать систему в тестовом режиме.

Стандартный поток для PPJOY обычно формируется специальным модулем на каком-нибудь контроллере (например, PIC), который подключается к выходу “тренер” пульта ДУ, где применяется протокол PPM. В данном проекте поток в соответствие со стандартом RS232 формирует непосредственно программа автопилота.

Разработка начиналась с замыкания петли ОС через внешние физические COM — порты компьютера. При этом есть возможность использовать разные компьютеры для симулятора и автопилота, что актуально для очень слабых компьютеров. Сейчас, в связи с массовым отсутствием на компьютерах COM-портов и достаточно большой мощностью компьютеров, когда даже самые слабые компьютеры способны работать в такой системе, используется программа VSPE (Virtual Serial Port Emulator).

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

Автопилот

Программа автопилота написана в среде Borland C Builder 6. Поле “Приборы” (Рис.11) показывает исходные данные с датчиков, которые обновляются 20 раз в секунду. Здесь мы видим Pitch (Тангаж, градусы), который вычисляется по акселерометру в радиоуправляемом самолете, Roll (Крен, градусы), который вычисляется по продольно установленному гироскопу, измеряющему скорость разворота самолета.

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

Это хорошо видно в видеофрагментах испытаний: при разгоне самолет сразу же приподнимает хвост. Это отличие от реальности. А вот крен действительно вычисляется по угловой скорости разворота самолета. Вычисленное значение крена и демонстрируется в виде условного авиагоризонта в правом нижнем углу программы. (Рис.2)

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

Моделирование автопилота на авиасимуляторе / Хабр

Рис. 2

Checkbox GPS включает полет по маршруту, записанному в таблице. При этом поля Requested Heading, Requested Altitude и Requested Speed заполняются автоматически из структурыtypedef struct WPNT { int pid; int speed; int altitude; int heading; int latitude; int longitude; }WPNT;

В демонстрации структура содержит пример маршрута около аэропорта Los Angeles. (Рис.3)Для изменения маршрута необходимо изменить структуру и перекомпилировать проект. Если GPS выключен, то эти поля можно заполнить вручную. Активация значения в поле происходит при двойном клике мышки. Checkbox Return позволяет вернуться к точке, запомненной при нажатии кнопки Store Point.

Моделирование автопилота на авиасимуляторе / Хабр

Рис.3

WayPoint — номер точки маршрута; Distance — дистанция до следующей маршрутной точки; Calculated Time — приблизительное время достижения следующей точки (приблизительно потому что не учитывается скорость ветра), и далее — координаты GPS широта-долгота.

Параметры панели Autopilot:

Легенда: RW — change allowed, RO — only for look, RWP- change allowed partiallyKst_roll (RW) — статический коэффициент усиления петли ОС (обратной связи) по кренуKast_roll (RW) -астатический коэффициент усиления петли ОС по кренуKfar_roll (RW) — коэффициент триммирования по кренуKst_hdg (RW) — статический коэффициент усиления по удержанию курсаKаst_hdg (RW) — астатический коэффициент усиления по удержанию курсаTime (RO) — время в полете, секунды.

Requested Heading(RWP) — запрошенный курс, градусы (Вручную или из таблицы если GPS вкл)Head_Err (RO) — Ошибка по курсу, градусыRollTrim (RO) — поправка триммирования по кренуHVariation (RO) — скорость изменения курса гардус/сек.Keep_Roll (RO) — удерживаемый крен, градусыAilerons (RO) — положение элеронов самолетаRequested Altitude (RWP) — запрошенная высота, футы (Вручную или из таблицы если GPS вкл)

Alt_Err (RO) — Ошибка по высоте, футыPitchTrim (RO) — поправка триммирования по тангажуAVariation (RO) — скорость изменения высоты футов/сек.Keep_Pitch (RO) — удерживаемый тангаж (градусы)Elevator (RO) — положение руля высоты самолетаKstpitch (RW) — статический коэффициент усиления петли ОС по тангажуKast pitch (RW) -астатический коэффициент усиления петли ОС по тангажуKfar_ pitch (RW) — коэффициент триммирования по тангажуKst_alt (RW) — статический коэффициент усиления по удержанию высотыKаst_alt (RW) — астатический коэффициент усиления по удержанию высотыRudder (RO) — положение руля направления самолетаRequested Speed (RWP) — запрошенная скорость, миль/час(knots)

(Вручную или из таблицы (GPS вкл))Speed_Err (RO) — ошибка по скорости(knots)SVariation (RO) — скорость изменения скорости(knots)Keep_Throttle (RO) — удерживаемая скорость(knots)Throttle(RO) — положение РУДKst_speed (RW) — статический коэффициент усиления по удержанию скоростиKast_speed (RW)- астатический коэффициент усиления по удержанию скоростиCalibrate — ChechBox включения калибровки джойстикаAP0 — CheckBox режим 0 автопилота — удержание крена = 0 и тангажа = 0AP1- CheckBox режим 1 — удержание текущей высоты и текущего курсаAP2- CheckBox режим 2 — удержание курса и высоты по таблице (GPS вкл.) или по установленным значениям (GPS откл.)AT — CheckBox — автомата тяги

Около “авиагоризонта” есть слайдеры, с их помощью можно вручную управлять самолетом в случае отключения автопилота или автомата тяги. Справа с краю есть еще три слайдера, это составляющие управления рулем высоты: (выведены для отладки)

верхний — статическая составляющая TrackAltErrсредний — астатическая составляющая TrackVarErrсредний — составляющая триммирования TrackTrim

Смотрите про коптеры:  Steam Community :: Guide :: Stellaris FAQ [RU]

В поле внизу выводится текущий лог:

DST — дистанция до следующей точки в футах (C-B на рис. 13)HDG — курс непосредственно на следующую маршрутную точку (С-B на рис.13)THDG — курс, с которым следует подлететь к следующей точке (А-B на рис.13)OFF — смещение от требуемой траектории в футах (расстояние от точки С до линии AB Рис.13)SP — требуемая воздушная скорость полетаALT — требуемая высота полетаWP — следующая путевая точка

Посадка

Как известно, самым сложным элементом полета является посадка. Поскольку мой автопилот предназначен для радиоуправляемой модели, требования к посадке можно упростить. Здесь посадка выполняется в режиме планирования. При этом автопилоту дается задание при подлете к месту посадки (посадочный курс удерживается по GPS) удерживать скорость 0 и высоту, например, около 200 ft — немного больше чем высота полосы.

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

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

Самодельная система стабилизации самолета на базе arduino

С недавних пор я увлекся авиамодельной темой. И тут понеслась: построил самолет, купил аппаратуру. Предвидя быструю кончину первой модели не отходя от кассы начал собирать вторую, параллельно занимаясь в симуляторе. В общем оттягивал я свой первый реальный полет как мог, боясь с ходу разбить модель. И тут совершенно случайно, бороздя просторы алиэкспресса я наткнулся на интересную штуку – систему стабилизации полета. Это небольшое, размером с приемник, устройство, которое корректирует полёт самолета, делая его более плавным, сглаживая огрехи пилота. Начал искать, читать, говорят и правда хорошая вещь для новичков. Ну и тут я загорелся – хочу и хоть ты тресни. Вот только бюджет уже совсем поджимал… Казалось бы, самолет тот построить вопрос долларов на 10 потолок, а аппаратуру купи, аккумулятор купи, зарядное устройство для него купи, двигатель, регулятор, сервоприводы, пропеллеры … Короче в итоге набегает немало. Немного приуныв, но не сдавшись я начал чухать затылок: дык, я ж вроде паять умею. Начал искать и почти сразу же нашел небольшую статейку под названием “Система стабилизации самолета за 200 рублей”. Совсем скромная статейка со совсем скромной реализацией. Но это уже что-то. Полез на зарубежные форумы – и о чудо, да это же огромный проект с постоянным развитием! Решено, будем делать!

Проект называется MultiWii. Изначально это задумывалось как полетный контроллер для мультикоптеров на базе arduino, но со временем начало обрастать и совершенствоваться. Сейчас есть код, позволяющий ставить эту систему стабилизации и на самолеты, и на V крылья. Для самого простого исполнения, как в вышеупомянутой статье, потребуется всего 2 вещи: arduino и акселерометр. Все это можно спаять проводами, залить горячими соплями и работать будет. Но оно может и будет, вот только я так не работаю.

И так, для изготовления полноценного устройства понадобятся:

  • Arduino PRO Mini, 5V, Atmega 328
  • Модуль трехосевого акселерометра с гироскопом MPU-6050
  • Гребенка PLS
  • Кусок фольгированного стеклотекстолита, если делаете плату сами.
  • SMD резистор 500-1500 Om
  • Светодиод 3 мм любой.

Из инструментов:

  • Паяльник
  • Припой
  • Флюс (я советую F5)
  • USB – UART конвертер CP2102 или аналогичный
  • Модельный/канцелярский/монтажный нож для изготовления корпуса

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

Как я говорил проект растет и развивается. Так что сюда можно прикрутить еще Bluetooth модуль, для настройки контроллера с телефона, барометр, для контроля высоты, GPS для возврата модели “домой” при потере сигнала. Помимо этого так же растет тема про самодельные приемники на базе той же arduino и дешевого модуля связи A7105, который без хирургических вмешательств сопрягается с моей аппаратурой FlySky i6, так что в теории можно связать два этих проекта и забабахать полноценные “мозги” для самолета, планера или крыла. А в купе с вышеупомянутой бюджетной аппаратурой, которая спокойно прошивается с 6-и каналов на 14-ть – это выходит вообще просто идеальный вариант для новичка за свои деньги.

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

Arduino

Для прошивки ардуинки потребуется специальный USB – UART (TTL) конвертор, т.к. Arduino PRO Mini не имеет USB интерфейса. Пугаться этого не стоит, как правило, купить их можно там же, где продают arduino и модули. Вся разница в прошивке через этот конвертер лишь в том, что нужно умело нажимать кнопку ресета на самой ардуинке строго в момент окончания загрузки скетча, хотя есть конвертеры, которые дергают лапку ресета и сами. Описывать процедуру заливки скетча я не буду, уже миллион статей и видео на эту тему написано и снято.

Плата

Следующим шагом будет изготовление платы. Плата изготавливается любой доступной технологией или заказывается. Крайне советую лудить дорожки, лучше сплавом РОЗЕ или ВУДА, что бы слой был как можно меньше, большие токи тут не гуляют, а медь лучше защитить от лишней коррозии, дождь, снег, мало ли, все таки не домашнее устройство. Я делал плуту ЛУТ-ом, не лучший результат, можно много отмазываться плохим принтером, но кого это волнует)

Смотрите про коптеры:  Как переводится слово «квадрокоптер»

Первым делом впаиваем перемычки.

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

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

Один нюанс. На плате есть один резистор и светодиод. Резистор SMD формата можно выпаять из какой-то сломанной техники, номинал 500 Ом – 1.5 кОм. Светодиод можно взять обычный 3мм, у меня был прямоугольный, я впаивал его.

На этом этапе устройство в принципе уже можно подключать и настраивать, но как по мне выглядит незавершенным. Электроника для радиоуправляемых моделей уже давно приобрела модульный характер. По этому и это устройство считаю нужно довести уже до готового модуля, который легко монтировать в модель и подключать. Для этого ему нужен корпус. Хорошим вариантом было бы напечатать его на 3D принтере, пластик который используется для печати легкий и прочный. Но не у всех он есть. Можно сделать корпус методом термоформирования, в интернете масса информации как сделать простой станок для этого из пылесоса, бруса, и куска фанеры. Но для этого нужно делать болван, а это лень. По этому я пошел по пути наименьшего сопротивления. Да и такой способ будет под стать этой статьи – сделать как можно проще, используя минимум инструментов.

Корпус

По размерам платы я вырезал два кусочка пластика, в моем случае тонкий прозрачный ПВХ, но использовать можно что угодно, коробочку от диска например. Промежуточные фото не делал, но думаю и так понятно будет. Линейкой замерял расстояние до контактов на плате, и прорезал окошки для них на верхней части “корпуса”. Просверлил отверстия соосно отверстиям на плате и соединил все вместе импровизированными заклепками из трубочек от ушных палочек. Что бы сделать такую заклепку достаточно аккуратно подержать кончик трубочки в пламени зажигалки и когда образуется наплыв – прижать к корпусу этой зажигалки. С обратной стороны подрезаем трубки оставив пару миллиметров и делаем то же самое. В качестве проставок использовал отрезки трубки от капельницы. В итоге вышел такой вот бутерброд:

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

Настройка, калибровка

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

Выбираем его. Теперь нужно откалибровать акселерометр. Жмем кнопку READ и если все правильно – можем наблюдать показания с датчика в реальном времени. Кладем устройство на ровную поверхность и жмем CALIB_ACC. Обычно “ровная поверхность” это стол рядом с компьютером, так что когда жмете калибровку – руки от стола подальше. Кто не помнит, акселерометр – это датчик ускорения. Так что любые колебания или вибрации на калибровке положительно сказываться не будут. Но по возможности лучше все же калибровать на выставленной по уровню поверхности. Гироскоп калибруется сам при каждом включении, так что его калибровать не нужно. Единственное – при включении модель должна располагаться в неподвижном состоянии. То есть кладем модель на землю, включаем и не трогаем. Сразу происходит калибровка гироскопа. О калибровке сообщает светодиод, подписанный как STATUS.

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

Немного о других настройках.

PID

– это настройки самой стабилизации. В двух словах:

  • Р – это величина корректирующей силы, приложенной для того, чтобы вернуть модель в её начальное положение.
  • I – это период времени, в течение которого записываются и усредняются угловые отклонения.
  • D – это скорость, с которой модель вернется в её начальное положение.

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

Далее. TPA отвечает за значение этих PID настроек в зависимости от положения газа. При значении 0.00 значения PID будут одинаковыми при любом положении газа, то есть как предполагается, на любой скорости. При значении 1.00 при газе 100% PID будут равны нулю, то есть стабилизация будет отключена. При значении 0.5 на 100% газа пиды будут равны 50% соответственно. Тут уже настраивается под самолет и под свой стиль пилотажа, я пока оставил 50%.

Так же на канале AUX2 нужно настроить арминг. Арминг – термин коптерный. По человечьи это называется разблокировка двигателя. На самолетах это обычно реализуется через аппаратуру управления, но т.к. этот контроллер изначально коптерный – тут это сделали довольно жестко. В общем вешаем на AUX2 какой-то свободный тумблер, в программе ставим ARM на высокий уровень. Тут кто-то может захотеть схитрить и выставить разблокировку на всех уровнях AUX2, вот только не проканает. В таком случае мультивий откажется запускать двигатель вообще. Можно предположить что это баг, но я думаю что скоре защита. Самолет все таки только вперед летит, а куда рванет неуправляемый коптер одним Богам известно.

Смотрите про коптеры:  Дрон своими руками: Урок 3. Силовая установка.

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

Во вкладке SERVO можно произвести реверс сервомашинок, если это необходимо. Тут сделали как-то мудрено. Для начала нужно нажать SERVO. Появиться список сервомашинок и уровни. Если сейчас нажать на клавишу реверса и попытаться сохранить – ничего не сохраниться. Сначала нужно нажать GO LIVE, после чего при отклонении стиков можно будет наблюдать отклонение уровней в окне. Теперь нажимаем на кнопку реверса нужного канала и уже после этого жмем SAVE. Теперь все записалось.

//#define PPM_ON_THROTTLE

Стало так:

#define PPM_ON_THROTTLE

Так же нужно расскоментировать одну из этих строчек в зависимости от аппаратуры:

//#define SERIAL_SUM_PPM        PITCH,YAW,THROTTLE,ROLL,AUX1,AUX2,AUX3,AUX4,8,9,10,11 //For Graupner/Spektrum
//#define SERIAL_SUM_PPM        ROLL,PITCH,THROTTLE,YAW,AUX1,AUX2,AUX3,AUX4,8,9,10,11 //For Robe/Hitec/Futaba
//#define SERIAL_SUM_PPM        ROLL,PITCH,YAW,THROTTLE,AUX1,AUX2,AUX3,AUX4,8,9,10,11 //For Multiplex
//#define SERIAL_SUM_PPM        PITCH,ROLL,THROTTLE,YAW,AUX1,AUX2,AUX3,AUX4,8,9,10,11 //For some Hitec/Sanwa/Others

В моем случае это вторая строка, там где Futaba (при чем аппаратура у меня FlySky). Тут возможно придётся подбирать опытным путем, возможно и самому прописать нужную последовательность. Так или иначе ничего сложного в этом нет. Компилируем скетч и заливаем его по новой. Для возврата в обычный режим делаем обратное, комментируем строки, компилируем, заливаем. Хочу обратить внимание, после перезаливки скетча все настройки и калибровка будут сбиты, имейте это в виду.

Ещё одна распространённая проблема с которой как я понял часто сталкиваются, и я не исключение. После того как все собрали и настроили, подключили все рули – уплывает руль направления. Передернули ручки на пульте – вроде стал на место, но стоит немного покачать планер – опять уплывает в сторону, при чем на довольно серьезный угол. Лечится элементарно: в программе GUI устанавливаем значение YAW – I в ноль. Проблема сразу уходит.

Ну и видео работы:

Заключение

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

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

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

Русская тема на форуме. Но основную полезную информацию, которая там описана, а именно лечение руля направления я уже изложил. Тем не менее, мало ли.

Итоговая стоимость колеблется в пределах 4-8 долларов, смотря по какой цене купили ардуино и модуль, есть ли дома текстолит, есть ли программатор. При любом раскладе это в разы меньше рыночной стоимости от 20 долларов за устройство с такими же характеристиками. Лично мне оно обошлось в 2 доллара, запас ардуинок для таких вот целей был закуплен еще год назад, не было только модуля.

В прикрепленном ниже архиве скетч для ардуино, программа настройки MultiWiiConf для разных операционных систем, файл печатной платы (для открытия нужен SprintLayout не меньше 6-й версии) а так же печатная плата в формате PDF, для тех, у кого нет лазерного принтера дома (нужно печатать в размере 100%).

airplain_stabilization.rar

[10.64 Mb] (скачиваний: 550)

Всем удачи в творчестве!

Триммирование

Как оказалось, фраза “снять усилие со штурвала” оказалась не пустым звуком. Все попытки сделать систему обратной связи по тангажу так, чтобы точно удерживать высоту, и при этом охватить весь диапазон изменений режимов полета, оказались тщетны. Либо самолет входит неустойчивый режим с колебаниями по высоте при большом усилении петли ОС, либо не точно удерживает высоту.

Кроме того, при большой скорости подъемная сила может стать настолько большой, что руль высоты не справляется (из-за недостаточного коэффициента усиления петли ОС), и самолет начинает все время набирать высоту. Либо снижается, не имея возможности выйти на большие углы атаки при маленькой скорости. Таким образом применена система триммирования руля высоты со следующим алгоритмом:

Триммирование производится значительно медленнее, чем управление автопилота 0, поэтому самовозбуждение петли обратной связи не происходит.

Оцените статью
Добавить комментарий

Adblock
detector