Электрификация

Справочник домашнего мастера

Квадрокоптер из ардуино

Содержание

Программируем квадрокоптер на Arduino (часть 1)


Здравствуйте, хаброжители!
В этой серии статей мы с вами приоткроем крышку квадрокоптера чуть больше, чем этого требует хобби, а также напишем, настроим и запустим в воздух собственную программу для полетного контроллера, которым будет являться обычная плата Arduino Mega 2560.
У нас впереди:

  1. Базовые понятия (для начинающих коптероводов).
  2. PID-регуляторы с интерактивной web-демонстрацией работы на виртуальном квадрокоптере.
  3. Собственно программа для Arduino и настроечная программа на Qt.
  4. Опасные тесты квадрокоптера на веревке. Первые полёты.
  5. Крушение и потеря в поле. Автоматический поиск с воздуха средствами Qt и OpenCV.
  6. Окончательные успешные тесты. Подведение итогов. Куда дальше?

Материал объемный, но постараюсь уложиться в 2-3 статьи.
Сегодня нас ожидает: спойлер с видео, как наш квадрокоптер полетел; базовые понятия; PID-регуляторы и практика подбора их коэффициентов.

Зачем все это?

Академический интерес, который, кстати, преследует не только меня (1, 2, 3). Ну и, конечно же, для души. Я получил огромное удовольствие во время работы и ощутил настоящее непередаваемое счастье, когда «ЭТО» полетело с моей программой 🙂

Для кого?

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

НЕТ №1!

Не беритесь писать собственную программу для полетного контроллера, пока не попробуете готовые решения, которых сейчас достаточно много (Ardupilot, MegapirateNG, MiltiWii, AeroQuad и т.п.). Во-первых, это опасно! Чтобы управлять квадрокоптером без GPS и барометра нужна практика, а тем более, когда он глючит, переворачивается, летит не совсем туда, куда надо — а этого почти не избежать во время первых тестов. Во-вторых, вам будет во много раз легче программировать понимая, что нужно программировать и как оно должно работать в итоге. Поверьте: математика полета — лишь малая часть кода программы.

НЕТ №2!

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

Базовые понятия

Квадрокоптеры бывают разные, но всех их объединяют четыре несущих винта:

Не смотря на кажущуюся симметрию, пилоту очень важно различать, где у квадрокоптера перед (показан стрелкой). Здесь, как у радиоуправляемых моделей автомобилей: при команде «вперед» квадрокоптер летит не туда, куда смотрит пилот, а туда, куда направлен воображаемый нос квадрокоптера. Это таит в себе опасность: новичкам бывает трудно вернуть к себе подхваченный ветром аппарат, развернутый как-нибудь боком (мы, конечно, не говорим про полеты по камере от первого лица и про «умные» режимы полета с использованием компаса и GPS.) Решению этой проблемы частично могут помочь передние винты или лучи другого цвета, какой-нибудь шарик спереди или разноцветные светодиоды. Но все это оказывается бесполезным, когда пепелац стремительно превращается в точку над горизонтом.

Мы будем летать на раме квадрокоптера формы «X», потому что она мне больше нравится внешне. У каждой конструкции свои плюсы и свое предназначение. Кроме квадрокоптеров есть и другие мультикоптеры. Даже если не считать экзотические варианты, все равно их видов — целая куча!

Разберемся, как наш квадрокоптер устроен внутри, и чем же должен заниматься полетный контроллер, который мы планируем программировать.
Углы тангажа, крена и рыскания (pitch, roll, yaw) — углы, которыми принято определять и задавать ориентацию квадрокоптера в пространстве.
Иногда слово «угол» опускают и просто говорят: тангаж, крен, рыскание. Но согласно Википедии это не совсем точно. Полет квадрокоптера в необходимом направлении достигается изменением этих трех углов. Например, чтобы полететь вперед квадрокоптер должен наклониться за счет того, что задние моторы закрутятся чуть сильнее передних:
Газ квадрокоптера — среднее арифметическое между скоростями вращения всех моторов. Чем больше газ, тем больше суммарная тяга моторов, тем сильнее они тащат квадрокоптер вверх (НЕ ВПЕРЕД!!! «Тапок в пол» здесь означает наискорейший подъем). Обычно измеряется в процентах: 0% — моторы остановлены, 100% — вращаются с максимальной скоростью. Газ висения — минимальный уровень газа, который необходим, чтобы квадрокоптер не терял высоту.
Газ, тангаж, крен, рыскание — если вы можете управлять этими четырьмя параметрами, значит вы можете управлять квадрокоптером. Их еще иногда называют каналами управления. Если вы приобрели двухканальный пульт, с квадрокоптером вам не совладать. Трехканальный скорее подойдет для маленьких вертолетов: без управления креном летать можно, но на квадрокоптере — не удобно. Если вы хотите менять режимы полета, придется раскошелиться на пятиканальный пульт. Хотите управлять наклоном и поворотом камеры на борту — еще плюс два канала, хотя профессионалы используют для этого отдельный пульт.
Режимов полета существует много. Используется и GPS, и барометр, и дальномер. Но мы хотим реализовать базовый — режим стабилизации (stab, stabilize, летать в «стабе»), в котором квадрокоптер держит те углы, которые ему задаются с пульта не зависимо от внешних факторов. В этом режиме при отсутствии ветра квадрокоптер может висеть почти на месте. Ветер же придется компенсировать пилоту.
Направление вращения винтов выбирается не случайно. Если бы все моторы вращались в одну сторону, квадрокоптер вращался бы в противоположную из-за создаваемых моментов. Поэтому одна пара противостоящих моторов всегда вращается в одну сторону, а другая пара — в другую. Эффект возникновения моментов вращения используется, чтобы изменять угол рыскания: одна пара моторов начинает вращаться чуть быстрее другой, и вот уже квадрокоптер медленно поворачивается к нам лицом (ужас какой):

  • LFW — left front clockwise rotation (левый передний, вращение по часовой стрелке)
  • RFC — right front counter clockwise rotation (правый передний, вращение против часовой стрелке)
  • LBC — left back counter clockwise rotation (левый задний, вращение против часовой стрелке)
  • RBW — right back clockwise rotation (правый задний, вращение по часовой стрелке)

