Wiki

Version 7 (Dmitry Belimov, 11/26/2014 08:02 am) → Version 8/11 (Dmitry Belimov, 11/26/2014 08:11 am)

{{toc}}

h1. Wiki

Автопилот для БПЛА на основе микроконтроллера PIC32.

!http://www.oshec.org/attachments/download/266/Pi-pilot_thumb.jpg!

"Увеличить":http://www.oshec.org/attachments/download/265/Pi-pilot_small.jpg

h2. Принципиальная схема автопилота

* "Микроконтроллер":http://www.oshec.org/attachments/download/260/Pi-pilot-MCU.pdf
* "Датчики МЕМС":http://www.oshec.org/attachments/download/261/Pi-pilot-mems.pdf
* "Дальномеры":http://www.oshec.org/attachments/download/262/Pi-pilot-RM.pdf
* "Питание и разъемы":http://www.oshec.org/attachments/download/263/Pi-pilot-sockets.pdf

h2. Видео

* Тест сервоприводов - http://www.youtube.com/watch?v=6-7F5XNJY5w
* Тест телеметрии - http://www.youtube.com/watch?v=gKt6WIsbM1w
* Первый тестовый полет - http://www.youtube.com/watch?v=sYmyN397jMM

h2. Процессор

* "PIC32MX795F512L":http://www.microchip.com/wwwproducts/Devices.aspx?product=PIC32MX795F512L

h3. Используемые прерывания процессора

* 0
* 1
** 0 - ядро FreeRTOS
** 1 - не используется
** 2 - не используется
* 2
** 0 - Timer1 системный, ядро FreeRTOS, драйвер чтение/запись шины I2C1
** 1 - pin change interrupt, Timer2 отсчет временных интервалов для декодирования PPM сигнала пульта РУ
** 3 - RFLINK последовательный порт
* 3
** 0 - системные вызовы FreeRTOS
* 4
** 2 - генерация PWM сигнала PWM OCx

[[I2C interrupt driver]]

h3. Использование таймеров

* Timer1 - системный, ядро FreeRTOS
* Timer2 - захват сигналов РУ
* Timer3 - генерация аппаратного ШИМ
* Timer4 - генерация программного ШИМ
* Timer5 - не используется

h3. Использование последовательных портов

* UART1 - Радиолинк
* UART2 - не используется
* UART3 - не используется

h3. Использование каналов DMA

* 0 - не используется
* 1 - не используется
* 2 - не используется
* 3 - не используется
* 4 - не используется
* 5 - не используется
* 6 - не используется
* 7 - не используется

h2. Аппаратура радиоуправления

* Описание PPM, PCM кодирования "статья":http://www.poprobot.ru/theory/ppm-pcm
* Обсуждение на форуме сигналов с приемника "форум":http://forum.rcdesign.ru/f8/thread368844.html

h2. Используемые датчики

* Датчик давления BMP085, "как работать с датчиком":https://www.sparkfun.com/tutorials/253
* Датчик ускорения и магнитного поля, 3-х осный акселерометр + 3-х осный компас, размер 3х5мм.
** В новых версиях автопилота подумать над заменой на LSM303D сенсор LSM303DLHC не рекомендован для новых устройств.
* Датчик вращения, гироскоп 3-х осный L3G4200D

h3. Замена барометрического датчика

Очень интересен подсказанный барометрический датчик MS5611 "Internet":http://www.meas-spec.com/pressure-sensors/board-level-pressure-sensors/altimeter-pressure-sensor-modules.aspx , меньше по размерам, более точный, точность до 10см.

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

Необходимо рассмотреть вариант замены MEMS датчиков ориентации и магнитного поля на один MPU-9250

Плюс:
* Уменьшаем количество корпусов микросхем
* Перенос расчетов в DMP этого датчика
* Подключение барометра к этому датчику
* Разгружаем основной процессор

Минусы:
* Все замутно и проприетарно
* Переделывать уже работающую часть

h3. Ссылки по теме

* Вендор http://www.invensense.com/mems/gyro/mpu9250.html
* Как работать с датчиком, ссылки на исходники http://waterrocketry.com/2013/04/28/digital-motion-processing-dmp-on-the-mpu6050/

