воскресенье, 8 ноября 2015 г.

Коптер

   Начал совсем недавно пилить свой квадрокоптер. За основу пока взят мой борд STM32VLDISCOVERY. У него на борту не очень крутой контроллер STM32F100RBT6: 24MHz, 128Kb FLASH, 8Kb RAM, однако пока что его даже много )

   Что успел запилить:
Напаял железки на борд! 2 RFM70 радио модуля пока на 1 общий SPI, акселерометр BMA280 на отдельный SPI, собрал узел контроля оборотов коллекторного мотора, схемка вышла не сложная ) Через полевой транзистор IRLML2803  ШИМ-ом включаю/отключаю питание у мотора, скважностью пульса регулируются обороты, так же добавлен диод Шоттки в качестве шунта мотора, резистор на 100К что бы не происходило произвольного открывания затвора транзистора если WPM пин в подвешенном состоянии.


И для удобства запилил простенький командный интерфейс через виртуальный COM порт, могу теперь устанавливать "обороты" движка через консоль.

   Так же завёл акселерометр, что, в общем то, не сложно, используя стандартную библиотеку от BOSCH https://github.com/BoschSensortec/BMA2x2_driver.  Хотя конечно некоторые вещи в нём не очевидны! Например, у него в bma2x2.c файле в глобальной переменной u8 V_BMA2x2RESOLUTION_U8 = BMA2x2_14_RESOLUTION; захардкодена битность показаний осей акселерометра, всегда 14 бит. И это странно тем, что мне нужно менять чужой драйвер что бы получить другую битность.
   А ещё одна корявость состоит в том, что у них же в файле-примере bma2x2_support.c есть семплы имплементации функций чтения/записи SPI и чтение осей акселерометра. Акселерометр позволяет последовательно читать несколько регистров за раз! И для этого в семпле используются буферы и их размер задефайнен как #define SPI_BUFFER_LEN 5 чего не хватает для работы с функцией bma2x2_read_accel_xyz которая в этом же семпле и используется. Я изначально внимание не обратил и долго думал, почему у лежащего горизонтально акселерометра ускорение 0 )  Оказалось ось Z просто не вмещалась в буфер!

   Радио пока через RFM70. Для реального применения в квадрокоптере этот радио модуль не подходит из за малого радиуса действия (метров 10), но хоть что-то. Будет использоваться для передачи команд с пульта на коптер.






среда, 4 ноября 2015 г.

Мелкий апдейт движка

Добавил систему ввода, поддерживаются множество клавиатур, мышей, джойстиков, всё крайне просто и достаточно удобно.

auto keyboards = Input::instance()->keyboards();

if(keyboards[0]->get_key_state(0x57)){
gameObject->transform->set_local_position(gameObject->transform->get_local_position() + gameObject->transform->forward() * (deltaTime * move_speed));
}

Так же начал прикручивать AMP рендереры, пока что для параметрических поверхностей, чуть позже сделаю биндинги к полигональным моделям. Таким образом можно будет делать гибридный рендер стандартный (растеризацией полигонов) и Path Tracing-ом.

Сложнейший рендер: сферка отрендеренная трассировщиком пути, в цвете выведены нормали.


понедельник, 25 мая 2015 г.

Unity Killer :D

Пописываю параллельно с остальными проектами "убийцу Unity" :D

Что уже есть:
Компонентная система сущностей, иерархии трансформов, шейдеры, система материалов удобная, класс для рисования Gizmo, меши с сабмешами, рендеринг из нескольких камер в кадре и так ещё всякие мелочи)   Скоро добавлю загрузку текстур и мешей.

воскресенье, 5 апреля 2015 г.

Атмосфера

Запилил по-быстренькому атмосферу для планеты в Unity





воскресенье, 8 марта 2015 г.

Микро апдейт

Немного обновил осциллограф - добавил деления на осях и границах экрана для удобства визуального определения значения функции, изменил цвета, сделал вывод снизу экрана осциллографа инфу о каналах - ID, скейл по Y (значение на ячейку), цвет канала. Теперь легче ориентироваться. Ну и кламп графиков по окну осциллографа добавил )

В коде стабилизации квадрика поправил несколько ошибок, сменил PID контроллер Yaw оси на PD т.к. интеграл ошибки считать по этой оси нельзя, знак ошибки постоянно меняется, стало всё стабильно работать без внезапных улетаний в космос )