Скоростью вращения моторов управляет полетный контроллер (контроллер, мозги). Обычно это небольшая плата или коробочка с множеством входов и выходов. Существует огромное количество различных контроллеров с разным набором возможностей, разными прошивками, разными задачами. Вот лишь некоторые:
Обобщенной задачей полетного контроллера является несколько десятков раз в секунду выполнять цикл управления в который входит: считывание показаний датчиков, считывание каналов управления, обработка информации и выдача управляющих сигналов моторам, чтобы выполнять команды пилота. Именно это мы и собираемся запрограммировать.
Различных видов датчиков, которые можно задействовать, очень много. Мы будем использовать ставшие уже почти обязательными во всех квадрокоптерах трехосевой гироскоп и трехосевой акселерометр. Акселлерометр измеряет ускорение, гироскоп измеряет угловую скорость. Благодаря им полетный контроллер узнает текущие углы тангажа, крена и рыскания. Эти датчики бывают встроенными в полетный контроллер, а бывают внешними. Процесс вычисления трех углов по показаниям датчиков — тема для отдельной статьи. Но нам этого здесь знать не надо: за нас все сделает MPU-6050. Это небольшая плата, проводящая необходимые вычисления и фильтрации у себя внутри и выдающая по протоколу i2c уже почти готовые углы. Нам останется их считать, обработать с остальными данными и выдать управляющие сигналы моторам.
Моторы на мультикоптерах потребляют большие токи, поэтому полетный контроллер управляет ими не напрямую, а через специальные аппаратные драйвера, называемые регуляторами скорости (ESC, ре́гуль, е́ска). Эти регуляторы питаются от основного бортового аккумулятора, управляющий сигнал получают от контроллера, а на выходе у них стоит по три провода (A, B, C), которые непосредственно идут к моторам (каждому мотору — свой регуль!)
«Протокол» общения между регулятором и мотором нам не так важен, как «протокол» общения между полетным контроллером и регулятором, ведь нам предстоит из контроллера программно управлять регулятором. Бывают регуляторы, управляемые по i2c, но наиболее распространенные управляются сигналом прямоугольной формы с минимумом 0 вольт и максимумом 3-5 вольт (его называют ШИМ или PWM, а некоторые утверждают, что правильнее — PPM. Подробнее, например, ).
«Протокол» — это громко сказано: чтобы дать команду мотору вращаться с максимальной скоростью контроллер должен отправлять импульсы длительностью 2 миллисекунды, перемежающиеся логическим нулем длительностью 10 — 20 миллисекунд. Длительности импульса в 1 миллисекунду соответствует остановка мотора, 1.1 мс — 10% от максимальной скорости, 1.2 мс — 20% и т.п. Практически длительность нуля не играет никакой роли, важна только длительность самого импульса.
При всей кажущейся простоте, здесь кроется засада: полетные контроллеры бывают разные с разными настройками, регуляторы бывают разные, и минимум (1 мс) и максимум (2 мс) — не универсальны. В зависимости от множества факторов диапазон 1-2 мс может на деле оказаться 1.1 — 1.9 мс. Для того, чтобы регулятор и контроллер говорили абсолютно на одном языке существует процедура калибровки регуляторов. В ходе этой процедуры диапазоны регуляторов изменяются и становятся равными диапазону контроллера. Процедура зашита в программу каждого регулятора и включает в себя несколько простых шагов (шаги могут отличаться в зависимости от производителя — читайте инструкции!):

  • Отключить питание регулятора.
  • Снять с мотора пропеллер.
  • Подать на вход регулятора сигнал, соответствующий максимальной скорости вращения.
  • Подать на регулятор питание. Мотор при этом должен сохранять неподвижность без посторонней помощи.
  • Сделать паузу 1-2 секунды, дождаться характерного писка.
  • Подать на вход регулятора сигнал, соответствующий минимальной скорости вращения.
  • Сделать паузу 1-2 секунды, дождаться характерного писка.
  • Отключить питание регулятора.

После этого в регулятор будут занесены соответствующие границы интервала. При попытке взлететь с некалиброванными регуляторами последствия могут оказаться неожиданными: от внезапного рывка квадрокоптера в ближайшее дерево до полной неподвижности моторов при любом значении газа.
PWM с точно таким же принципом использует и бортовой приемник. Это небольшое устройство, получающая сигналы радиоуправления с земли и передающая их в полетный контроллер. Чаще всего в полетном контроллере для каждого канала управления (газ, тангаж, крен и т.п.) имеется свой вход на который поступает PWM. Логика взаимодействия проста: команда, например, «70% газ» непрерывно идет с земли на приемник, где преобразуется в PWM и по отдельному проводу поступает в полетный контроллер. Аналогично с тангажем, креном, рысканием.
Раз между приемником и контроллером свои товарищеские PWM отношения, то их тоже придется калибровать: пульты с приемниками бывают разные со своими диапазонами работы. Контроллер должен уметь подстраиваться. Процедуру калибровки радио, в отличие от калибровки регуляторов нам придется создавать самим как часть полетный программы. Общий план калибровки такой:

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

Итак: во время калибровки радио полетный контроллер запоминает диапазоны приемника по всем каналам управления; во время калибровки регуляторов диапазон полетного контроллера заносится во все регуляторы.
Помимо программы для полетного контроллера необходима еще одна программа: интерфейс настройки полетного контроллера. Чаще всего им является программа для PC, которая соединяется с полетным контроллером по USB и позволяет пользователю настраивать и проверять полетную программу, например: запускать калибровку радио, настраивать параметры стабилизации, проверять работу датчиков, задавать маршрут полета на карте, определять поведение мультикоптера при потере сигнала и многое другое. Мы свой интерфейс настройки будем писать на C++ и Qt в виде консольной утилиты. Вот она, если заглянуть в будущее:
Никто не застрахован от случайностей. Даже десятидюймовые пластиковые винты на маленьких моторах могут оставить кровавые синяки на коже, которые будут болеть еще неделю (проверено лично). Элементарно сделать себе новый макияж и прическу, если зацепить стик газа на пульте, пока несешь включенный квадрокоптер. Поэтому полетный контроллер должен обеспечивать хоть какую-то безопасность: механизм armed/disarmed. Состояние квадрокоптера «disarmed» означает, что моторы отключены и даже команда полного газа с пульта не имеет никакого эффекта, хотя питание подано. Состояние «armed» квадрокоптера означает, что команды с пульта выполняются полетным контроллером. В этом состоянии квадрокоптеры взлетают, летают и садятся. Квадрокоптер включается и должен сразу попасть в состояние disarmed на тот случай, если невнимальельный пилот включает его, когда стик газа на пульте находится не в нуле. Чтобы перевести коптер в состояние «armed» пилоту необхоимо сделать какой-то заранее оговоренный жест стиками пульта. Часто этим жестом является удержание левого стика в правом нижнем углу (газ = 0%, рыскание = 100%) втечении пары секунд. После этого полетный контроллер делает хотя бы минимальную самопроверку и при ее успешном прохождении «армится» (к полету готов!) Другим жестом (газ = 0%, рыскание = 0%) квадрокоптер «дизармится». Еще одна хорошая мера безопасности — автодизарм, если газ был на нуле втечении 2-3 секунд.

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

Аккумуляторы

Среди любителей и профессионалов многороторных систем наиболее распространены литий-полимерные аккумуляторы, как основные источники питания бортовой электроники и моторов. Их различают по емкости, напряжению и максимальной токоотдаче. Емкость, как обычно, измеряется в ампер-часах или миллиампер-часах. Напряжение измеряется в количестве «банок» аккумулятора. Одна «банка» — в среднем 3.7 вольт. Полностью заряженая «банка» — 4.2 вольта. Наиболее распространеты аккумуляторы с количеством банок от трех до шести. Максимальная токоотдача измеряется в амперах, а маркируется, например вот так: 25C. C — емкость аккумулятора, 25 — множитель. Если емкость равна 5 амперам, то такой аккумулятор может отдавать 25 * 5 = 125 ампер. Конечно же параметр токоотдачи лучше брать с запасом, но, в основном, чем он больше, тем дороже аккумулятор. Пример маркировки: 25C 3S 4500mah.
Каждая банка является отдельным аккумулятором. Все они спаяны последовательно. Для того чтобы равномерно заряжать все банки предусматривается баллансировочный разъем с доступом к каждой банке отдельно, и использутся специальные зарядные устройства.

