Автономный квадрокоптер

Ваши интересы, хобби.
adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#1

Непрочитанное сообщение adiagnost » 05 апр 2018, 20:44

Тема связана с:
http://novocherkassk.net/viewtopic.php?f=126&t=126711
Будучи в "вынужденном отпуске", т.е., на больничном, появилось время самому плотно заняться проектом. Тем более, что некоторые студенты, вызвавшиеся в начале выполнить сложные задачи, по разным причинам "отвалились"..
Взялся за задачу, описанную в связанной теме - первичная обработка видеосигнала от камеры OV7670 в ПЛИС с последующей передачей результатов на микрокомпьютер Raspberry PI 3.
Параллельно один из коллег выполняет настройку "нижнего" уровня - чтобы квадрик просто полетел (об этом позже).
Пока - о сложной задаче, о том, что она на самом деле вовсе не такая уж сложная :) и методах для её решения.
На настоящем этапе выполнено:
- подключена камера к ПЛИС;
- ПЛИС выполняет преобразование цветного видеопотока от камеры в бинарное (черно-белое);
- ПЛИС выдает данные, пригодные для использования на VGA-порт (черно-белое изображение с камеры можно просматривать на VGA-мониторе).
Теперь, о том как решалась задача подробно - с учетом того, что лично я с языком Verilog вообще не был знаком даже отдаленно, а прошивка для ПЛИС написана именно на нем.
Надо сказать, что с ПЛИС я сталкивался лет 20 назад, в то время, когда они ещё были "большими", но при этом состояли всего лишь из нескольких десятков элементов, имели специальное ультрафиолетовое "окошко", которое потом заклеивалось изолентой :)
Сейчас в нашем проекте используется ПЛИС на 6200 элементов (это мало по современным меркам, когда есть плиски на десятки миллионов элементов, правда, и стоят они ого-го...) Вернее используется так называемая "отладочная плата", где наряду с непосредственно главным чипом (самой ПЛИС) есть ещё и обвязка, а также "периферия" - для изучения и отладки. (Причем, до сих пор с трудом понимаю, для чего на этой отладочной плате есть ещё и приемник инфракрасного излучения, а в комплекте ещё шел и пульт для него, а в примерах софта есть вариант с их использованием!.. Азия - те ещё извращенцы! :))
Так вот, вместе с отладочной платой, главным на которой был чип ALTERA (плата такая):
FPGA.png

братья - китайцы выслали и софт, весом более 3-х гиг, из которых бОльшую часть занимал Quartus II - среда разработки схем для алтеровских ПЛИС. К тому же старая версия, ещё и ломаная.
Естественно, я скачал вполне официальную версию квартуса с официального сайта, хоть и урезанную, но для нашего проекта хватающего слихвой, к тому же релизов на 6 поновее, чем у китайцев.
К плате прилагалось десятка 3 примеров, парочка из которых меня заинтересовала..
Продолжение следует...

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#2

Непрочитанное сообщение adiagnost » 05 апр 2018, 21:54