воскресенье, 15 февраля 2015 г.

Заработала стабилизация

Подкрутил стабилизацию, теперь осталось добавить контроль Yaw вращения и в первой итерации контроллер полёта готов.  Умеет сам держать заданную высоту, умеет слушаться команд "пульта" ( в реале - джойстика) и собсно держать нужную заданную ориентацию. Всё считается по-честному.


Апдейт виртуального мультикоптера

Перепиливаю систему стабилизации мультикоптера. Переписал код работающий с ориентацией коптера с углов Эйлера на кватернионы, всё стало клёвее, ошибка считается в локальном пространстве коптера, представляет собой вектор "наклона" коптера относительно заданной ориентации. Dot-ом для каждого считаю развешивание ошибки между движками (на рисунке - жёлтые линии выходящие из движков), получается прям очень удобная система! Она не зависит от количества и расположения движков, всё автоматом развешивается и работает.  Осталось накинуть обратно PID контроллеры и квадрик снова будет летать )


суббота, 14 февраля 2015 г.

Квадрокоптер

Пришёл наконец с Китая Hubsan X4 H107L  квадрокоптер. Самый простой в серии X4, но летает весьма круто. Правда, из коробки он по ходу вообще не был откалиброван, летел в сторону, стики странные значения по разным осям выдавали, но после стандартных калибровок стиков/акселерометра всё пришло в норму )

четверг, 12 февраля 2015 г.

Развлечение

Решил забавы ради запилить простенький симулятор мультикоптеров на Unity.

Сделал расчёт тяги винтов, расчёт крутящего момента, минимальную стабилизацию в контроллере полёта )  Летает, корявенько пока, но я прекрасно понимаю что надо сделать, чтобы летал нормально, тем и занимаюсь в данное время )  Для отладки контроллеров стабилизации накидал себе сейчас скриптик "Осциллограф".   Поддерживает любое количество "каналов", у каналов настраивается скейл по обоим осям, настраивается частота семплинга у осциллографа. В общем довольно удобная для дебага штуковина получилась )



среда, 21 января 2015 г.

Наконец пришла плата с FPGA от Altera! ^__^

Наконец дождался борд из Китая с FPGA!  Давно хотел попробовать программирование под всякие там ПЛИС-ы и вот оно свершилось :D



Скачал Quartus II и прочитал введение в Verilog.  После получаса безуспешных ковыряний в IDE я всё же смог сам написать, собрать и прошить первый код на Verilog ^____^   Пищит динамиком на плате:

module Test(clk, out);

input clk;
output out;
reg out;
reg[15:0] cnt;

parameter period = 7000;

always@(posedge clk)
begin
 cnt<=cnt+1;
 if(cnt == period)
 begin
  cnt<=0;
  out<=~out;
 end
end

endmodule

воскресенье, 11 января 2015 г.

ELF & DWARF parser

Написал тут по-быстрому (хотя не очень, 4 дня потратил на этот говнокод) на C# библиотеку для чтения ELF файлов и парсинга DWARF4 дебаг информации в ELF файлах.

https://github.com/L-proger/ELFUtils

https://github.com/L-proger/ELFExplorer - GUI приложение, лагучий набросок.

В основном для самообучения, для раскуривания дебаггинга и т.п. но ещё одно интересное для меня применение - напишу вскоре тулзу для вывода подробной инфы о памяти ELF бинарника.  Я довольно часто программирую под микроконтроллеры и как многим известно там есть обычно достаточно большие проблемы с объёмом памяти - как FLASH так и оперативной, потому часто приходится считать байты и стараться сделать бинарник как можно меньше по размеру.


Вот и накидал эту библиотеку. На самом деле всё можно было бы сделать гораздо проще! Использоваться стандартную тулзу тулчейна readelf и, скажем, регулярками разбирать её вывод и получать финальную информацию о символах в бинарнике, но это слишком просто ) А так я разобрался в DWARF формате что меня весьма радует.

Пример вывода консольной версии ниже. Консоль сейчас для простого дебага, я вскоре сделаю красивый удобный гуй для этого всего )   А, да, ещё DLL умеет парсить пока минимально lds скрипты линкера и правильно использовать информацию о секциях памяти для последующего анализа её использования (можно посмотреть сколько % памяти каждого из банков занято и т.п.).


Вывод инфы по секциям памяти.