Моторы, пропеллеры, регуляторы

Основной параметр бесколлекторного мотора — его kv. Это количество оборотов в минуту на каждый вольт поданного напряжения. Наиболее распространены моторы с kv от 300 до 1100. Kv ближе к 1000 обычно выбирают для малых квадрокоптеров (1-2 килограмма плюс 500 граммов полезной нагрузки) и ставят на них пластиковые пропеллеры до 12 дюймов в диаметре. На больших мультикоптерах (для поднятия хорошей и тяжелой фото-видео техники) или на долголетах (для рекордов по времени полета) обычно стоят моторы с низким kv (300-500) и огромными карбоновыми пропеллерами (15 — 20 дюймов в диаметре). Kv — не единственный важный параметр мотора: часто можно встретить целые таблицы зависимости мощности мотора и тяги от подаваемого напряжения и типа установленного пропеллера. Кроме того, каждый мотор рассчитан на свой диапазон напряжений (количество банок аккумулятора) и на свой максимальный ток. Если производитель пишет 3-4S, не стоит использовать его с 5S аккумуляторами. Это же касается и регуляторов.
Если мотор рассчитан на ток до 30А, то регулятор стоит рассчитывать на ток до 30 + 10А, чтобы не допускать перегревов. Некачественные или неподходящие регуляторы могут вызвать так называемые «срывы синхронизации» и остановку мотора в полете, и вы узнаете еще один мультироторный термин: «поймал планету.» Еще один важный момент — толщина и качество проводов. Неправильно рассчитанное сечение провода или плохой коннектор могут привести к пожару в воздухе.
Как видите, нюансов очень много. Я не перечислил даже половины, поэтому самому подобрать комплектующие для первого мультикоптера довольно трудно.

Математика стабилизации, ПИД-регуляторы (PID)

Если вы решили заняться мультикоптерами, то рано или поздно вам придется столкнуться с настройкой ПИД-регулятора, поскольку этот математический аппарат применяется почти во всех задачах стабилизации: стабилизация углов квадрокоптера в воздухе, полет и удержание позиции по GPS, удержание высоты по барометру, бесколлекторные механизмы стабилизации видеокамеры в полете (подвес камеры).
Вы приобретаете двухосевой подвес для камеры, ставите туда, например, GoPro, включаете и вместо стабилизации получаете конвульсии, вибрации и дергания, хотя все датчики откалиброваны и механические проблемы устранены. Причина — неверные параметры ПИД-регуляторов.
Вы собираете мультикоптер, калибруете датчики, регуляторы, радио, все проверяете, пытаетесь взлететь, а он такой унылый в воздухе, что его даже легким ветерком переворачивает. Или наоборот: он такой резкий, что внезапно срывается с места и крутит тройное сальто без разрешения. Причина все та же: параметры ПИД-регуляторов.
Для многих устройств использующих ПИД-регуляторы существуют инструкции по настройке, а то и несколько в добавок к многочисленным видеонструкциям от самих пользователей. Но чтобы легче ориентироваться в этом многообразии полезно понимать, как же внутри устроены эти регуляторы. Кроме того, мы же собираемся писать собственную систему стабилизации квадрокоптера! Предлагаю вместе со мной самим заново «изобрести» и «на пальцах» понять формулу ПИД-регулятора. Для тех, кому больше нравится сухой математический язык, я рекомендую Википедию, английскую статью, т.к. в русской пока не так подробно изложен материал.
Будем рассматривать квадрокоптер в двумерном пространстве, где у него есть только один угол — угол крена, и два мотора: левый и правый.
В полетный контроллер непрерывно поступают команды с земли: «крен 30 градусов», «крен -10 градусов», «крен 0 градусов (держать горизонт)»; его задача — как можно быстрее и точнее их выполнять с помощью моторов с учетом: ветра, неравномерного распределения веса квадрокоптера, неравномерного износа моторов, инерции квадрокоптера и т.п. Таким образом, полетный контроллер должен непрерывно решать задачу, какую скорость вращения подавать на каждый мотор с учетом текущего значения угла крена и требуемого. Непрерывно — это, конечно, громко сказано. Все зависит от вычислительных возможностей конкретного железа. На Adruino вполне можно одну итерацию цикла обработки и управления уместить в 10 миллисекунд. Это значит, что раз в 10 миллисекунд будут считываться показания углов квадрокоптера, и на их основе будут отправляться управляющие сигналы к моторам. Эти 10 миллисекунд называют периодом регулирования. Понятно, что чем он меньше, тем чаще и точнее происходит регулирование.
Уровень газа поступает из приемника в контроллер. Обозначим его . Напомню, что это среднее арифметическое между скоростями вращения всех моторов, выраженное в процентах от максимальной скорости вращения. Если и — скорости вращения левого и правого моторов, то:
где — реакция квадрокоптера (усилие), которое создает момент вращения за счет того, что левый мотор вращается на быстрее, чем газ, а правый — на столько же медленнее. может принимать и отрицательные значения, тогда правый мотор закрутится быстрее. Если мы научимся вычислять эту величину на каждой итерации цикла обработки, значит мы сможем управлять квадрокоптером. Понятно, что как минимум должно зависеть от текущего угла крена () и желаемого угла крена (), который поступает с пульта управления.
Представим ситуацию: поступает команда «держать горизонт» ( = 0), а квадрокоптер имеет крен влево:
— разность (ошибка) между и , которую контроллер стремится минимизировать.
Чем больше разность между желаемым углом крена и текущим, тем сильнее должна быть реакция, тем быстрее левый мотор должен закрутиться относительно правого. Если это записать с использованием наших обозначений:
Здесь P — коэффициент пропорциональности. Чем он больше, тем сильнее будет реакция, тем резче квадрокоптер будет реагировать на отклонение от требуемого угла крена. Эта интуитивно понятная и простая формула описывает работу пропорционального регулятора. Суть элементарна: чем сильнее квадрокоптер отклонился от требуемого положения, тем сильнее надо пытаться его вернуть. К сожалению, эту формулу придется усложнить. Главная причина — перерегулирование.
За несколько десятков миллисекунд (несколько итераций цикла обработки) под воздействием пропорционального регулятора квадрокоптер вернется в требуемое (в данном случае горизонтальное) положение. Все это время ошибка и усилие будут иметь один и тот же знак, хоть и становиться все меньше по модулю. Набрав какую-то скорость поворота (угловую скорость) квадрокоптер просто перевалится на другой бок, ведь никто его не остановит в требуемом положении. Все равно что пружина, которая всегда стремится вернуться в начальное положение, но если ее оттянуть и отпустить — будет колебаться, пока трение не возьмет верх. Конечно, на квадрокоптер тоже будет действовать трение, но практика показывает, что его не достаточно.
По этой причине в пропорциональный регулятор нужно добавить еще одно слагаемое, которое будет тормозить вращение квадрокоптера и препятствовать перерегулированию (переваливанию в противоположную сторону) — своего рода имитация трения в вязкой среде: чем быстрее поворачивается квадрокоптер, тем сильнее надо пытаться его остановить, конечно, в разумных пределах. Скорость вращения (скорость изменения ошибки ) обозначим как , тогда:
где D — настраиваемый коэффициент: чем он больше, тем сильнее останавливающее усилие. Из школьного курса физики всплывают смутные воспоминания, что скорость изменения любой величины — производная этой величины по времени:
.
И вот пропорциональный регулятор превращается в пропорционально-дифференциальный (пропорциональное слагаемое и дифференциальное):
.
Ошибку вычислить легко, ведь на каждой итерации мы знаем и ; P и D — настраиваемые перед запуском параметры. Для вычисления производной (скорости изменения ) необходимо хранить предыдущее значение, знать текущее значение и знать время, которое прошло между измерениями (период регулирования). И вот она — физика шестого класса школы (скорость = расстояние / время):
.
— период регулирования; — значение ошибки с предыдущей итерации цикла регуляции. Кстати, эта формула — простейший способ численного дифференцирования, и он нам здесь вполне подойдет.
Теперь у нас есть пропорционально-дифференциальный регулятор в плоском «бикоптере», но осталась еще одна проблема. Пусть левый край будет весить чуть больше правого, или, что то же самое, левый мотор работает чуть хуже правого. Квадрокоптер чуть наклонен влево и не поворачивается обратно: дифференциальное слагаемое равно нулю, а пропорциональное слагаемое хоть и принимает положительное значение, но его не хватает, чтобы вернуть квадрокоптер в горизонтальное положение, ведь левый край весит чуть больше правого. Как следствие — квадрокоптер будет все время тянуть влево.
Необходим механизм, который бы отслеживал такие отклонения и исправлял их. Характерной особенностью таких ошибок является то, что они прявляют себя со временем. На помощь приходит интегральное слагаемое. Оно хранит сумму всех ошибкок по всем итерациям цикла обработки. Как же это поможет? Если пропорционального слагаемого не достаточно, чтобы исправить маленькую ошибку, но она все равно есть — постепенно, со временем, набирает силы интегральное слагаемое, увеличивая реакцию и квадрокоптер принимает требуемый угол крена.
Тут есть нюанс. Предположим равна 1 градусу, цикл регулирования — 0.1с. Тогда за одну секунду сумма ошибок примет значение 10 градусов. А если цикл обработки — 0.01с, то сумма наберет аж 100 градусов. Чтобы за одно и тоже время интегральное слагаемое набирало одно и тоже значение при разных периодах регулирования, полученную сумму будем умножать на сам период регулирования. Легко посчитать, что в обоих случаях из примера получается сумма в 1 градус. Вот оно — интегральное слагаемое (пока без настраиваемого коэффициента):
.
Эта формула — не что иное, как численный интеграл по времени функции в интервале от нуля до текущего момента. Именно поэтому слагаемое называется интегральным:
,
где T — текущий момент времени.
Пришло время записать окончательную формулу пропорционально-интергрально-дифференциального регулятора:
,
где — один из настраиваемых параметров, которых теперь трое: . Эта формула удобна в применении из программного кода, а вот формула, которая приводится в учебниках:
.
Существует несколько ее вариаций, например, можно ограничить модуль интегрального слагаемого, чтобы он не превысил определенный допустимый порог (мы так и будем делать).

