Логи на MultiWii/MahoWi на Crius AIOP v2
Немного доработал свою библиотеку для записи логов на MultiWii на контроллере Crius AIOP v2 с микросхемой AT45DB161. Предыдущие части тут и тут.
Что нового
• Логи теперь пишутся непрерывно. Новые записи автоматически пишутся поверх самых старых.
• Вывод делается в более удобной форме. Сначала выводится список всех полётов в хронологическом порядке от последнего до самого давнего. Затем по очереди выводятся логи каждого полёта, начиная с последнего.
• В GPS-треках в Google Earth можно смотреть высоту полёта в этой точке. Кроме того, точки в GPS-треке пронумерованы. В текстовом логе можно посмотреть более подробную информацию о том, что происходило с коптером в этом месте.
Установка и использование.
Способ установки такой же, как и раньше:
-
Положить файл FlashLog.ino в папку с MultiWii.
-
Добавить строку в файле config.h:
#define FLASH_LOG
- Добавить в файле MultiWii.ino в конце функции setup()
Flash_Log_Init();
- Добавить в файле MultiWii.ino в конце функции annexCode():
Flash_Log_Write_Values();
- В файле Serial.ino в функции evaluateOtherData(uint8_t sr) в конструкцию switch-case добавить:
case 'R': if (!f.ARMED) Flash_Log_Read_Memory(FLASH_LOG_OUTPUT_FORMAT_FULL); break;
case 'r': if (!f.ARMED) Flash_Log_Read_Memory(FLASH_LOG_OUTPUT_FORMAT_SHORT); break;
case 'g': if (!f.ARMED) Flash_Log_Read_Memory(FLASH_LOG_OUTPUT_FORMAT_GPX); break;
case 'e': if (!f.ARMED) Flash_Erase_Memory(); break
Считать лог можно из терминала или Монитора порта в Arduino IDE, отправив соответствующие символы:
R – вывод подробной таблицы (20 записей в секунду).
r – вывод сокращённой таблицы (1 запись в секунду).
g – вывод GPS-трека. Его можно скопировать и сохранить с расширением .gpx.
e – очистка памяти.
Структура памяти
Память в AT45DB161 физически поделена на 4096 страниц по 512 байт каждая. Данные во флеш-память могут записываться только постранично. Моя библиотека записывает примерно одну страницу в секунду. Таким образом, памяти хватает больше, чем на час полётного времени.
На иллюстрации показана постраничная структура памяти. Пустые страницы флеш-памяти всегда полностью заполнены единицами (FF в шестнадцатиричном виде). Страницы с данными в первых двух байтах содержат Record ID – номер записи полёта, который увеличивается на единицу при каждом новом “арме”. По Record ID программа определяет, в каком порядке выводить данные и откуда начинать запись в следующий раз.
a) Показана запись первого полёта, который длился около 8 секунд и занял 8 страниц в памяти.
b) Показана память после двух полётов.
c) При 25-м полёте заполнились все 4096 страниц и запись пошла по второму кругу. Самый ранний полёт частично перезаписан.
На каждой странице данные размещаются следующим образом:
• 32 байта заголовка. В них содержатся данные, которые сохраняются раз в секунду. Это GPS-координаты, количество спутников, расстояние от точки взлёта.
• 20 кадров по 24 байта. Кадры пишутся 20 раз в секунду и содержат часто изменяемые данные: каналы приёмника, показания датчиков, напряжение батареи, метки времени.
Итого 32 + 20 х 24 = 512 байт.
Как только все 20 кадров собраны в буфер, происходит запись буфера в основную флеш-память.
Предупреждение
Напомню, что для записи/стирания AT45DB нужно качественное питание. В моменты записи микросхема очень короткое время потребляет большой ток. При питании от USB через длинный тонкий кабель могут произойти ошибки записи и стирания. Особенно, если одновременно с AIOP запитываются GPS, приёмник и другие устройства.
Для чтения флешки питание не так важно. Логи можно считывать с любым питанием, при котором работает контроллер, то есть достаточно просто подключить его к USB.
Планы
Была идея сделать универсальную библиотеку и для 2.2/MahoWii, и для 2.3/2.4. Но у этих версий слишком большие различия в структуре кода. В 2.2 проект состоит из .ino-файлов, в начиная с 2.3 - из .cpp и .h. Потребуется немало усилий, чтобы одна и та же библиотека подходила и туда, и сюда. Делать два параллельных варианта проблематично, потому что у меня только один контроллер, на котором я летаю.
Сейчас я использую MahoWii, так как с этой прошивкой коптер летает стабильнее всего. Поэтому пока библиотека для записи логов останется в .ino-формате.
В планах – сделать десктопную программу для автоматического копирования логов и треков в файлы.
Библиотека MultiWii-FlashLog находится на Github.