Давным-давно, еще во времена АрдуКоптера 3.0, кем-то был написан HAL для Ardupilot для платформы OpenPilot Revolution. К сожалению, этот код не поддерживался в течение многих лет и поэтому безнадежно устарел.
Некоторое время назад, я привел этот код к текущему состоянию Ardupilot и сделал PR на GitHub-е, дабы включить этот HAL в официальный репозиторий.
С тех пор прошло 2 версии ArduCopter-а, но это PR до сих пор висит.
UPD (20.02.2018) HAL в мастере! Однако еще есть причины пользоваться этим форком
По сравнению с исходным HAL:
- Почти весь код полностью переписан
- Добавлена проверка для всех входных параметров функций - нет более HardFault при установке неправильных значений параметров
- Внешняя шина I2C переехала с FlexiPort на драйвер Soft_I2C, поэтому есть по крайней мере 3 UARTа
- Добавлен еще 1 полнофункциональный UART (только для квадрокоптеров) и 1 только RX UART для DSM сателлита на разъеме Oplink
- Добавлена поддержка пищалки (требуется дополнительный транзистор)
- стек перемещен в CCM память
- PPM и PWM входы работает через обработчики драйвера таймера - устранены все конфликты
- Добавлена возможность принимать DSM, SUMD и SBUS на входе PPM
- Все таблицы описания аппаратуры теперь константные и размещаются во флеше, а не в оперативке
- Более надежный сброс зависаний шины I2C
- Все драйверы поддерживают вызов set_retries ()
- Все задержки - даже микросекунды - очень точные, реализуются с помощью аппаратных часов (счетчик DWT_CYCCNT) в автономном режиме
- Разделенных порты USB и драйверы UART
- Новый SoftwareSerial драйвер на основе аппнота от ST
- используется вывод DRDY MPU6000
- Устранены предупреждения компилятора
- Портирован и слегка доработан загрузчик для поддержки пришивки, размещаемой по адресам 8010000 и 8020000 (2 нижние 16k страницы флэш-памяти используются для эмуляции EEPROM)
- Эмуляция EEPROM доработана для обеспечения надежности хранения данных при сбоях питания
- Оптимизировано использование EEPROM путем изменения размера записи с 1 байта до 2 байт
- Все внутренние вызовы используют статические приватные методы - нет оверхеда на обращения к членам класса
- Удален многие неиспользуемые файлы
- функция micros() использует 32-bit аппаратный таймер вместо сложной, тяжелой и глючной systick_micros()
- добавлена поддержка параметров HAL
- OneShot работает! При этом добавлен слой трансляции из режимов коптера в режимы HAL
- добавлены дескрипторы всего набортного оборудования
- добавлена поддержка перезагрузки в режим аппаратного DFU (через MP "force PX4 bootloader" )
- после любого HardFault или Panic() происходит автоматическая загрузка в режим аппаратного DFU
- Поддержка режима diversity в RC_Input! Можно подключать два (даже разных!) приемника RC
- отменены идиотские изменения из апстрима в интерфейсе Periodic
- добавлена возможность использования вывода компаса DataReady
- унифицирована обработка всех исключений
- добавлена возможность бинда Спектрумовских сателлитов без управляемого стабилизатора 3.3в (требует кратковременного отключения питания)
- Добавлена поддержка последовательности сброса Arduino32 - спад DTR на 1200 бод или пакет «1eaf» с высоким DTR
- Исправлено зависание при сбое флеш-памяти
- Соединение с USB идет без потери символов и без зависания при отключении
- Добавлена сработка FailSafe при зависании приемника - если ни один канал не меняется за 60 секунд
- Добавлена поддержка параметров HAL
- Проект доработан для упрощения поддержки немного разных плат - например. AirbotF4
- Полная поддержка AirbotF4 (отдельные двоичные файлы)
- Добавлена поддержка сервоприводов на неиспользуемых входных пинах
- Добавлена обработка битов ошибок FLASH_SR, включая автоматическую очистку защиты от записи
- Добавил Arduino-подобную поддержку реле на произвольном выводе
- Упрощен драйвер UART, буферизация теперь используется даже в неблокирующем режиме
- Эмуляция EEPROM блокирует флеш после каждой записи с прерыванием в случае недопустимой записи
- Обработка ошибок EEPROM
- Исправлено похищение Ардупилотом Сервоприводов, даже если они отмечены как «Неиспользованные»,
- Добавлена дата и время компиляции для вывода в консоль
- Добавлен вход SBUS через USART, например на платах Airbot
- Добавлены файлы read_me.md для каждой платы
- Режим DMA для больших передач SPI
- Виртуальный COM-порт USB может быть подключен к любому UART - например. Для настройки модемов OSD или 3DR
- Любой UART может быть подключен к ESC для 4-way интерфейса
- Поддержка логов на SD-карте для платы AirbotV2
- Время ожидания I2C ограничено 0,3 с - больше не зависает навечно от ошибок внешнего компаса
- FlexiPort может быть переключен между UART и I2C согласно параметрам
- Модуль RCoutput полностью переписан.
- для выходов PWM скомпенсирована ошибка в настройке частоты таймера
- Добавлен параметр для установки режима PWM
- Добавлена информация о используемой памяти
- Добавлена отчетность об ошибках I2C
- Реализовано малопотребляющее состояние бездействия с WFE, TIMER6 используется для генерации событий рас в 1uS
- Добавлен параметр HAL_RC_INPUT, позволяющий принудительно назначить модуль ввода RC
- Добавлена статистика об использовании памяти и стека
- Добавлено создание файла .DFU
- Долгие операции перемещены с уровня прерывания на уровень ввода-вывода с минимально возможным приоритетом - теперь не теряются пакеты SBUS во время обработки
- Добавлена поддержка системы безопасности задающего генератора - если HSE (кварц) отказал в воздухе, контроллер станет использовать HSI вместо него
- Добавлен EmergencyHandler, который будет вызвана при любой ошибке или вызове Panic() перед остановкой - например, Выпустить парашют
- Индивидуальная раскладка моторов для каждой платы
- Индивидуальное назначение консоли для каждой платы
- HAL переведен на новый DMA API с прерываниями завершения обмена, и драйвер SD этим пользуется
- Плата AirbotV2 полностью поддерживается - SD-карта и OSD (OSD работает!)
- Добавлена поддержка чтения с SD-карты через USB, что позволяет использовать USB MassStorаge (задается через параметр HAL)
- Добавлена проверка переполнения стека для всех задач через MemoryProtectionUnit
- Все платы могут форматировать внутренний флеш-чип в FAT и обеспечить доступ через USB
- Добавлено автораспознавание SPI Flash
- Добавлена поддержка команды TRIM для Dataflash, форматированного в FAT
- Переписана библиотека SD для поддержки «errno» и раннего различения файла и каталога, также вдвое уменьшен расход памяти
- Преемптивная многозадачность, все драйверы работают в собственной задаче
- Добавлено переформатирование DataFlash в случае жестких ошибок файловой системы, что устраняет ошибку FatFs, когда не освобождается место после переполнения файлов, а затем его удаления
- Добавлено автоопределение для всех известных типов баронов на внешней шине I2C
- Добавлено автоопределение для всех известных типов соединений на внешней шине I2C
- Добавлена проверка на I2C_Mgr для повторного создания устройства на одной шине с тем же адресом - для предотвращения ложного автоопределения, например MS5611 (уже инициализированного) как BMP_085
- Добавлен параметр HAL "TIME_SHIFT" - разница времени между GMT и местным временем
- Добавлена синхронизация времени между временем платы и временем GPS - так что в журналах теперь будет отображаться реальные локальные даты и время
- добавлен параметр, позволяющий отложить сохранение EEPROM до арминга
- компас и барометр отпускают семафор шины сразу после чтения, чтобы разрешить работу других драйверов во время вычислений
- полный статус только на 2 светодиодах - подсчет спутниковв GPS, режим Failsafe, калибровка компаса, режим Autotune и т. д.
- добавлена возможность подключения пищалки к произвольному выводу (параметр NTF_BUZZ_PIN)
- добавлен приоритет для пересылок SPI DMA
- поддержка оверклокинга!
- добавлена трансляция декодированных последовательных данных из входного порта PPMn в софтверные UARTы
- Драйвер SoftSerial может использовать любой вывод с таймером для RX и любой вывод для TX, и может быть любое количество SoftSerial UART
- добавлена поддержка критических секций шедулера, которые защищают задачу от переключения без запрета прерываний
- ...
- Множество мелких улучшений
Так что если кого-нибудь интересует ArduPlane / ArduCopter на контроллере весом 5 грамм (с корпусом), а не только на огромном и тяжелом PixHawk - код и бинарники тут. Описание подключения
Проверено, летает!
При этом обеспечиваются многие возможности, отсутствующие у официальной прошивки!
- USB порт может быть подсоединен к любому UART, например к ОСД для настройки.
- Любой УАРТ может быть подключен к ESC для их программирования
- SD карта может быть подключена к USB в режиме MassStorage - нет необходимости вынимать ее из корпуса для чтения логов
Вышеприведенные пункты позволяют разместить контроллер в корпусе и не разбирать его для настройки/чтения логов. А также:
- автодетект компасов и барометров на внешней шине I2C позволяет подключить любую платку сенсоров для Ардуины серии GY-
- автодетект протоколов SBUS/DSM/SUMD/PPM
- есть FailSafe при зависании приемника, если ни один канал не меняется за 60 секунд - теперь это не вызовет улета
- возможность подключения 2х приемников - либо одновременно LRS и 2.4, либо как Diversity. Также это заметно увеличивает надежность
- используется система безопасности кварца - контроллер не зависает при его отказе
- возможен оверклок процессора - стабильно работает до 240 МГц!
- возможно практически произвольное использование свободных выводов
- возможно использование аналогового датчика воздушной скорости
- пищалка может быть назначена на любую ногу
- полная индикация состояния на 2х диодах: подсчет спутниковв GPS, режим Failsafe, калибровка компаса, режим Autotune и т. д.
- процессор ~65% времени проводит во сне - что значительно снизило потребление и нагрев
Вся коптерная электроника кучей - 15 грамм.
А вот вся электроника на коптере
Поблагодарить можно тут:
USD
EUR
Или переводом - PayPal на vde@ykoctpa.ru, Qiwi 9173480717
UPD. Добавлена поддержка барометра на внешней I2C. Теперь можно взять такой контроллер на Ф4 за 15 баксов, к нему такой или такой модуль - и вот у нас полный контроллер для Ардупилота за $23 или даже $19
UPD2. Протестирована работа всей перефирии на SoftI2C и SoftSPI - теперь любые 2 ноги контроллера могут быть назначены как внешняя шина I2С, и любые 4 ноги - как внешняя шина SPI. Что, помимо наличия выведенной наружу SPI3, позволяет подключить произвольное оборудование в практически произвольном количестве.
UPD3. Добавлена возможность легко добавлять произвольные платы на похожих процессорах, отличающиеся только назначением выводов
ПРОШИВКА.
OPBL образы не поддерживаются, ибо бинарник должен жить на другом адресе, поэтому для перепрошивки нужно перевести проц в режим DFU - для этого замкнуть выыодв платы BOOT и включить USB. А затем выполнить команду
dfu-util -a 0 --dfuse-address 0x08000000 -D /path/to/firmware.bin
где firmware.bin это прошивка для вашей платы.