Как подружить 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:
Подготовка:
- Отключаем USB кабель.
- Подключаем APM 2.8 (прошитый последней официальной прошивкой 3.2.1), а именно порт Telem к компьютеру через USB-TTL конвертер.
- Запускаем MissionPlanner соединяемся с APM указывая COM-порт конвертера и скорость 57600.
- Поверяем значения параметров, и меняем их на те, которые рекомендованы в официальной документации. Перегружаем APM. Проверяем, что значения сохраняются.
- Теперь заходим в Configuration-Planner и запоминаем/записываем путь Log Path. Там мы будут создаваться логи и там мы буем их искать.
- Закрываем MissionPlanner.
Создание лога:
- Отключаем провод TX от USB-TTL конвертера. Нам же надо записать реальный поток который будет идти на плату OSD. Должно остаться только два провода GND и RX.
- Заново запускаем MissionPlanner соединяемся с APM.
MissionPlaner находит поток от APM и начинает запрашивать параметры. Но запросы до APM не доходят, так как проводка то TX у нас нет. Поэтому когда появляется окно с Getting Parameters нажимаем Cancel. - Ждем минуту.
- Армим коптер.
- Ждем минуту покачивая коптер, чтобы в лог попали изменения положения.
- Дизармим коптер.
- Отключаемся от APM кнопкой Disconnect.
- Закрываем 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: Понимаю что получилась ода официальной документации, но именно там найдены все решения.