Практика

Ну а теперь пришло время для практики подбора коэффициентов. Читателям предлагается JavaScript-страничка с виртуальным квадрокоптером, который он уже видел на картинках: подбор параметров PID-регулятора для квадрокоптера (JSFiddle). При первом запуске сразу видно перерегулирование — колебания вокруг требуемого положения. Когда колебания останавливаются, можно наблюдать эффект, что пропорциональный коэффициент не справляется с ошибкой из-за «несимметричного» квадрокоптера (задается галочкой «Asymmetry»). Для настройки доступны параметры P, I, D. Теперь вы знаете что с ними делать. «Скролом» под квадрокоптером можно управлять требуемым значением крена. «Interval (ms):» — интервал регулирования. Уменьшать его — «читерство», но посмотреть как он влияет на качество стабилизации — очень полезно.

Для любителей «чистой» математики можно предложить настроить абстрактный ПИД-регулятор
Введенные параметры автоматически не применяются: нужно жмакать «Apply». Пара небольших советов: если вам кажется, что квадрокоптер слишком медленно реагирует на управление — можно увеличить P, но слишком большое значение P может привести к перерегулированию. С перерегулированием поможет справиться параметр D, но слишком большие значения приведут к частым колебаниям, или опять к перерегулированию. Параметр I, обычно, в 10 — 100 раз меньше, чем параметр P т.к. его сила в накоплении во времени, а не в быстром реагировании.
Ручная настройка ПИД-параметров требует практики. Существуют аналитические методы их вычисления, но они требуют хорошей подготовки и точного знания многих параметров конкретной настраиваемой системы. Как среднее между ручным подбором и аналитическим вычислением есть широкий ряд эмпирических методов, предложенных различными исследователями.
В нашем 2D квадрокоптере меняется только один угол — угол крена. В настроящем 3D квадрокоптере потребуется три независимых ПИД-регулятора для каждого из углов, а управление конкретным мотором будет представлять сумму усилий по всем регуляторам.

Заключение первой части

В этой статье мы познакомились с базовыми понятиями: квадрокоптер и принцип полета, тангаж, крен, рыскание, газ, газ висения, режим полета stabilize, полетный контроллер, гироскоп, акселерометр, регулятор скорости, ШИМ, калибровка регуляторов, калибровка радио, бортовой приемник, интерфейс настройки полетного контроллера, состояния armed/disarmed, автодизарм.
После этого мы заново изобрели формулу ПИД-регулятора немного каснувшись численного дифференцирования и интегрирования, и на своей шкуре испытали, как настраивать параметры P, I, D на виртуальном квадрокоптере.
Теперь, если вы владеете световым мечем-программированием, вы можете приступать к своей программе стабилизации квадрокоптера, или, еще лучше, присоединиться со свежими идеями к существующими open source проектам. Ну а я через неделю-другую, когда появятся силы и время, чтобы соответствовать качеству, продолжу рассказ, как это все программировалось, тестировалось, падало, резало мне пальцы и вовсе улетало в неизвестном направлении. Если вам очень захотелось продолжения — можете напнуть меня здесь или, например, Вконтакте: это немного придает стимула.
В заключении этой части я просто обязан упомянуть человека, который помогал мне в выборе комплектующих и настройке самого сложного (первого!) квадрокоптера на прошивке MegapirateNG и терпеливо отвечал на сотни вопросов по этим самым базовым понятиям: SovGVD, спасибо тебе! 🙂
В награду тем, кто смог промотать всю эту простыню, выкладываю обещанное маленькое видео, как наш квадрокоптер с нашими «изобретенными» ПИД-регуляторами, на нашей программе для Arduino Mega 2560 летает:

