Activity

Как подружить APM 2.8 и MinimOSD (сложный случай)

Итак история. У пользователя Друг не подключалась minimOSD к APM2.8.
В форуме, как обычно, слали на RTFM и советовали выкинуть старье в мусорку. Но так как было сделано всё по инструкциям, было решено провести мозговой штурм. Вооружившись паяльником и терпением с одной стороны и тимвьюером, интернетом, и желанием разгадать загадку с другой мы приступили.

Железо:
APM 2.8 (ArduCopter 3.2.1)
MinimOSD v1.1

Начнем с диагноза:
Не работает OSD. То есть на экране из отображается окно с сообщением No INPUT DATA

Диагностика:

Проверка minimOSD:

Для начала прошиваем последней желаемой прошивкой. Из вариантов был MW OSD и MinimOSD-extra. Будем использовать последний. Инструкции по прошивке легко ищутся в интернете, но я пользовался официальной документацией.
Как раз в официальной документации прописано, что можно подать лог полёта на OSD тем самым эмулируя наличия полетного контроллера. Что и было сделано. Показания на экране OSD меняются. Значит OSD работает.

Проверка APM 2.8:

Подготовка:

  1. Отключаем USB кабель.
  2. Подключаем APM 2.8 (прошитый последней официальной прошивкой 3.2.1), а именно порт Telem к компьютеру через USB-TTL конвертер.
  3. Запускаем MissionPlanner соединяемся с APM указывая COM-порт конвертера и скорость 57600.
  4. Поверяем значения параметров, и меняем их на те, которые рекомендованы в официальной документации. Перегружаем APM. Проверяем, что значения сохраняются.
  5. Теперь заходим в Configuration-Planner и запоминаем/записываем путь Log Path. Там мы будут создаваться логи и там мы буем их искать.
  6. Закрываем MissionPlanner.

Создание лога:

  1. Отключаем провод TX от USB-TTL конвертера. Нам же надо записать реальный поток который будет идти на плату OSD. Должно остаться только два провода GND и RX.
  2. Заново запускаем MissionPlanner соединяемся с APM.
    MissionPlaner находит поток от APM и начинает запрашивать параметры. Но запросы до APM не доходят, так как проводка то TX у нас нет. Поэтому когда появляется окно с Getting Parameters нажимаем Cancel.
  3. Ждем минуту.
  4. Армим коптер.
  5. Ждем минуту покачивая коптер, чтобы в лог попали изменения положения.
  6. Дизармим коптер.
  7. Отключаемся от APM кнопкой Disconnect.
  8. Закрываем MissionPlanner.
    Таким образом мы сняли лог протокола MavLink который коптер шлет на OSD.

Теперь находим последний файл лога (нас интересует, который с расширением tlog), который находится в папке, путь до которой записали ранее + QUADROTOR (для квадрокоптеров, для самолета будет наверное другой)\<номер месяца>\
Я скопировал его на рабочий стол, чтобы не путаться.

Далее опять подключаем к USB-TTL нашу minimOSD. И опять открываем лог файл, но уже наш (который на рабочем столе) и отправляем его на OSD. Изображение на мониторе начало меняться. Значит поток данных правильный.

Получается интересная ситуация - поток mavlink c APM идет хорошо. Тот же поток на mininOSD отображается отлично. Но если соединить APM+minimOSD по боевой схеме - опять получим No INPUT DATA.

Решение проблемы:

Значит проблема где-то в области физики (скорее всего что-то с мультиплексором). Будем искать обходные пути.

И тут глаз падает на порт I2C, во всяком случае так написано на корпусе.

Если корпус снять, то на палате он обозначен как MUX /OSD/I2C/UART2.

Чтобы активировать порт UART2 на порту MUX (согласно официальной инструкции на APM 2.8) надо запаять перемычки на MUX_RX2 и MUX_TX2.

Что мы и делаем.

Однако и после запайки перемычек подключиться к APM через USB-TTL конвертер не получается.
И опять лезем в документацию. На этот раз в прошивку.
И находим интересный комментарий:

#if CONFIG_HAL_BOARD != HAL_BOARD_APM2
    // we have a 2nd serial port for telemetry on all boards except
    // APM2. We actually do have one on APM2 but it isn't necessary as
    // a MUX is used
    gcs[1].setup_uart(hal.uartC, map_baudrate(g.serial1_baud), 128, 128);
#endif

Приблизительный перевод такой “У нас есть второй порт для телеметрии на всех платах за исключением APM2, по правде говоря он и на ней тоже есть, но он не нужен, так как там MUX используется”

Начинаем разбираться.
На APM2.5 и APM2.6 действительно MUX по умолчанию используется как I2C.

Но у нас APM 2.8 и штатный I2C живет рядом с портом GPS.

Таким образом можно смело задействовать UART2 на разъеме MUX. Для это надо привести закоментировать условие. В итоге должно получится так:

//#if CONFIG_HAL_BOARD != HAL_BOARD_APM2
    // we have a 2nd serial port for telemetry on all boards except
    // APM2. We actually do have one on APM2 but it isn't necessary as
    // a MUX is used
    gcs[1].setup_uart(hal.uartC, map_baudrate(g.serial1_baud), 128, 128);
//#endif

И пересобрать прошивку по официальной инструкции.
Должен получится такой файлик ArduCopter.hex. Выложу его здесь:
ArduCopter_3.2.1_uart2.zip
Прошиваем его в APM через Mission Planner таким образом: Initial Setup -> Install Firmware -> Load custom firmware.

Далее сбрасываем APM в дефолт. Зачищаем EPROM. Опять вводим параметры согласно инструкции к minimOSD-extra.

И радуемся результату.

PS: Понимаю что получилась ода официальной документации, но именно там найдены все решения.