суббота, 20 сентября 2014 г.

Инерционный трекер своими руками

Это измененная и дополненная версия моего исходного сообщения на форуме Warthunder.

GY86 GY85 GY9150 GY9250 Gy273 GY282 GY521 GY951 GY80
Здесь описан мой опыт изготовления и настройки инерционного датчика положения головы. Изменения и дополнения я буду выделять, либо публиковать отдельными сообщениями.

Принцип действия

Широко известен и описан, в том числе на форуме (имеется в виду forum.warthunder.ru). Представляет собой комбинацию гироскопа, акселерометра и магнитометра, устроенных в одной, двух или трёх микросхемах. Оцифрованные значения этих трёх датчиков отправляются на обработку в процессор, чаще всего Atmega в исполнении Arduino или клонов. Положение головы (или того, к чему прикрепили плату с датчиками), выраженное в угловой форме, по USB передаётся на PC для дальнейшего употребления. Я пробовал заставить эту конструкцию изображать из себя джойстик, но решил, что это не так удобно, как протокол Freetrack или Trackir, поэтому решил (и предлагаю) использовать FaceTrackNoIR со специальным плагином.


За и против

+ Удобнее фритреков и трекиров, так как не нужна видеокамера и нет зависимости от освещения
+ Весь код в открытом доступе, простор для экспериментов
- По-прежнему нужны провода (но это решаемо, Bluetooth наше всё)
- Не умеет фиксировать сдвиг головы (работа в процессе)

Железо

Где взять
Aliexpress, DX, eBay. По ключевым словам.

Предупреждение: не покупайте ардуино и COM-USB переходники с чипами от FTDI: производитель встроил в свой новый драйвер закладку, которая убивает "левые" чипы. Как отличить: в описании товара будет написано RT232RL или FTDI. Если есть сомнения, лучше свяжитесь с продавцом. Сам я беру платы с чипом CH340.
Для тех, кто уже купил, восстановление: http://habrahabr.ru/post/241299/

Процессорная плата:
Arduino Nano: мой выбор [на момент написания исходной статьи]

Arduino Nano + IMU

 Arduino Pro Micro: приемлемо


Arduino Pro Micro + IMU


Arduino Leonardo: то же самое, что и микро

Датчики:
GY-85[на момент написания статьи] лучший из всех, что я пробовал, работает сразу и без калибровки
GY-86 – работает хорошо, но при каждом включении нужно дать ему время на автокалибровку ок. 1 минуты. Плюс к тому, хорошее разрешение датчиков и умеет выдавать кватернион
GY-80 – работает; но на том коде, что я использовал, почему-то «пружинит», т.е. сам возвращается в нулевое положение
MPU-9150кода в открытом доступе нет. Код есть, датчик работает. Прошивку пока не написал, но собираюсь
GY-521не надо использовать, у него нет магнитометра Можно использовать совместно с GY-271/GY-273

Что с ними делать
Спаять, как на фото (или лучше). Обратите внимание, чтобы датчик не был расположен слишком близко к ардуино – иногда от этого начинает хуже работать (наводки на компас?)

Схема пайки:
Датчик->Arduino Nano
VCC_IN->3v3 или 5v
SCL->A5
SDA->A4
GND->GND

ДатчикArduino Pro Nano
VCC_IN3v3 или 5v
GNDGND
SCLA5
SDAA4

ДатчикArduino Pro Micro (Leonardo)
VCC_INVCC
GNDGND
SCL3
SDA2

Софт

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

1. Подключить плату (с припаянным датчиком) к компьютеру с помощью шнура USB. Произойдёт автоматическое распознавание устройства и в системе появится новый COM-порт
2. Код для ардуино (из п.4) распаковать на диск. При распаковке образуется отдельная папка, где лежат все необходимые файлы
3. Запустить Arduino IDE (из п.3), в этой программе открыть (File->Open...) главный файл из распакованной папки. Главный - это с расширением .ino
4. В Arduino IDE выбрать тип платы Tools->Board и COM-порт, к которому подключена плата Tools->Serial Port
5. В IDE нажать круглую кнопку со стрелкой (Upload), дождаться, пока код скомпилируется и загрузится.
6. Закрыть IDE