h2. Работа с датчиками

[[Расчет шумов]]

* Обсуждение создание собственной системы стабилизации т.е. автопилота "Форум":http://forum.rcdesign.ru/f123/thread224458.html
* Калибровка акселерометра/компаса "Интернет":http://we.easyelectronics.ru/Theory/pereorientaciya-akselerometra-kompasa.html
* Кватернионы, объяснение на английском "Интернет":http://www.chrobotics.com/library/understanding-quaternions
* AHRS алгоритм определения положения в пространстве "Интернет":http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/
* AHRS алгоритм определения положения в пространстве "Интернет":http://usmanqayyum.blogspot.ru/2013/04/source-httpwww.html
* Определение поворота с использованием магнитометра "Код":https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter/blob/master/IMU/MPU6050_HMC5883L/MPU6050_HMC5883L.ino
* Подробная статья с видеообзором по электронному компасу "Интернет":http://www.aimagin.com/learn/index.php/Making_a_Tilt-Compensated_Compass_from_FiO_Board_and_aMG_IMU_-_9A
* Подробная статья на русском по электронному компасу "Интернет":http://www.poprobot.ru/home/magnetometer_calibration
* Определение параметров магнитного поля в нужном месте, напряженность, наклон, уклон "Интернет":http://magnetic-declination.com/
* Калибровка магнитного компаса "Интернет":http://masters.donntu.edu.ua/2007/kita/gerus/library/calibration.htm
* Статья по расчету углов поворота зная данные акселерометра: "Интернет":http://bitaks.com/resources/inclinometer/content.html , "PDF":http://redmine.crlab.lan/attachments/download/48/ugol_naklona.pdf
* Еще одна статья по расчету углов поворота и комплиментарному фильтру "Интернет":http://masters.donntu.edu.ua/2013/fkita/perebeinos/library/article3.htm
* Работа с датчиком "L3G4200D":http://forums.trossenrobotics.com/showthread.php?5431-L3G4200D-Gyro-Integration-on-Arduino
* "Чтение преобразование данных с датчиков":http://marks-space.com/2013/04/29/guide-to-interfacing-a-gyro-and-accelerometer-with-a-raspberry-pi/
* Чтение и преобразование температуры с датчика LSM303DLHC
<pre><code class="python">
def readTemperatureCelsius(self):
"Returns temprature reading in celsius unit"
temp = self.readTemperature()
return (self.__twos_comp(temp, 12) / 8.0) + 18

def __twos_comp(self, val, bits):
"compute the 2's compliment of int value val"
if( (val&(1<<(bits-1))) != 0 ):
val = val - (1<<bits)
return val
</code></pre>
* Преобразование температуры с датчика L3S4200D, "отсюда":http://forums.parallax.com/showthread.php/137934-Sample-code-for-temperature-from-Gyroscope-Module-3-Axis-L3G4200D-(-27911)?p=1153113&viewfull=1#post1153113
<pre>
Sensor Output is 25 at 25 Deg C and the output changes -1 for each Deg change in Temp
The 25 is not the Temperature it is a Reference number
To Get the Temperature you have to
Subtract the Value in OUT_TEMP(26h) Register From 25
then Add that to 25 Then use it as Deg C or Convert it to Deg F =(Deg C*9/5+32)
Note The Temp is not ambient Temp it is the Sensor Temperature of the chip
which changes negative for positive temp changes because that the direction the Measurements are affected
They increase as temp Decreases so an negative correction is needed.
To Measure Approx Ambient Temp one could add an offset Correction Number to get closer.
Comment the temperature measurement is Sensor Temp not ambient. The following can be used to create something somewhat useful

VAR

Byte STemp, ESTemp

PUB ReadTemp
STemp := Read_1B(OUT_TEMP)
ESTemp := 25 - STemp
ESTemp := ESTemp + 25 - 4 'Deg C the -4 is my correction yours may be different
ESTemp := ESTemp * 9 / 5 +32 'Deg F
</pre>

* "Калибровка":http://we.easyelectronics.ru/Theory/pereorientaciya-akselerometra-kompasa.html#cut компенсация сдвигов при пайке и расположения в корпусе.

h2. PID-регулятор