Конечно, ему не хватает GPS, как в коммерческих и массовых продуктах, немного не хватает устойчивости, но зато — НАШ, и мы знаем его вдоль и поперек до последнего множителя при интегральном коэффициенте! И это действительно круто, что сегодня нам доступны такие технологии.

Квадрокоптер на Arduino


Главная задача, которую поставил перед собой автор самоделки — сделать недорогой квадрокоптер, полет которого будет стабилизироваться за счет Arduino. Еще квадрокоптер имеет автономное питание. Итоговая стоимость такой самоделки порядка 60$.
Если есть более солидная сумма, то перспективнее оснастить самоделку моторами без щеток с соответствующими контроллерами.
Для стабилизации полета используется гироскоп и акселерометр. Гироскоп нужен для того, чтобы определить угол наклона квадрокоптера относительно земной гравитации. Акселерометр нужен для того, чтобы вычислять ускорение.
Материалы и инструменты:
— литиевые аккумуляторы (на 3.7 В);
— провода;
— транзистор ULN2003A Darlington Transistor (можно использовать и более мощные транзисторы);
— двигатели типа 0820 Coreless Motors;
— микроконтроллер Arduino Uno;
— плата MPU-6050 (это одновременно и гироскоп и акселерометр);
— наличие 3D-принтера или доступ к нему;
— необходимые инструменты.

Процесс изготовления:
Шаг первый. Создаем корпус квадрокоптера
Корпус делается очень быстро и просто. Он распечатывается с помощью 3D-принтера. Создание каркаса, таким образом, хорошо тем, что он выходит легким, все это благодаря печати «сотами». Проектирование деталей происходило в программе Solidworks. С помощью этой программы можно отредактировать параметры корпуса, внести в него свои изменения, если это нужно.



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


Шаг второй. Подключаем Arduino
Как подключать плату MPU6050 можно увидеть на схеме ниже. Важно понимать, что библиотека Arduino подразумевает подключение именно через эти контакты. Если используется схема другого производителя, то важно проследить, чтобы контакты располагались в такой же последовательности.

Для питания платы используется напряжение только 3.3 В, если запитать ее от напряжения 5 В, она испортится. На некоторых платах MPU6050 имеется предохранитель, который защищает систему от высокого напряжения, но лучше не рисковать. Если на плате имеется контакт AD0, его нужно подключить к земле (GND). В данном случае VIO подключен к выходу AD0 непосредственно на плате, поэтому подключать контакт AD0 не нужно.




Чтобы Arduino могла управлять двигателями, понадобятся транзисторы, благодаря ним можно будет подавать большое напряжение на двигатели. Более подробно увидеть, как подключаются все элементы, можно на схеме.
Шаг третий. Скетч для Arduino
После того как MPU-6050 будет подключен к Arduino, его нужно включить и загрузить скетч I2C scanner code. Далее нужно скопировать код программы и вставить его в пустой скетч. После этого нужно открыть серийный монитор Arduino IDE (Tools->Serial Monitor) и убедится в том, что подключен 9600.
Если все сделано верно, будет обнаружено устройство I2C, ему будет присвоен адрес 0x68 или же 0x69, его нужно записать.
Далее загружается скетч, который обрабатывает информацию с гироскопа и акселерометра. Их в интернете есть много, но лучше всего использовать вот этот.
На заключительном этапе нужно будет откалибровать значения гироскопа и акселерометра. Для этого нужно найти плоскую поверхность и поставить на нее MPU6050. Далее запускается скетч для калибровки, полученные данные отклонения записываются и используются затем в скетче MPU6050_DMP6 .
Шаг четвертый. Программа для Arduino
благодаря программе, которая выложена , квадрокоптер стабилизируется и зависает в стабильном состоянии. Далее с помощью этой программы происходит управление квадрокоптером.
Для стабилизации квадрокоптера используется два ПИД-контроллера. Один нужен для тангажа, а второй для крена. Контроллер измеряет скорости вращения винтов и на основе этого происходит управление квадрокоптером.
Шаг пятый. Модификация квадрокоптера
Главная проблема маленького и дешевого квадрокоптера — это его вес. Чтобы решить эту проблему, нужно установить более мощные и легкие двигатели, лучше всего подойдут безщеточные, их еще называют вентильными. Они на много лучше щеточных, но к ним нужно покупать еще и контроллеры скорости, поэтому стоимость самоделки резко возрастает.
Чтобы конструкция была легче, лучше всего использовать контроллер Arduino Uno, с нее можно снять уже прошитый чип микропроцессора и затем поставить его непосредственно на ProtoBoard. В итоге получится выиграть около 30-ти грамм веса, что довольно неплохо. В качестве альтернативного варианта можно использовать Arduino Pro Mini.
Программа, которая была создана для управления самоделкой, может быть легко расширена. Но самая главная задача — стабилизация квадрокоптера в полете, на этом этапе была полностью решена. Чтобы управлять самоделкой удаленно, можно использовать модуль bluetooth или же присмотреться к трансмиттерам/ресиверам.

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

Рама состоит из алюминиевой антенны (штанги), лопасти вентилятора из алюминиевого плафона и дерева. Arduino UNO наряду с MPU6050 (гироскоп + Accle) используется в качестве контроллера полёта.

Шаг 1: Материалы

Показать еще 11 изображений

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

Ссылки на Амазон:

  • Flysky fs-i6x с ресивером X6B
  • Батарейка Li-po 11.1v, лучше взять эту
  • Зарядник Li-Po
  • Arduino UNO
  • Гироскоп и акселерометр Mpu6050
  • Макетная плата
  • Коннетор XT60
  • Передатчик и ресивер
  • устройство для контроля напряжения Li-Po

Список со ссылками на banggood:

  • Передатчик и ресивер
  • Бесщеточный двигатель
  • 30 Amp ESC
  • Li-Po батарейка
  • Зарядное устройство Li-Po
  • Контроллер напряжения Lipo
  • Arduino uno
  • MPU6050
  • XT60 коннектор
  • Пропеллер 1045

Ссылки на gearbest:

  • Flysky fs-i6x с ресивером X6B
  • Батарейка Li-po 11.1v
  • Контроллер напряжения Lipo
  • Зарядник Li-Po
  • Arduino UNO
  • Гироскоп и акселерометр Mpu6050
  • Коннетор XT60
  • Вентильный двигатель CW
  • Вентильный двигатель CCW
  • 4*30Amp ESCs
  • Пропеллер 1045
  • Термоусадочная трубка

Шаг 2: Установка моторов

Когда вы покупаете моторы, крепление мотора и несколько винтов входят в комплект. Крепление алюминиевого мотора с винтами идет с ним. (см. рисунок). Установите его на двигатель, используя винты.

Шаг 3: Делаем раму

Показать еще 3 изображения

Я использую старую алюминиевую антенну, мягкое дерево и алюминиевую пластину (лопасть вентилятора), чтобы сделать каркас. Отрежьте 4 куска алюминиевого бруска по 20см. Размер центральной пластины составляет около 11 * 18 см…. Деревянное крепление для двигателя имеет длину около 10 см и диаметр 4,5 см (там, где установлен двигатель).

