Запись логов полёта в MultiWii на Crius AIOP v2 (beta-версия)

Во время полётов у моего коптера на MultiWii временами возникали странные глюки. Захотелось выяснить, в чём конкретно причина - в аппе, датчиках, регуляторах или в чём-то ещё. Для этого мне нужно было записать подробный лог полёта. На форумах я не нашёл готового решения. Многие используют bluetooth-модуль в связке со смартфоном, но у меня на тот момент не было ни того, ни другого, поэтому я решил изобрести свой велосипед.

На полётном контроллере Crius All in One Pro v2 стоит микросхема flash-памяти AT45DB161 на 16 Мегабит, которая подключена через SPI-интерфейс и никак не используется Мультивием. Её я решил задействовать.

Немного теории.

Вся память в микросхеме AT45DB поделена на страницы по 512 байт. Записывать и стирать данные можно только постранично. Запись данных весьма медленный процесс, на одну страницу уходит около 10 миллисекунд. Поэтому, чтобы записывать было удобнее, в микросхеме памяти есть два буфера по 512 байт каждый.

Функция Flash_Log_Values() вызывается каждый раз в главном цикле и записывает 32 байта данных в буфер. Когда буфер заполняется полностью, мы посылаем команду «записать буфер в основную память» и, пока буфер переписывается в страницу flash-памяти, мы заполняем новыми данными второй буфер. А потом снова переключаемся на первый и так далее.

Таким образом, во время полёта контроллеру не нужно надолго отвлекаться от своей главной задачи - стабилизации. На отправку 32 байт данных в буфер уходит примерно 120 микросекунд.

Цикл длится примерно 3-4 миллисекунды, а это значит, что данные будут записываться с частотой порядка 300 раз в секунду. Это излишне в большинстве случаев, в таком режиме памяти хватит чуть больше чем на три минуты. Поэтому я ввёл параметр AT45DB_DECIMATION, который задаёт прореживание. Если параметр равен 2, то значения пишутся в лог каждый второй цикл. Его можно изменять.

Как установить.

У меня установлен MahoWii RC3.1, который создан на основе MultiWii 2.2. В этой версии исходный код состоит из ino-файлов и инструкция ниже подходит именно для этой версии. Если у вас версия 2.3, то возможно, надо будет немного переделать код и вместо .ino-файла сделать .h- и .cpp-файлы.

  1. В папку проекта добавить файл FlashLog.ino.

  2. В файле config.h добавить строчку:

#define FLASH_LOG
  1. В главном файле MultiWii.ino в функции «annexCode()» добавить:
Flash_Log_Values();
  1. В функцию setup() в этом же файле добавить:
Flash_Log_Init();
  1. В файле Serial.ino найти функцию evaluateOtherData(uint8_t sr), в ней будет условие switch-case с кучей вариантов. Туда надо добавить ещё два:
case 'r':
if (!f.ARMED) Flash_Read_Memory(); break;
case 'e':
if (!f.ARMED) Flash_Erase_Memory(); break;

Как использовать.

Запись лога автоматически стартует каждый раз, когда делается arm и останавливается, когда делается disarm.

Чтобы считать лог надо запустить Arduino IDE, через которую мы прошивали контроллер, и открыть «Монитор порта».

Команд всего две:
r - считать данные;
e - стереть всю память.

Так выглядят записанные данные:

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

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

В следующих колонках пишутся все записанные значения:

  • 4 канала приёмника;
  • 4 значения, выдаваемые на ESC (иными словами обороты моторов);
  • показания гироскопа по трём осям;
  • направление по компасу;
  • высота по барометру;

Полученные данные можно скопировать в Excel, Matlab или другой удобный софт и там уже их подробно изучить и построить графики.

Планы.

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

Также хочу заменить номера на временные метки (минуты и секунды), чтоб лучше понимать, в какой момент времени что происходило.

Ещё планирую сохранять GPS-координаты, напряжение батареи и полётные режимы.

Вопрос к аудитории: нужны ли людям логи на Мультивие? Интересна эта тема и стоит ли её дальше развивать? Принимаются любая критика и любые пожелания.

Текущую версию файла FlashLog.ino можно скачать на GitHub.

P.S. Флеш-память AT45DB требовательна к хорошему питанию. Во время прошивки и настройки я питал контроллер напрямую от USB. От контроллера питание разветвлялось на приёмник FrSky, OLED-экранчик, GPS-приёмник и светодиоды. При таком количестве устройств 5 Вольт проседали и, видимо, шли помехи по питанию. Память перестала стираться и стала выдавать какую-то чушь вместо данных. Память стала хорошо работать только тогда, когда я отсоединил питание от GPS.
При питании от батареи через 1,5-амперный DC-DC преобразователь таких проблем не наблюдается.
Так что, если вы запитываете контроллер от USB во время работы с AT45DB, следите, чтоб на линии питания не было сильно потребляющих устройств.

  • 1808
Comments
P_L_Z

интересно но не припомню такой микросхемы на своем AIOP 1.1

AlexeyStn

Её стали ставить только со второй версии.

shvach2006

Тема очень актуальна, хотя щас тренируюсь на пирате.

gorbln

Тема очень хорошая. В идеале, конечно, впилить какую-нибудь SD карточку. Но и так весьма неплохо.

iSheeZ

Спасибо, пригодится!
Надо будет обязательно добавить запись координат, чтобы можно было строить карту полета для гуглокарт.

AlexeyStn

Для SD-карточки нужен дополнительный модуль и провода к нему. Хотелось максимально использовать то, что уже имеется.

Запись GPS-треков добавлю обязательно.

wallera

Блин! Класс! тож думал об этом , с нетерпением жду продолжения!

По поводу питания 45db, при записи жрет до 100мА!! , я использую ее в своих проектах

Covax

Супер! Подписался на блог!