Немного отвлеченно, но хронологически именно так я и поступал - параллельно стал изучать видеокамеру, её характеристики, интерфейс - короче, говоря проще, - как вообще её использовать.
Даташит (тех. описание) удалось скачать только старое - максимум, 2007 года, однако, оказалось, что в ней используется довольно известная матрица, которая в свое время оказалась очень удачной и, можно сказать, осталась актуальной до сих пор (для встраиваемых систем или обучения).
Оказалось, что процессор видеокамеры выдает данные об изображении (максимальное разрешение 640 х 480, с максимальной частотой 30 Гц, или кадров в секунду). При этом используется по два байта на пиксел, в которых содержится информация во-первых, об интенсивности свечения пиксела, во-вторых, - его цвет.
Далее - разберем, как это происходит.
"Отвлечение от отвлечения" :) - что поделать, именно в таком "параллельном" режиме я решал задачу -
пришлось изучать интерфейс VGA.
Надо сказать, что сам по себе в проекте он совсем не нужен - на квадрике не надо демонстрировать изображение в какой-то монитор, однако, для наладки он очень даже полезен - чтобы видеть, как изображение преобразуется "в реале" так сказать.
Оказалось, что VGA - это устаревший аналоговый интерфейс (однако, используемый довольно широко и сейчас), использующий три сигнала - RGB, то есть, Red (красный), Green (зеленый) и Blue (синий). Принцип действия - количественная "дозировка" каждого цвета для каждого пиксела. В свое время VGA -интерфейс разрабатывался для электронно-лучевых трубок мониторов, стало интересно, как же "бегал" луч кинескопа, чтобы отображать картинку?
Посчитаем:
- максимальное разрешение VGA (тогда было, сейчас - больше) 640х480 - это 307200 пикселов на изображении
- максимальная частота VGA (тогда было, сейчас - больше) 30 Гц - это 307200 х 30 ~ 10 млн. То есть, за 1 сек. луч кинескопа должен был переместиться около 10 млн. раз! А кроме того ещё и "зажечь" с нужной интенсивностью каждый из трех цветов для каждого пиксела!..
В то время широко применялась 256-тиуровневая градация по каждому цвету.
А 256 - это 8 двоичных бит, то есть, всего существует 256х256х256 = 16777216 различных комбинаций, а, следовательно, и оттенков разных цветов.
Непосредственно сам интерфейс VGA устроен довольно примитивно - самый распространенный VGA-разъем имеет пятнадцать контактов, из которых непосредственно используется 6 - три контакта - на каждом напряжение, а, следовательно, интенсивность на каждый цвет (RGB- красный, зеленый и синий), один контакт - общий (земля) и два контакта - синхронизация по строке и по кадру (обозначаемых HSinc - горизонтальная синхронизация и VSinc - вертикальная синхронизация)...
Далее - камера.
Почитав про все это, я решил проверить камеру - она вообще рабочая или как?
Для этого залил прошивку, которая в переводе с китайского означала что-то вроде "Камера OV7670 - трепетный VGA" :)
Подсоединил камеру (к каким пинам - это ещё та история - схемы отладочной платы китайцы не выслали, пришлось "вычислять", к чему они её подсоединяют для своего примера из PIN-planner в Quartus) В наличии у меня было только фото для этого примера:
Board2.png
Board2.png (322.25 КБ) 990 просмотров

из которого видно, что у них используется ещё три навесных девайса - непосредственно на желтые пины наладочной платы навешивается ещё одна плата расширения, на которую сверху цепляются платы с камерой и VGA-разъемом.
Ничего подобного у меня нет, есть только отдельно камера и разъем VGA, который уже напаян на плату. У них на фото, кстати, тоже виден этот разъем. Для меня поначалу было загадкой - зачем они использовали дополнительный "навесной" разъем при наличии на плате "штатного"? Об этом чуть позже..
Вобщем, с помощью Quartus -а удалось вычислить, к каким пинам они подсоединяют в итоге камеру.
Продолжение следует...

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#3

Непрочитанное сообщение adiagnost » 06 апр 2018, 07:59