Закрепите алюминиевые стержни с помощью центральной пластины с помощью винтов и вставьте крепление двигателя под алюминиевые стержни. Ваша рама готова (см. видео).

Шаг 4: Устанавливаем все компоненты (ESC и моторы на раму)

Показать еще 4 изображения

Теперь прикрепите моторы к деревянному креплению с помощью винтов и гаек (любых типов) и соедините с ними провод ESC (произвольно), зафиксируйте ESC с помощью изоленты или стяжек, в моем случае это изолента (дешевле, чем стяжки). После подключения всех моторов и ESC отрежьте провода ESC +ve и –ve и подключите все ESC с помощью проводов или PDB. Я использую провода, потому что в моей раме нет места для ESC. Всё готово.

Шаг 5: Контроллер полёта

Показать еще 4 изображения

На основе Ардуино Уно и MPU6050, создайте контроллер полёта.

Мой контроллер основан на Joop Brokking’s YMFC-AL и его автоуровневом квадрокоптере. Соедините все согласно диаграмме.

Шаг 6: Соединяем ESC и ресивер с контроллером полёта

*** Не соединяйте BEC-провод ESC (5 вольт), соединяйте лишь сигнальный провод
*** Запитывайте ресивер от 5вольтового источника Ардуино

Соединение ESC:

  • Цифровой пин-4 к ESC1 (правый передний CCW)
  • Цифровой пин-5 к ESC2 (правый задний CW)
  • Цифровой пин-6 к ESC3 (левый задний CCW)
  • Цифровой пин-7 к ESC4 (левый передний CW)

Соединение ресивера:

  • Цифровой пин-8 к каналу 1 ресивера
  • Цифровой пин-9 к каналу 2 ресивера
  • Цифровой пин-10 к каналу 3 ресивера
  • Цифровой пин-11 к каналу 4 ресивера

Шаг 7: Настройка контроллера полёта (загрузка скетча)

Показать еще 4 изображения

*** На этом этапе не подключайте лётную батарею

Теперь загрузите Arduino IDE и приложенный скетч и извлеките файл. Вы найдете схемы YMFC-Al, файл Readme, код калибровки ESC, код настройки и код контроллера полета.

Arduino IDE
Скетч контроллера полета

Сначала загрузите код и откройте последовательный монитор на 56000b и следуйте инструкциям в видео
Если ошибки не возникло, загрузите скетч калибровки ESC после загрузки кода. Поставьте передатчик на полную мощность и подключите летную батарею после нескольких звуковых сигналов, выключите дроссель (я думаю, что этот метод работает не для всех типов и марок ESC, но у меня это работает отлично).

После загрузки скетча калибровки ESC загрузите скетч контроллера полета и Ваш FC готов.

Файлы

  • YMFC-AL.zip

Шаг 8: Установка электроники в кейс и монтаж

Показать еще 11 изображений

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

Самое сложное в создании этого квадрокоптера — настройка PID. Я сломал 2 пары пропеллеров и коробку с электроникой, пытаясь научиться летать на ней.

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

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

А если вам хочется больше практики — посмотрите наши уроки: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino или Гироскоп с помощью Arduino 101.

Назначение связки гироскоп и акселерометр

Для начала давайте разберёмся, зачем Arduino mpu 6050 (Gy-521) вообще нужен и что собой представляет гироскоп-акселерометр в целом. Такой датчик все мы видели в смартфонах, и там он выполняет следующие функции:

  1. Позволяет замерять шаги. Акселерометр способен отслеживать резкие движения устройства, а в зависимости от его настройки и чувствительности, считать некоторые из них за шаг.
  2. Измеряет поворот экрана. Здесь уже оба устройства работают в паре. Ведь когда вы поворачиваете смартфон набок, картинка должна изменить свою ориентацию для пользователя, и лишь с помощью гироскопа удаётся определить угол наклона, под которым ПО это должно будет сделать.
  3. Компас, карты и навигация. Акселерометр с гироскопом позволяют определить ориентацию устройства в пространстве, что необходимо в различных приложениях для мобильной навигации.

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

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

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

Смотрите по теме: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino

Чаще всего гироскоп для Ардуино применяется в системах автоматизации под так называемые «смартхаусы» (умные дома — прим. ред.), являясь своеобразным переключателем. Передавая определённые данные в МК, который затем отправляет их по блютуз-модулю к другому устройству, он может управлять всей техникой в доме.

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

Комплектующие

Создаётся данный датчик или МК, в зависимости от того, что вы собрались приобретать, из компонентов ATmega328.

Распиновка модуля Arduino MPU 6050

Так, в нём имеются:

  1. 14 штук различных пинов и цифровых выходов, половина из которых являются ШИМ-выходами.
  2. Специальные кварцевые резонаторы до 16 МГц мощностью.
  3. Встроенный вход под usb-кабель, который позволит вам сэкономить не только время, но и деньги, которые вы могли бы потратить на покупку адаптера.
  4. Контакты и распиновка для стандартного питания с нулем, фазой и заземлением.
  5. Контакты для сброса до заводских настроек, при которых весь машинный код и данные будут стёрты. Это полезно в том случае, если вы напортачили с программой и модуль превратился в бесполезную груду железа, и просто как экономия времени, если необходимо сменить прошивку.
  6. ICSP контакт, который необходим для того, чтобы запрограммировать машинный код, который будет находиться внутри системы.

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

Сборка

Здесь всё зависит от используемого вами интерфейса, например, для I2C от Ардуино пригодятся контакты: A4, A5, которые являются SDA и SCL входами соответственно.

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

Gy-521 (mpu6050) Arduino (Uno)
VCC 3.3 V
GND GND
SCL A5
SDA A4

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

Питание модуля строго 3.3В!

Программы

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

Мы воспользуемся готовой библиотекой для Arduino MPU 6050, которую написал Джефф Роуберг.

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

  1. Найти уже готовый шаблон или библиотеку. Для этого потребуется всего пара секунд и подключение к интернету, но не стоит забывать, что готовые решения пишутся, зачастую, столь же неопытными инженерами. Поэтому, по возможности, проверяйте, насколько качественный код вы скачиваете. Смотрите отзывы о библиотеке, если есть такая возможность, и старайтесь скачивать их на зарубежных форумах. Там и выбор будет больше, и куда выше вероятность найти действительно качественную библиотеку.
  2. Написать функции и методы для работы системы своими силами. Этот вариант подойдёт лишь тем, кто ранее имел дело с языком С++ и понимает все нюансы работы с Ардуино. Все необходимые вспомогательные библиотеки можно скачать в интернете, а всё остальное вы можете подогнать под свои нужды. Такой способ идеально подходит для тех, кто хочет реализовать собственный проект, не имеющий аналогов. Ведь в таком случае найти заготовленный код под него будет крайне сложно, даже если быть готовым править большую его часть.

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

Нужно распаковать/извлечь эту библиотеку, взять папку с именем «MPU6050» и поместить ее в папку «library» в Arduino. Для этого перейдите в место, где вы установили Arduino (Arduino -> libraries) и вставьте свою папку в папку библиотек. Возможно, вам также придется сделать то же самое, чтобы установить библиотеку I2Cdev, если у вас еще нет ее на вашем Ардуино. Для её установки выполните ту же процедуру, что и выше. Вы можете скачать I2Cdev на нашем сайте по этой .