Настройка FaceTrackNOIR
Цепляем конструкцию к наушникам, подключаем к компьютеру (если ещё не). Открываем программу, в разделе Tracker Source 1 выбираем «Hatire Arduino», в настройках (кнопка Settings) выбираем COM-порт, на котором находится Arduino, в закладке Command Serial parameters 115200/8/none/1/CTS-RTS, Delay init 1000, delay start 1000. Нажимаем Start.
Через пару секунд начнут приходить данные (зелёные и серые цифры начнут меняться), а лицо с желтым прицелом придёт в движение.
Заходим в Curves и настраиваем чувствительность по желанию. При этом полезно запустить Warthunder в пробный вылет, чтобы проверять настройки «в живую». Возможно, потребуется изменить конфигурацию осей (кнопка Settings) и их полярность (Global Settings на основном экране).

Результат:



79 комментариев:

  1. Arduino + Nano спаяны по схеме. Дрова поставил в винд7, ошибок в диспетчере устройств нет. При попытке Upload компиляции пишет:
    Размер скетча в двоичном коде: 23 716 байт (из 30 720 байт максимум)

    avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x41

    avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x41
    avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x42
    avrdude: initialization failed, rc=-1
    Double check connections and try again, or use -F to override
    this check.

    ОтветитьУдалить
    Ответы
    1. Судя по ошибке, прошивальщик не может подключиться к плате. Скорее всего, неправильно выбран COM-порт

      Удалить
    2. com порт COM3 (панель управления), и в программаторе 1.0.6 Arduino nano w/ ATmega328 on COM3.

      Удалить
    3. Я с таким не сталкивался. В сетях пишут, что, возможно, нужно перепрошить бутлоадер. Плата действительно Nano?

      Удалить
    4. Китайский аналог nano. arduino NANO CH340 USB. Сегодня пробовал на другом компе. Та же проблема. Даже при снятом датчике. Reset делал RST-GND. Ничего не помогает. Где то писали, что возможно коротыш на самом чипе (правда не понятно на каком). Короче заказал новый контроллер. А завтра еще на работе попробую с кучкой проводов и разных ОСях.

      Удалить
    5. Заказал еще USBASP програматор 10 pin - 6 pin. Попробую перезалить bootloader. А потом может кому еще пригодится.

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

      Удалить
  2. продолжение (уточнение):
    На Arduini светится POW и мигает L. На датчике GY-85 светится диод.
    Пробовал 3 вольта припаять, и 5 вольт припаять. И землю перепаивал на Arduano с одно стороны на другую (D -> A). Ошибка всё та же.
    Прошу помочь решить проблему! Очень хочется собрать мечту.

    ОтветитьУдалить
  3. Получил новую ардуино. Скетч залился сходу.

    ОтветитьУдалить
    Ответы
    1. Отлично. Скоро закончу беспроводной вариант , потом в планах переделать прошивку под возможность калибровки. Почему-то 3я версия Processing не работает с библиотеками, которые авторы калибровки использовали...

      Удалить
  4. Не закончили вы прошивку под MPU-9150?! А то я себе приобрел 9250, теперь думаю как присобачить)

    ОтветитьУдалить
    Ответы
    1. Есть полурабочая версия (ссылка есть в блоге выше).
      Пока нового ничего не пишу, но в ближайшем приоритете версия на матричном алгоритме с калибровкой. Туда, наверное, вставлю и поддержку наиболее ходовоых датчиков)

      Удалить
  5. ок, спасибо, нашел буду пробовать. И ждать от вас новостей.

    ОтветитьУдалить
  6. у меня пишет ошибка компиляции, в чем проблема может быть

    ОтветитьУдалить
    Ответы
    1. Скорее всего версия Arduino не та. Точнее не могу сказать, т.к. непоянтно, что компилируется.

      Удалить
  7. предыдущая 1.0.6. оказалась кривой, с какой то цифрой еще и взята не там где надо.

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

    ОтветитьУдалить
  8. не компилируется ардуино нано и гы85

    ОтветитьУдалить
  9. Прошивка под GY-85 компилируется только версией 1.0.6

    С чем это связано? Почему возникает ошибка? Исправить можно?

    ОтветитьУдалить
    Ответы
    1. Исправить можно. Если знаете язык, то приглядитесь к сообщениям, станет понятно, что исправлять.

      Удалить
  10. Всем привет! Пришли платки и мне, нано с датчиком 85ым. В итоге припопытки залить прошивку 1.0.6 ардруиной пишет такую ошибку
    Binary sketch size: 23,716 bytes (of a 30,720 byte maximum)
    avrdude: stk500_getsync(): not in sync: resp=0x00
    Что это может быть?

    ОтветитьУдалить
    Ответы
    1. Привет, программа не видит плату ардуино. Проверь, тот ли ты выставил ком-порт в программе

      Удалить
    2. Все то, на форуме уточник, 1.6.0 порпобовал версию ардруины, выдает другую ошибку, по ней на форуме пишут что пробуйте Разор прошивку. Пробую, выдает ошибку от 0х01 до 0х10 вроде.
      И самое обидное на форуме не могу писать, пишет типа у меня аккаунт не связан с warthuner, хотя играю. Вообще не понимаю что происходит))

      Удалить
    3. Мне нужно конкретно видеть, что за ошибка, иначе непонятно.

      Удалить
  11. Спасибо автору! Сделал себе и товарищу такой трекер. Все довольны.
    Прошу автора дать ссылку на рабочую программу по калибровке GY-85.И если есть инструкцию как это сделать. Спасибо!

    ОтветитьУдалить
    Ответы
    1. Хочу выложить исправленный вариант Razor с сохранением калибровочных данных в ППЗУ.

      Удалить
  12. Всем привет! Увидел эту тему, и сразу захотелось махнуть свой самодельный ИК трекер на инерционку. Компоненты закупил, но сразу же возник вопрос: На фото где GY-85 + Pro Micro не очень отчетливо видно что куда паять, поэтому прошу автора, если можно, написать подробнее что куда паять для вышеуказанной связки. Спасибо.

    ОтветитьУдалить
  13. Спасибо за схему, все спаял. После запуска утсройство определилось как Леонардо (на деле плата ПроМикро). Отсюда вопрос: Это нормальное явление или я что то не так прошил?). 2-е при тестах работоспособности устройства в FaceTrackNoir иконка вращалась, правда хаотично, но после остановки (кнопкой STOP) и последующего перезапуска (кнопка Start)трекер отваливался напрочь, и начинал работать только после передергивания USB шнура. Отсюда 2й вопрос - где искать причину такого поведения трекера? Спасибо.

    ОтветитьУдалить
    Ответы
    1. Леонардо вместо про микро - нормально
      По второму вопросу - тоже нормально, надо передергивать шнур. Из-за того, что управление USB у про микро встроено в процессор, работа с ком-портом отличается от плат на Atmega328. Что там сделать, чтобы оно не отваливалось, я пока не разобрался.

      Удалить
    2. Настроил и потестил в тундре - супер. Только вот почему то в крайних точках по Pitch (+/- 30) идет отклонение в сторону и чем дальше тем оно больше нарастает. В чем может быть причина?

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

      Удалить
  14. А чем GY-86 лучше GY-87 (у последнего, вроде, только барометрический альтиметр другого производителя, а так все микрухи те же самые, что и у GY-86)? Тем более, GY-87 дешевле. И чем связка GY-521(MPU6050) + GY-271 хуже всех выше названных (кроме отсутствия в ней альтиметра все микрухи те же самые)? А то эта связка в два раза дешевле даже GY-87 (щас по сотне за каждую из двух плат). Тоже должна гиперкомплексные скалярно-векторные координаты выдавать (енти кватернионы)

    ОтветитьУдалить
  15. Всё верно, самый бюджетный вариант на тех же датчиках - это 521+271/273. Только габариты больше.
    А от кватернионов пользы нам нет, к сожалению.

    ОтветитьУдалить
  16. Этот комментарий был удален автором.

    ОтветитьУдалить
  17. При покупке на алиэкспресс смотрите внимательно и берите Nano 3.0 Atmega328 а не 168, а иначе просто вы не сможете загрузить данный программный код (памяти не хватит)

    ОтветитьУдалить
  18. Добрый день. Не нашел у вас скетча для связки GY-521 с GY-271.
    Есть какие то мысли (или уже готовый результат) по проекту, где кроме поворотов работает сдвиг (вместо поворота опрос сдвига).
    Сейчас очень нужен именно сдвиговый, если не сложно поделитесь пожалуйста своими разработками (что б не повторять что уже кто то делал). Я же, в свою очередь, отдам рабочий код (если осилю).

    ОтветитьУдалить
    Ответы
    1. GY521+GY271=GY86
      По сдвигам всё относительно просто, если есть квалификация и достаточно свободного времени. С датчиков берется линейное и угловое ускорение, из которого вычисляется фактическое ускорение, из него вычитается влияние гравитации Земли, интегрируем для получения скорости, проводим через высокочастотный фильтр и еще раз интегрируем - на выходе искомое смещение.

      Удалить
  19. Привет собрал про микро и gy85 откалибровал работает нормально далее выдергиваю из юсб и обратно в юсб работает очень медленно в какой плате проблема?

    ОтветитьУдалить
  20. потыкал помыкал минут 5 все заработало (ги85+нано)
    приехал еще ги9250 но не пробовал пока датчики разные оказывается есть их цела куча! даже с атмегой и стм32 встроенными прямо на датчике а чем интересно они лучше или хуже?и как их втыкать и
    куда? если контроллер у них самих уже есть

    ОтветитьУдалить
    Ответы
    1. Лучше или хуже - зависит от конкретной платы.
      Зачем их втыкать? Заливать прошивку и пользоваться.

      Удалить
  21. от платы контроллера? ну - нано уно и тд? логика и протоколы вроде одни и те-же? что-то не пойму. ну да ладно . вопрос то про то что если на датчике есть атмега328 то зачем такомудатчику еще и ардуина? так на датчике никакого юсб нет все те же адо сда и т п

    ОтветитьУдалить
    Ответы
    1. Если на плате уже есть Atmega, то ещё одна ардуина не нужна, это совершенно точно.
      Если на плате нет USB, то нужен переходник USB-Serial.

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

      По типам процессоров - Код для Atmega не подойдет для ESP8266 или для stm32. Датчики тоже не полностью совместимы.

      Удалить
  22. просто заказать хочется лучший - т е точный шустрый а выбор оказывается есть и довольно широкий (и не очень понятный)

    ОтветитьУдалить
  23. Здравы будьте! Вопросец тут возник. Спаял, подключил, порт поймал... Но, код не грузится, выдает такое:
    Arduino: 1.8.5 (Windows 10), Плата:"Arduino Nano, ATmega328P"

    sketch\Sensors.cpp:9:21: fatal error: Sensors.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Ошибка компиляции для платы Arduino Nano.

    ОтветитьУдалить
  24. ребята. кто пробовал вместо ардуино использовать STM 32? до боли интересно будет ли разница или нет?!

    ОтветитьУдалить
    Ответы
    1. В чем разница-то должна быть?

      Мой самый первый вариант был на stm32, но для люди-то и с ардуиной с трудом могут разобраться.

      stm32 интересна тем, что у нее должно хватить мощности для обсчета сдвигов. 2 интегрирования + частотная фильтрация.

      Удалить
    2. интересна скорость обмена данными. есть ощутимая разница между скоростью обработки данными между ардуино и стм в плане тракира? или не стоит забивать голову. И ещё вопрос. какой вариант лучше использовать для беспроводного исполнения. Через зуб или лучше использовать связку из esp-01?

      Удалить
    3. Разница в скорости обработки довольно большая. На stm32 удавалось обрабатывать 100Гц датчик, отправлять в порт данные и еще на экранчике рисовать.
      Для беспроводного мне больше понравился вариант ESP, на платах типа WeMos.

      Удалить
    4. А есть готовый вариант скетча СТМки и в какие пины пхать gy-85? уж больно хочу попробовать работу на СТМ. И есть ли адекватная замена GY-85 желательно без магнитометра? Мои уши профессиональные, соответственно сделаны на совесть и с железным ободом. Калибровка датчика решает эту проблему, но не полностью. Более того появляется ряд других проблем =)

      Удалить
    5. Готового нет, есть вариант на ESP8266 (см. выше публикации). Альтернатива GY-85 - GY-86 или связка GY-521+GY-271/GY-273 (что по сути то же, что и GY-86)
      Чтобы железный обод не так мешал, я выносил датчики подальше от наушников.

      Удалить
  25. залепил вчера прямо на обод и откалибровал магнитометр. всё работает исправно и назад не возвращает камеру. Только одна проблема осталась. при подъёме камеры вверх и вниз происходит смещение вправо и влево соответственно, смещение небольшое и не критичное, но хочется добиться эталона. И всё же искренне надеюсь что будет вариант на СТМ, пусть даже сырой. Возможно смогу допилить.

    ОтветитьУдалить
    Ответы
    1. На stm32 пока не планирую ничего, смысла нет - ESP8266 достаточно мощный + с беспроводной связью.
      По 8266 см. выше, если что-то непонятно - постараюсь описать подробнее. Или может видео лучше записать?

      Удалить
    2. Был бы очень признателен. Сам вроде головастый, полдома уже в ардуино навешал. но в статье с ESP8266 непонятно ваще нихрена =) А спросить как-то стыдно чтоли =) (видимо не такой я уж и далёкий) и коментарии раз 20 перечитал, как-то туго всё воспринимаю. поэтому если есть возможность детального описания того какие пины куда паять и какие библиотеки вливать в ардуино IDE - буду весьма признателен. Даже задоначу, если попросишь ;-)

      Удалить
    3. Хорошо, постараюсь сделать. Я сейчас пока что не летаю, поэтому придется из закромов вытаскивать железяки.
      Донат обязывает, поэтому воздержусь :) Но можешь крепление заказать, если нужно :)

      Удалить
    4. не, крепление не нужно, я сам тысячу креплений наделал за всё время. и все на 3д принтере. но благодаря последней калибровке мне удалось его победить непосредственно рядом с ободом... главное очень жестко его зафиксировать, чтобы магнитное поле не менялось относительно датчика. и можно смело калибровать. правда не с первого раза получится. но получится! А донат я имел ввиду чисто символический. на пиво с рыбкой, когда материал писать будешь =)

      p.s. - а если рассмотреть не esp8266 а более новый вариант esp32? Или такие мощи не в кассу?

      Удалить
    5. Ладно, запишу - обмоем может быть :)
      ESP32 не пробовал, не могу сказать. Делал на WeMos и на NodeMCU. Расскажу, как делал сам, а там уже по желанию.

      Удалить
  26. Здравствуйте, решил собрать связку nano+gy85 и с толкнулся с проблемой- не работает магнитометр. Купил другую gy85 и проблема осталась. Позже выяснилось, что на платах стоят чипы магнитометра не HMC5883L, а QMC5883. Можно их как то заставить работать? Или плюнуть и купить связку pro micro+MPU-9250 и спаять edtracker? Спасибо за ответ

    ОтветитьУдалить
    Ответы
    1. Заставить можно, если вместо библиотеки для HMC5883L использовать код для QMC5883L. Если есть навыки программирования, то стоит попробовать, если нет - то edtracker будет проще.

      Удалить
    2. Спасибо за ответ, тогда лучше возьму edtracker. И такой еще вопрос, на чем лучше его собирать, на 9150 или 9250?

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

      Удалить
    4. Про edtracker ничего не могу сказать - надо смотреть на их рекомендации. Насколько я понимаю, у них и то, и другое поддерживается. Вообще не уверен, что подключении 9250 к ардуине есть практический смысл, т.к. у атмеги может не хватить мощности на обсчет результатов на скорости 32кГц. Лучшее решение на сегодняшний день, как мне кажется, это MPU6050+HMC5883L либо MPU9250 подключать к esp8266.
      Т.е. от ардуин типа atmega328p или про микро пора отказываться, по возможности.

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

      Удалить
    5. А к esp8266+MPU9250 есть прошивка? И по поводу pro micro+MPU-9250, там ардуинка может захлебнуться или она просто весь потенциал 9250 раскрыть не сможет? На форуме тундры писать тоже не могу, перевели в группу "без постов и создания тем")))

      Удалить
    6. Для ESP + 6050 обязательно сделаю, как только соберусь снова летать. Вряд ли раньше весны. Был у меня пробный вариант, показывал отличные результаты даже без магнитометра.
      Для 9250 не помню, был ли доступен код с режимом DMP.
      Насчет ардуины+9250 - как пишут умные люди, 9250 выдает слишком много данных, ардуина не успевает, из-за этого происходят ошибки в позиционировании.

      Удалить
  27. MPU-6050 это GY-521? На форумах по edtracker особо о косяках не пишут, по этому думаю тогда взять pro micro+MPU-9250 на сейчас и до кучи ESP + 6050 для сборки к весне-лету.

    ОтветитьУдалить
    Ответы
    1. Да, GY-521 это 6050. Можно к нему до кучи взять GY-271 или GY-273 - это магнитометр. Само собой, с учетом, что могут подсунуть QMC

      Удалить
  28. Привет, такой вопрос собрал трекер, на ардуино леонардо микро и 5060. скетч из поста выше. проблема в том что постоянно уплывает YAW. Куда копать не подскажете?

    ОтветитьУдалить
    Ответы
    1. Скорее всего где-то железяка недалеко. Чтобы избежать уплывания, нужна калибровка, но прошивка для 6050 старая, и калибровки там кажется нет.

      Удалить
    2. в 6050 нету магнитометра, так что сомнительно что наводки каки-то.
      В коде нету каллибровки. уже просмотрел его.

      Удалить
    3. В GY-86 есть магнитометр, в GY-521 Нету. Калибровка для MPU-6050 не такая, как для магнитометра. Заливается спец. скетч, потом датчик фиксируется 6 раз по сторонам и полученные данные записываются в основную программу.

      Удалить
    4. я ведь и написал что 521 а не 86.
      Если есть спец скетч для каллибровки 521 и значения эти можно внести куда-то в пресставленный скетч от 86, можете ткнуть носом в ссылочку? ). Спасибо.

      Удалить
    5. Ссылки под руками нет, просто помню, что где-то натыкался и скачивал. В целом там всё довольно просто - считываются данные и запоминаются максимум и минимум по всем осям, потом вычисляется разница и записывается в регистры offset по каждой оси.

      Удалить
    6. #if MPU6050_CALIBRATEDACCGYRO == 1
      #define MPU6050_AXOFFSET 0
      #define MPU6050_AYOFFSET 0
      #define MPU6050_AZOFFSET 0
      #define MPU6050_AXGAIN 16384.0
      #define MPU6050_AYGAIN 16384.0
      #define MPU6050_AZGAIN 16384.0
      #define MPU6050_GXOFFSET -42
      #define MPU6050_GYOFFSET 9
      #define MPU6050_GZOFFSET -29
      #define MPU6050_GXGAIN 16.4
      #define MPU6050_GYGAIN 16.4
      #define MPU6050_GZGAIN 16.4
      #endif

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

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

      Удалить
  29. а, и в "Мониторе", если открывать из среды Ардуино, идут иероглифы вместо цуфр. Но Опентрек подхватывает значения как надо.

    ОтветитьУдалить
    Ответы
    1. для опентрека формат бинарный, так что иероглифы - это норма

      Удалить
  30. мне очень понравилось, может ли кто то подобное собрать на заказ?

    ОтветитьУдалить