Пару слов о Quartus и Verilog - надо сказать, - довольно удобная среда разработки под алтеровские чипы. Можно спокойно скачать бесплатную версию с официального сайта и вполне полнофункционально с ней работать даже не имея в наличии "реального железа" т.е., никаких чипов.
Фокус в том, что отладку можно производить в специальной интегрируемой среде ModelSim - симуляторе сигналов и смотреть, как синтезируемый "теоретически" прибор будет работать в реале..
Что касается Verilog - это универсальный (т.е., не зависящий от платформы среды разработки и аппаратной части) язык синтеза схем для FPGA (хотя есть и другие универсальные языки, используемые в тех же целях, например, VHDL).
То есть, программы, написанные на Verilog подойдут и чипам Altera и, к примеру, чипам Xilinx (другого известного производителя FPGA), а также любым другим, поддерживающим определенные стандарты, которые поддерживают практически 100% производителей FPGA.
20 лет назад ничего подобного не было - приходилось буквально на листке бумаги "разрисовывать" логику для "несчастных" пары десятков элементов ПЛИС - да и то умудрялись запутываться в 3-х соснах.. :)
Сейчас Verilog и соответствующая среда разработки (для Altera это Quartus II, для Xilinx - там своя какая-то) берут на себя задачу оптимального распределения элементов при синтезе схем. То есть, разработчик абсолютно "не парится", чтобы что-то назначать вручную (кроме, естественно, необходимых PIN-ов, но PIN-ы это "наружная" часть, которую распределить не составляет труда количеством даже в несколько сотен).
Содержимое папки с китайскими примерами, которая шла в составе софта к отладочной плате выглядит так:
Examples.png

Это - с уже переведенными мной (вернее гугл-переводчиком :) ) с китайского названиями. А нужные мне примеры (VGA) я вообще переназвал латиницей, так как прямо из этих папок открывал и правил проекты в квартусе.
Главный пример с использованием камеры и vga находится в папке OV7670_VGA640480 - это я её так переназвал.
Открытый в квартусе пример этого проекта изначально выглядит так:

Top_source.png

Сразу бросается в глаза назначение портов ввода-вывода (на рисунке, например, отмечено, где назначаются порты вывода в VGA-интерфейс, ну, там, собственно и из комментариев все ясно)
Опять же параллельно "почитывал" и о Veriloge, начиная от структуры проектов, конструкций языка и вообще, так сказать "философии".
Начал понимать, почему при всем подобии с классическими языками, специалисты предпочитают все же не называть его языком "программирования", но языком "синтеза"..
Кстати, - лирическое отступление - общался с москвичами - подрядчиками, жаловались, что на их предприятие не могут найти специалистов по FPGA (у них Xilinx), при з/п "от сотки" в месяц. Хорошие спецы такого профиля - "штучный товар", их "средний ценник" по столице - от $4 тыс. в месяц..
Но, - вернемся к "нашим баранам" :)
Как уже говорилось выше, мне надо было узнать, к каким пинам конкретно подключить камеру. Из китайского фото с навесной платой я примерно понял, что подключают они её к вертикальной контактной желтой гребенке на плате (контакты, кстати, подписаны - это видно на фото).
Чтобы узнать точно, я в квартусе открыл Pin Planner (нажал на кнопку - указал стрелкой сверху в меню программы)
Открылась такая штука:
Pin_Planner.png

Собственно, потребовалось ещё пару минут, чтобы понять, что под CMOS здесь идет обозначение контактов камеры:
Pin_CMOS.png

Продолжение следует...

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#4

Непрочитанное сообщение adiagnost » 06 апр 2018, 09:07

В процессе в нете я нашел схему очень похожей отладочной платы, отличающейся чипом - у меня Cyclone EP4CE6, а найденная - под чип EP4CE10 (кстати, цифры 6 и 10 в обозначении указывают на количество логических элементов, соответственно, 6 - около 6 тыс., 10 - около 10 тыс.):
Вложение Board.png больше недоступно