Если вы всё сделали правильно, при открытии IDE Arduino вы можете увидеть «MPU6050» в:

Файл -> Примеры.

Затем откройте пример программы из меню:

Файл -> Примеры -> MPU6050 -> Примеры -> MPU6050_DMP6.

Затем вы должны загрузить этот код в свой Ардуино. После загрузки кода откройте последовательный монитор и установите скорость передачи в бодах как 115200. Затем проверьте, видите ли вы что-то вроде «Инициализация устройств I2C …» («Initializing I2C devices …») на последовательном мониторе.

Если вы этого не сделаете, просто нажмите кнопку сброса. Теперь вы увидите строку с надписью «Отправить символы, чтобы начать программирование и демо DMP» («Send any character to begin DMP programming and demo»). Просто введите любой символ на последовательном мониторе и отправьте его, и вы должны начать видеть значения поступающие с MPU 6050.

Также можно, например, воспользоваться скетчем ниже, который пересчитывает координату X и Y и выводит в консоль (монитор последовательного порта):

#include <Wire.h> #include «Kalman.h» Kalman kalmanX; Kalman kalmanY; uint8_t IMUAddress = 0x68; /* IMU Data */ int16_t accX; int16_t accY; int16_t accZ; int16_t tempRaw; int16_t gyroX; int16_t gyroY; int16_t gyroZ; double accXangle; // Angle calculate using the accelerometer double accYangle; double temp; double gyroXangle = 180; // Angle calculate using the gyro double gyroYangle = 180; double compAngleX = 180; // Calculate the angle using a Kalman filter double compAngleY = 180; double kalAngleX; // Calculate the angle using a Kalman filter double kalAngleY; uint32_t timer; void setup() { Wire.begin(); Serial.begin(9600); i2cWrite(0x6B,0x00); // Disable sleep mode kalmanX.setAngle(180); // Set starting angle kalmanY.setAngle(180); timer = micros(); } void loop() { /* Update all the values */ uint8_t* data = i2cRead(0x3B,14); accX = ((data << 8) | data); accY = ((data << 8) | data); accZ = ((data << 8) | data); tempRaw = ((data << 8) | data); gyroX = ((data << 8) | data); gyroY = ((data << 8) | data); gyroZ = ((data << 8) | data); /* Calculate the angls based on the different sensors and algorithm */ accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG; accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG; double gyroXrate = (double)gyroX/131.0; double gyroYrate = -((double)gyroY/131.0); gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000); kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000); timer = micros(); Serial.println(); Serial.print(«X:»); Serial.print(kalAngleX,0); Serial.print(» «); Serial.print(«Y:»); Serial.print(kalAngleY,0); Serial.println(» «); // The accelerometer’s maximum samples rate is 1kHz } void i2cWrite(uint8_t registerAddress, uint8_t data){ Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.write(data); Wire.endTransmission(); // Send stop } uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) { uint8_t data; Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.endTransmission(false); // Don’t release the bus Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading for(uint8_t i = 0; i < nbytes; i++) data = Wire.read(); return data; }

Когда X и Y равны 180 — гироскоп в горизонтальной плоскости:

Вот вы определились с выбором и уже написали всё необходимое ПО, пришла пора его протестировать. Для этого, естественно, необходимо собрать всё вместе.

Наладка

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

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

Тестирование

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

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

Подключаем акселерометр / гироскоп MPU-6050 (GY-521) к ARDUINO и серво двигателям (стабилизатор для камеры)

Немного информации по проекту :

Датчик MPU-6050 содержит в себе интегрированный 3х-осевой акселерометр и построен на базе MEMS 3х-осевом MEMS-гироскопе. С помощью гироскопа мы можем измерить угловое ускорение тела на собственной оси, а с помощью акселерометра мы можем измерить ускорение тела вдоль одного направления. Он очень точен, поскольку он имеет 16-разрядный AD (от аналого-цифрового) преобразователя для каждого канала. Поэтому он захватывает оси x, y и z одновременно. Датчик имеет стандартный протокол связи I²C, поэтому его легко подключить к ардуино .

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

Я отобрал самые дешевые варианты на алиэкспресс :

Купить MPU-6050 http://ali.pub/26g64n

Для удобства ардуино уно http://ali.pub/26g69b

Сервоприводы SG 90 http://ali.pub/26g6ek

(Я рекомендую использовать более с мет. шестернями )

VG996R http://ali.pub/26g6jf

Комплект из 4 штук — дешевле http://ali.pub/26g6mc

Схематика и характеристики датчика гироскопа :

Вот некоторые особенности датчика MPU-6050:

Чип со встроенным 16-разрядным АЦП-преобразователем

Диапазон измерения гироскопа: ± 250, 500, 1000 и 2000 ° / с

Диапазон измерения акселерометра: +2, +4, +8, +16 г

Интерфейс: I²C

Питание: от 3 до 5 В

Вы можете найти спецификацию MPU-6050

Для моих тестов я купил модуль GY-521 — плату с обвесом . Ниже приведена схема подключения модуля GY-521 для тех, кто хочет разобраться :

Рассмотрим подробнее работу датчика с платой Ардуино :

Ардуино , гироскоп и 2 серво привода :

GY-521 Arduino Uno
VCC 3.3V
GNS GND
SCL A5
SDA A4

Подключение на схеме и на макетке для лучшего визуального восприятия :

Как видно из электрической схемы, я приводил в действие два серводвигателя с внешним источником питания 5 В (это связано с тем, что сервомоторы вместе потребляют более 500 мА (500 мА = максимальный ток, поставляемый USB-портом версии 2.0 )). Теперь перейдем к коду, чтобы загрузить в Arduino.

// MPU6050 & Servo

// byDenisGeek

#include <SPI.h>

#include <Wire.h>

#include <Servo.h>

#define MPU 0x68 // I2C address of the MPU-6050

Servo ServoX, ServoY;

double AcX,AcY,AcZ;

int Pitch, Roll;

void setup(){

Serial.begin(9600);

ServoX.attach(8);

ServoY.attach(9);

init_MPU(); // Inizializzazione MPU6050

}

void loop()

{

FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.

Roll = FunctionsPitchRoll(AcX, AcY, AcZ); //Calcolo angolo Roll

Pitch = FunctionsPitchRoll(AcY, AcX, AcZ); //Calcolo angolo Pitch

int ServoRoll = map(Roll, -90, 90, 0, 179);

int ServoPitch = map(Pitch, -90, 90, 179, 0);

ServoX.write(ServoRoll);

ServoY.write(ServoPitch);

Serial.print(«Pitch: «); Serial.print(Pitch);

Serial.print(«\t»);

Serial.print(«Roll: «); Serial.print(Roll);

Serial.print(«\n»);

}

void init_MPU(){

Wire.begin();

Wire.beginTransmission(MPU);

Wire.write(0x6B); // PWR_MGMT_1 register

Wire.write(0); // set to zero (wakes up the MPU-6050)

Wire.endTransmission(true);

delay(1000);

}

//Funzione per il calcolo degli angoli Pitch e Roll