* Статья о PID регуляторе, смотреть рекуррентную формулу регулятора "Интернет":http://ru.wikipedia.org/wiki/%CF%C8%C4-%F0%E5%E3%F3%EB%FF%F2%EE%F0

h2. Рулевые машинки

* "Статья":http://www.rcdesign.ru/articles/radio/servo_intro



h2. Программный ШИМ

Принцип действия

!http://www.oshec.org/attachments/download/267/schematic_servo_1.gif!



h2. Телеметрия

* Описание и управление модулем телеметрии "Интернет":http://copter.ardupilot.com/wiki/common-using-the-3dr-radio-for-telemetry-with-apm-and-px4/

h3. Mavlink

* Описание протокола http://qgroundcontrol.org/mavlink/start , https://pixhawk.ethz.ch/mavlink/
* Описание пакетов протокола и нескольких управляющих пакетов "PDF":http://redmine.crlab.lan/attachments/download/77/MAVLINK_FOR_DUMMIESPart1_v.1.1.pdf
* Описание пакетов от наземной станции, код http://erlerobotics.gitbooks.io/erlerobot/en/mavlink/mavlinkaction.html
* Код реализации телеметрии на ARM Cortex http://cortex-ap.googlecode.com/svn/tags/REV2/Firmware/Source/mav_telemetry.c
* Сделал простой проект FreeRTOS+MAVLINK для chipkitMax32 https://gitlab.com/pitman/chipkitmax32-mavlink/tree/master
* Интеграция с ROS http://qgroundcontrol.org/dev/mavlink_ros_robot_operation_system_integration_tutorial , еще один плагин http://roboforum.ru/forum108/topic14360.html

h2. microSD

h3. Черный ящик

* Описание как работает черный ящик в ArduPilot https://code.google.com/p/ardupilot-mega/wiki/Datalogging

h2. Замечания по схеме

* Напряжение питания для подтягивающих сопротивлений для I2C нужно брать то же что используется для питания датчиков на I2C.
* Входа захвата сигналов аппаратуры РУ не являются pin change interrupt 4 из 8, легко можно захватить только 4 сигнала. Немного исправив схему: PGED1 (25),PGEC1 (24) не используемые при полете можно завести тоже на захват сигнала, тогда будет всего 6 входных каналов. Надо или нет еще 2 большой вопрос. Если отказаться от кварца на 32кГц, можно получить еще 2 входных канала.
* Входы захвата УЗ дальномеров не все поддерживают pin change interrupt, всего выводов таких 5, надо 5 или 6. Изменить схему, соединить такие выводы с контактами для УЗ дальномеров.
* Заменить микросхему расширения портов для серв с 4022 на 4017, 0 выход не подключать, начать с 1-го и по 9-ый. В текущей схеме можно использовать только 7 доп.каналов серв.
* Линейный стабилизатор на 3.3В довольно сильно греется. Стоит рассмотреть вариант его замены на DC-DC высокочастотный преобразователь ADP2108AUJZ-3.3-R7 или подобный. Площадь занимаемая преобразователем практически не изменится - "Internet":http://www.analog.com/ru/power-management/switching-regulators-integrated-fet-switches/adp2108/products/product.html . Катушка индуктивности для него LPS3010-102MRB
* Заменить барометрический датчик давления BMP085 на что-то другое, например BMP230 в связи с окончанием производства BMP085.
* Заменить МЕМС датчик LSM303DLHC на LSM303D в связи с окончанием производства, опять же более дешевый.

h2. Замечания по плате

* Странности
** Разрыв дорожки под МК от ножек 88, 89 на программный ШИМ U4 14, 15. Причем разрыв именно под МК, переход на стороне МК звонится нормально

h2. Ссылки на статьи и форумы

* Строим квадрокоптер, цикл статей "1":http://habrahabr.ru/post/227425/
* Создание своей системы PID стабилизации для коптера "статья":http://habrahabr.ru/company/technoworks/blog/216437/
* Адаптивный регулятор "статья":http://ycyber.pro/?p=2194

h3. Подобные проекты

* http://forum.rcdesign.ru/f8/thread216494.html
* http://forum.rcdesign.ru/f123/thread224458.html