Тут, естественно и пины нумеруются по-другому, хотя их общее количество (так называемых "пользовательских пинов, - которые выведены "наружу") одинаково - и там и там 144.
К этой схеме ещё вернемся - она помогла мне понять, как работать с VGA-интерфейсом на уровне железа, а также разрешить, наконец-то "загадку" - для чего все-таки китайцы использовали дополнительный навесной разъем VGA для своего примера при наличии уже напаянного на плату..
Пока же - в соответствии с распределением пинов, я подключил только одну камеру, скомпиллировал и прошил плиску.
Однако, как посмотреть (хотя бы, возможно, и косвенно), работает ли камера? Веди интерфейса VGA у меня на тот момент ещё не было..
Для этого, опять же в Pin Planner я "подсмотрел", на какие пины выводится "что-нибудь" для VGA:
Board.png

VGAD здесь обозначено 2 байта с данными, которые я и хотел чем-нибудь "пощупать".
Для этого использовал логический анализатор, подключился им к одному из пинов с данными (к примеру, по очереди к 128-му пину, 135-му, 137 и т.д., так - выборочно) И ещё два входа анализатора задействовал для вывода синхроимпульсов (по горизонтали и вертикали, соответственно, пины обозначенные на рисунке VGA_HSYNC и VGA_VSYNC (11 и 7 пины))
Такую картинку с анализатора я получил:

Pin_VGAD.png


И в масштабированном временном диапазоне:
Analiz1.png

Собственно, там все подписано, думаю понятно.
Мне тоже стало понятно, что камера рабочая - по-крайней мере какие-то данные она выдает.
Теперь надо было думать о VGA-интерфейсе..
Продолжение следует..

Отправлено спустя 31 минуту 1 секунду:
Надо сказать, что для того чтобы посмотреть, работает ли камера, достаточно было и не вычислять на какие пины в итоге придут сигналы для VGA, а "тупо" подключиться анализатором к соответствующим контактам камеры. Однако, кроме камеры хотелось проверить и остальные уровни - вплоть до VGA. А там, к примеру, ещё используется буферизация, проще говоря, данные складыватся в некую промежуточную память.
Для чего?, - хорошо объяснено в статье на Хабре (хоть, и использован там более мощный чип), там же, кстати, и неплохо описаны основные принципы работы с камерой. Не хочется повторяться, просто дам ссылку:
https://habrahabr.ru/post/283488/
Так что я убедился, что все (по-крайней мере) до VGA работает.
Далее, рассматривая схему (приведенную выше - для другого чипа), меня заинтересовал кусок с VGA-интерфейсом. А именно:
Здесь показано, как происходит преобразование цифровых сигналов в аналоговые именно в железе. То есть ЦАП - цифро-аналоговый преобразователь. Как видно из схемы, это реализуется с помощью примитивных делителей на резисторах.
Подробно рассмотрел свою плату - и.. не обнаружил там никаких резисторных сборок около разъема VGA!
Такого "нежданчика" я не ожидал даже от китайцев :)
Кстати, на фото к их примеру на навесной плате с VGA эти сборки хорошо видны.
А как же пример с выводом на "штатный" разъем VGA? Тут до меня стало доходить, что в этом примере на VGA-монитор выводится матрица 8 х 8 из черно-белых квадратов. Без ЦАП они не могут выводить цвет! А могут подать либо полное напряжение, либо 0. А это только две градации - черная и белая..
Вот такое вот "половинчатое" решение с VGA оказалось на момей плате. Стало понятно, почему для вывода изображения с камеры им пришлось "городить" отдельный интерфейс VGA...
Продолжение следует.
Вложения
Analiz2.png

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#5

Непрочитанное сообщение adiagnost » 06 апр 2018, 09:45

Что-то посъезжали последние рисунки..
Кусок схемы с VGA-интерфейсом на самом деле такой:
Board1.png

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#6

Непрочитанное сообщение adiagnost » 06 апр 2018, 11:17

В общем, я понял, что для получения цветного изображения на VGA-мониторе придется мне самому "колхозить" ЦАП - резисторную сборку... В общем, у меня были резисторы на 100 Ом, 1 кОм, 4,7 кОм, 10 кОм, 100 кОм и 1 мОм.
А, судя по схеме, мне нужны резисторы на 0,5, 1, 2, 4, 8 и 16кОм (16 - только для старшего разряда "зеленого"). Кстати, видно, что номиналы резисторов каждых соседних разрядов соотносятся 1:2.
0,5 кОм я "изобразил" параллельным соединением 2-х килоомников, 2 кОм - их же последовательным соединением, вместо 4 кОм использовал резисторы на 4,7 кОм, вместо 8 кОм - 10 кОм, вместо 16 кОм - последовательно соединенные 10 и 4,7 кОм. При этом полагая, что такие расхождения в номиналах с необходимыми не приведут к большим ошибкам в цвете изображения (как, собственно, и оказалось).
Причем резисторы я просто скрутил, а не паял, так как все это мне нужно только для наладки - помним, что в реальных условиях коптера никакого выхода на VGA не будет вовсе..
Получилась такая байда :) :
Вложения
Фото0061.jpg

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#7

Непрочитанное сообщение adiagnost » 06 апр 2018, 11:52

Кстати, практически всегда через несколько секунд после включения изображение на мониторе теряет синхронизацию (и строчную и кадровую):
Фото0062.jpg

смотрел осциллом - на камере синки стабильные, а вот те что пошли на разъем VGA - начинают "плыть". Видимо, все-таки где-то что-то не согласовано. Причем заметил - если картика статичная - рассинхронизации практически нет. Стоит "пошевелиться в кадре" - сразу все плывет..
Может кто из спецов скажет, в чем может быть дело?
Хотя ещё раз повторю - VGA в итоге не будет нужен...

Аватара пользователя
leomond
Сообщения: 16787
Зарегистрирован: 21 май 2009, 22:12
Пол: мужской
Благодарил (а): 193 раза
Поблагодарили: 1430 раз

Автономный квадрокоптер

#8

Непрочитанное сообщение leomond » 06 апр 2018, 12:22

Занятное чтиво ( аж самому захотелось нырнуть в вопрос) стесняюсь спросить, что значит автономный в данном контексте?
Либерализм это иудаизм для гоев (с) Шарон

Аватара пользователя
Фёдор
Сообщения: 15207
Зарегистрирован: 25 май 2008, 17:40
Пол: мужской
Семейное положение: в браке
Езжу на: Lada Kalina универсал 2012
Благодарил (а): 615 раз
Поблагодарили: 1275 раз
Контактная информация:

Автономный квадрокоптер

#9

Непрочитанное сообщение Фёдор » 06 апр 2018, 12:40

leomond, видимо элементы искусственного интеллекта.
The Show Must Go On...

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#10

Непрочитанное сообщение adiagnost » 06 апр 2018, 12:46

А вот так получается в черно-белом варианте:
Фото0063.jpg

и вот так:
Фото0064.jpg

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

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#11

Непрочитанное сообщение adiagnost » 06 апр 2018, 12:49

leomond писал(а):Источник цитаты стесняюсь спросить, что значит автономный в данном контексте?

В принципе, правильно Фёдор сказал - обязательно будут элементы ИИ. В каком масштабе - будет видно. Однако, в любом случае распознавание образов будет присутствовать...

Аватара пользователя
CRC
Сообщения: 2602
Зарегистрирован: 04 апр 2015, 18:49
Пол: мужской
Семейное положение: в браке
Благодарил (а): 672 раза
Поблагодарили: 242 раза

Автономный квадрокоптер

#12

Непрочитанное сообщение CRC » 06 апр 2018, 13:18

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

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#13

Непрочитанное сообщение adiagnost » 06 апр 2018, 13:23

Для всего вышеперечисленного не нужно ИИ. В стандартной прошивке Multiwii это УЖЕ есть.

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#14

Непрочитанное сообщение adiagnost » 06 апр 2018, 13:39

Ладно, продолжим - как я нашел кусок кода для изменений.
После компиляции проекта summary выглядит так:
Compil.png

Слева - перечислены все файлы проекта, непосредственно в области - стат. данные о компиляции.
Например видно, что из 6 тыс. элементов плиски задействовано в проекте около 1 тыс (17%). И т.п. данные.
Напомню, что я ни разу не работал до этого ни с Quartus ни в Verilog.
А так как мы "инструкции читаем только после того как что-то сломали" :) я и решил действовать в лоб - как "обычный классический" программер - искать чисто по комментам, названиям переменных, знакомым конструкциям и т.д., к тому же "слышал", что Verilog как минимум напоминает лассические языки..
Вобщем, стал открывать все файлы проекта подряд, пытаясь "найти знакомые буквы" :) ...

adiagnost
Автор темы
Сообщения: 361
Зарегистрирован: 04 май 2015, 15:46
Пол: мужской
Поблагодарили: 78 раз

Автономный квадрокоптер

#15

Непрочитанное сообщение adiagnost » 06 апр 2018, 13:56

Справедливости ради надо сказать, что к началу поиска я уже кое-что почитал по Verilog.
Например, то что в каждом проекте обязательно содержатся файлы верхнего уровня (минимально проект может состоять из одного файла, по совместительству он же будет и файлом верхнего уровня).
Что все логические модули содержатся в конструкции
module
.....
endmodule
Что основное поведение описывается в блоках always, например:
always @ (posedge clk or negedge rst), что означает примерно следующее: "Всегда по положительному фронту импульса clk или отрицательному rst" выполнять:
дальше следует что выполнять..
Наконец, такими "рабоче-крестьянскими" и полуинтуитивными методами нашел одно из мест, где можно повлиять на цветность (тут, кстати, идет работа с буфером памяти):
source55.png

Собственно по моим комментам там все понятно.
Вначале я хотел использовать конструкцию if else, чтобы сделать следующее ("человеческим" языком):
"для каждой пары байт данных о цвете того или иного пиксела разбить на составляющие по каждому цвету, затем для 5-тиразрядных значение этих кусков сравнить с десятичным числом 15, если значение больше, присвоить всем разрядам 1-цы, если меньше - то присвоить 0, для 6-тиразрядного (зеленого цвета) аналогично, только сравнить с числом 31
Завел соответствующие переменные:

Vars.png

и попробовал "в лоб" прописать "если - то.." (как в закомментированных кусках) - не пошло - компилятор ругнулся на что-то там какую-то синхронизацию...

Отправлено спустя 19 минут 36 секунд:
Тут меня осенило (читать литературу-то по-прежнему не хочется! :) - шучу! умные книжки и учебники по Verilog надо читать :) )
А подумалось мне следующее - у меня есть некое пятиразрядное число (соответственно, минимальное значение 00000 или 0 десятичное, максимальное - 11111 или 31 десятичное) Как мне не используя if-else прописать во все разряды либо 0 либо 1 в зависимости от самого значения.
А вот как - нужно знать только один старший разряд - а его уже прописать во все разряды.
В самом деле - 10000 двоичное это как раз 16. То есть для перевода в бинарное изображение нам нужно просто прописать значение старшего разряда во все оставшиеся. Что я и проделал в коде - скобки {} в Verilog означают побитную "склейку" в одно число.
Дальше подумалось - а собственно, зачем мне старшие разряды по всем 3-м цветам, не достаточно ли будет одного зеленого?
В общем, не знаю точно, но по-моему, вполне достаточно.. :)
А это говорит о том, что можно мне откинуть вообще все провода от контактов с камеры с данными, кроме одного - "старшего зеленого", переназначить пины на стандартный разъем и все будет "в шоколаде"..
Сегодня вечером займусь.. :)

Отправлено спустя 2 минуты 26 секунд:
Да, забыл добавить - в итоге мне удалось понять, что было не так с if-else. Всего-то навсего, перед использованием этой конструкции в Verilog убедиться, что она четко синхронизирована по времени с каким-либо одним событием (пусть и постоянно повторяющимся, скажем, - с системным клоком)


Вернуться в «Увлечения»