double FunctionsPitchRoll(double A, double B, double C){

double DatoA, DatoB, Value;

DatoA = A;

DatoB = (B*B) + (C*C);

DatoB = sqrt(DatoB);

Value = atan2(DatoA, DatoB);

Value = Value * 180/3.14;

return (int)Value;

}

//Funzione per l’acquisizione degli assi X,Y,Z del MPU6050

void FunctionsMPU(){

Wire.beginTransmission(MPU);

Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)

Wire.endTransmission(false);

Wire.requestFrom(MPU,6,true); // request a total of 14 registers

AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)

AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)

AcZ=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)

}

Я надеюсь этот материал вам был полезен , так же с вопросами и предложениями можно ко мне в группу :

Подписывайся на Geek каналы :

➤ VK — https://vk.com/denis_geek

➤ VK — https://vk.com/club_arduino

● Проект 24: 3-осевой гироскоп + акселерометр на примере GY-521

В этом эксперименте мы познакомимся с акселерометром и гироскопом и будем с помощью Arduino получать показания с этих датчиков.
Необходимые компоненты:
• контроллер Arduino UNO R3;
• плата для прототипирования;
• модуль GY-521;
• провода папа-папа.
Модуль GY-521 на микросхеме MPU6050 содержит гироскоп, акселерометр и температурный сенсор. На плате модуля GY-521 расположена необходимая обвязка MPU6050, в том числе подтягивающие резисторы, стабилизатор напряжения на 3,3 В с малым падением напряжения с фильтрующими конденсаторами. Обмен с микроконтроллером осуществляется по шине I2C.
Гироскоп представляет собой устройство, реагирующее на изменение углов ориентации контролируемого тела. Акселерометр – это устройство, которое измеряет проекцию кажущегося ускорения, то есть разницы между истинным ускорением объекта и гравитационным ускорением.
Схема соединений платы GY-521 к Arduino показана на рис. 24.1.

Рис. 24.1. Схема соединения GY-521 к Arduino
Код простого скетча для считывания значений гироскопа и акселерометра с датчика MPU6050 показан в листинге 24.1.
// подключение библиотек #include «I2Cdev.h» #include «MPU6050.h» #include «Wire.h» MPU6050 accelgyro; int16_t ax, ay, az; int16_t gx, gy, gz; void setup() { } Wire.begin(); Serial.begin(38400); // инициализация Serial.println(«Initializing I2C devices…»); accelgyro.initialize(); delay(100); } void loop() { // чтение значений гироскопа и акселерометра accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // вывод значений в монитор Serial.print(«a/g:\t»); Serial.print(ax); Serial.print(«\t»); Serial.print(ay); Serial.print(«\t»); Serial.print(az); Serial.print(«\t»); Serial.print(gx); Serial.print(«\t»); Serial.print(gy); Serial.print(«\t»); Serial.println(gz); }
Порядок подключения:
1. Подключаем плату GY521 к плате Arduino по схеме на рис. 24.1.
2. Загружаем в плату Arduino скетч из листинга 24.1.
3. Открываем монитор последовательного порта Arduino IDE и смотрим вывод данных гироскопа и акселерометра (см. рис. 24.2).
4. При поворотах датчика данные изменяются.
Рис. 24.2. Вывод данных гироскопа и акселерометра в монитор Arduino IDE
Область применения таких датчиков достаточно широка. Данный модуль часто применяют для стабилизации полета квадрокоптера по причине совместного использования гироскопа и акселерометра. Кроме этого, модуль можно использовать для координации различных устройств – от просто детектора движения до системы ориентации различных роботов или управления движениями какими-либо устройствами. Область подобных сенсорных устройств достаточно новая и интересная для изучения и применения в любительской технике.
Листинги программ

Новый дрон от DJI, Intel и Ryze Tech

С 9 по 12 января в Лас-Вегасе проходила международная выставка потребительской электроники CES 2018. Всемирно известная компания DJI Innovations совместно с предприятием Ryze Technology, а также при участии Intel представила очень интересную и необычную новинку – квадрокоптер Tello. Tello представляет собой мини-дрон и позиционируется как дрон-игрушка или дрон для развлечений, оснащён камерой 720p, а цена его – чуть больше 100 евро.

Общие характеристики

Новый квадрокоптер Tello – это мини-дрон с крайне скромными габаритами, но разнообразным функционалом. Производители создавали эту модель специально для детей и подростков, но она будет интересна и взрослым. Продолжительность полёта Tello – до 13 минут на одном заряде, дальность полёта – около 100 метров. Трансляция в разрешении 720p производится на экран смартфона через специальное приложение Tello. В нём же доступны настройки фото- и видеосъёмки. В комплекте с квадрокоптером идёт аккумулятор, набор запасных лопастей, а также комплект защиты лопастей.

Ryze Technology: новый игрок на рынке

Tello – это совместное произведение DJI и Intel с молодым стартапом Ryze Technology из того же Китая. Основана компания была в 2017 году. Пока что предприятие нацелено на изготовление дронов, оснащённых камерой, а также с арсеналом всевозможных «умных» функций и возможности обучения. Компания ставит целью повысить интерес молодёжи к современной технике.

В разработке дрона Tello молодому стартапу помогли именитые «гиганты»: от DJI был взят контроллер полёта, а от Intel – установлен мощный процессор. Вся эта мощь умещается в небольшом корпусе, который можно брать с собой куда угодно. Tello умеет «учиться»: владелец получит возможность программировать дрон, причём по заверениям разработчиков это будет настолько легко, что с программированием справятся не только подростки, но даже дети!

Нельзя сказать, что Tello – это продукт от DJI, хотя дрон и похож визуально на Spark. Всё-таки DJI и Intel – скорее партнёры, участвовавшие в разработке квадрокоптера. Кроме того, DJI будут предлагать Tello для покупки в своём онлайн-магазине.

Фишки новой модели

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

Tello имеет целый ряд предустановленных функций для фото- и видеосъёмки (например, Circle Mode, 360 Grad, Up-and-Away). Стабилизация изображения производится цифровым образом, не механически. За это отвечает встроенный 14-ядерный процессор от Intel. Квадрокоптер снимает 5 Мп фото. Кроме того, Tello совместим с VR-очками. И при этом его вес – всего 80 гр.!

Кроме всего прочего у новинки есть ряд полезных функций для безопасности полёта. Одним движением пальца в приложении дрон может автоматически взлететь или совершить посадку. С помощью визуальных и звуковых сигналов Tello предупреждает о близком разряде аккумулятора. При потере сигнала срабатывает функция Failsafe – дрон автоматически приземлится. Новинка также имеет встроенную систему визуального позиционирования.

Программируемая игрушка

Ryze Technology в своей новинке уделило особое внимание воспитательному и учебному аспекту. Дети и подростки с помощью Tello могут без труда и в игровой форме выучить основы программирования (на языке программирования для детей Scratch).

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

Именно благодаря Scratch дети получат возможность расширить полётные функции Tello. К примеру, перевороты и сальто в воздухе можно будет запрограммировать на 8 различных направлений. Возможными станут и другие интеллектуальные функции, изучаемые и испытываемые в игровой форме.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх