Устройство слежения за движущимся источником света

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

Суть устройства проста — есть матрица фотодиодов (в данном случае 4, но можно и больше) которая регистрирует свет от какого-то источника, который может перемещаться. Естественно, количество света, падающее на каждый фотодиод в отдельности различно.

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



Общая схема показана на рисунке выше. В нашем случае всего 4 фотодиода. Сигнал с фотодиодов усиливается и поступает в микроконтроллер ATMega16. Микроконтроллер формирует пакет с данными и отправляет его с частотой 1 Гц по USART(COM порт). Со стороны компьютера работает программа, написанная на Lazarus (FreePascal), которая считывает с порта данные, и проводит анализ с помощью свободной нейросетевой библиотеки, затем выдает результат о местоположении источника света.

Это было краткое описание, а теперь детали.

1) Подключение фотодиодов


Здесь приведена простая схема подключения фотодиода к операционному усилителю, схема конвертера малого тока в напряжение, можно найти в любой книге по схемотехнике.



Падающий свет вызывает фототок, схема линейна (до насыщения), в отличии от схемы со смещением. Ток почти не течет в инвертирующий вход, и поэтому напряжение на выходе определяется как U=I*R1.

Очень хорошая статья про фотодиоды и усилители написана сотрудником Texas Instruments Philip C. D. HOBBS«Усилители для фотодиодов на операционных усилителях». Рекомендую всем заинтересованным.

Мной использовались высокоскоростные PIN фотодиоды, BPW34. У них не очень большой угол обзора — что было под рукой, то и использовал. Здесь подойдут почти любые фотодиоды, дело вкуса.

Красной строки требует операционный усилитель AD820. Усилитель на полевых транзисторах (FET) обладает преимуществом перед биполярными низким током утечки, поэтому в схемах-конвертерах ток-напряжение это очень важно. Также усилитель имеет Rail-to-Rail выход, то есть размах выходного напряжение может приближаться очень близко в шинам питания.
Рекомендую использовать после выхода усилителя ФНЧ (фильтр низких частот), и выбрать нужную частоту среза, чтобы было меньше шума.

2) Микроконтроллер ATMEGA16


Как я уже писал выше микроконтроллер нужен для того, чтобы оцифровывать сигналы и передавать их в порт ПК.
Здесь используется древнейший MAX232ACPE конвертер для COM порта. Сейчас я пользуюсь контроллерами с аппаратным USB, но год назад, мне схема с MAX232 казалась ну очень крутой, и я сильно радовался, когда, наконец, разобрался с ней.
Тем, у кого нет платы с COM портами придется либо собрать самому на FT232RL или купить конвертер USB-USART, которых сейчас навалом в интернетах.



Первым делом нужно организовать стабильное питание для микроконтроллера (МК). По питанию нужно всегда ставить как можно ближе к ножкам МК керамический конденсатор емкостью 0,1 uF. На рисунке между VCC и GND.

Затем нужно позаботится о тактовом сигнале.

Здесь стоит кварцевый резонатор на 8MHz (поверьте, когда я начинал, тоже думал что это так мало). Для увеличения стабильности ставят как показано на схеме пикофарадные конденсаторы. Для каждой частоты нужен свой номинал, подробности нужно смотреть в даташите (datasheet), официальном паспорте-документации на каждую ИС (интегральную схему).

Для того, чтобы МК работал без случайных сбросов, необходимо подключить через подтягивающий резистор Vcc к RESET.

Аналоговые входы PA0..7 являются портами, куда мы подаем сигналы с усилителей.
В качестве опорного напряжения для АЦП возьмем Vcc, вот так совсем не хитро.

Порты RX, TX служат для отправки и получения данных.
TTL логика и логика RS232 сильно различаются, и не могут работать напрямую, поэтому мы используем конвертер, схема подключения показана слева. Все конденсаторы, приведенные в схеме подключения конвертера керамические, и имеют номинал 0.1 uF.

3) Среда разработки и используемые библиотеки


Этот проект я делал на Lazarus IDE, компилятор FreePascal, в процессе написания мной было использовано несколько компонентов и библиотек.

  • Библиотека для работы с COM-портом CportLib
  • Известная библиотека FANN


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



Здесь нейросеть должна вначале обучиться с учителем.

Смысл обучения состоит в том, что сеть должна подстраивать коэффициенты матриц слоев таким образом, чтобы минимизировать разницу между выходным вектором и обучающим вектором.

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

На этом все,
в следующий раз, как найду время — напишу продолжение в котором будут освящены такие части как:
  • Получение данных от МК
  • Обучение нейросети
  • Анализ данных с помощью нейросети

Следующая часть будет полностью программной.
Поделиться публикацией

Комментарии 39

    +7
    а зачем для наведения на источник света нейронная сеть?
      +1
      Здесь решается задача 4-мерной корреляции (4 фотодиода),
      без нейросети было бы гораздо сложнее сопоставить каждое состояние
      матрицы фотодиодов с вектором положения источника.
        +2
        гм…
        вот, например робот вполне обходится без ИНС ;)
          +3
          посмотрел, спасибо,
          здесь робот на видео старается всегда быть под прямым углом, и анализ заключается просто в
          вычислении разности интенсивности между левым и правым и верхним — нижним глазом, когда объект находится прямо перед фотодиодами, то так, как сделано по ссылке работать будет,
          но когда нужно регистрировать свет с разных углов, простая разность «левый-правый», «нижний-верхний» не дадут хорошего результата.
            0
            А Вы на выходе пытались получить координаты в поле зрения «камеры»? Или вектор поворота «камеры»?

            И уверены ли Вы, что нейронная сеть после обучения не станет заниматься имитацией именно того, что делает этот робот?
              0
              Устройство неподвижно, и двигаться не может.
              На выходе координаты по 4 полуосям.
              Робот вел себя так, потому что у него обработка была без усреднения и моделирования
              программной инерции движения. Здесь же нет никакого серво, здесь просто отображение
              на экране ПК положения источника света во времени.
            +6
            Поддерживаю.
            Банальный адаптивный фильтр на Least Mean Squares спасет отца русской демократии.
        +3
        Если посветить на вашу конструкцию лазерной указкой, можно добиться очень интересного эффекта, я уверен ;)
          +2
          Ну, смотря каких эффектов ожидать ;)
            +1
            а положение солнца отслеживает?
              +1
              Не проверял, извините,
              ничего сказать не могу.
            0
            >купить конвертер USB-USART
            А можно ссылочку на USB-USART?
            Это же получается, что на нем, кроме UART-а, можно какой-нибудь SPI или RS485 при желании поднять, интересное устройство.
              –2
              electronschik.ru/card/perehodnik-usb-uart-adapter-bm8051-102757
              shop.roboforum.ru/product/or-usb-uart-v1-usb-uart-adapter/

              много всяких адаптеров есть, первые, которые выдал поисковик.

              А если хотите сами собирать, то у DI HALT хорошо про это написано
              easyelectronics.ru/preobrazovatel-usb-uart-na-ftdi-ft232rl.html

              Но я все же не советую, лучше уже сейчас работать с МК, которые содержат аппаратный USB.
                0
                Честно, я знаю, что такое UART и как его сделать. Меня интересовал именно фабричный конвертер USB<>USART (поясню: USART = Universal Synchronous/Asynchronous Receiver-Transmitter), потому что надоело клепать свои костыли для отладки SPI.
                  0
                  Посмотрите контроллер AT90USB162, он даже дешевле,
                  чем FT232RL, и для него можно найти код для отладки SPI.
                    0
                    Ну, UART-ы я делаю на CP2102 (50р), дешевле не найти, но за мысль спасибо.
                  0
                  Более бюджетный вариант — ссылка на ebay
                +1
                А зачем целая mega16 под такое малое количество нужд?
                  +1
                  Вы правы, функциональность mega16 избыточна здесь,
                  но у меня есть дома запас этих контроллеров в коробочке… куда прикажете их девать :)?
                    +1
                    откуда столько? оптовый заказ?
                  –1
                  А еще можно тупо взять ГСН

                  И тогда не надо морочиться со всякими нейросетями :-)))
                    0
                    сильно мудрёная система, можно сделать просто:

                    en.wikipedia.org/wiki/Braitenberg_vehicle
                      +1
                      В первых комментариях обсуждался уже робот,
                      основанный на этом принципе, даже ссылка была.
                      Для более точного позиционирования при различных углах источника
                      света нейросеть нужна, и без нее никак.
                      +3
                      Это новые веяния в черчении схем или я чего-то не понимаю?
                        0
                        Все свои рисунки я получил в Inkscape,
                        в схемных редакторах схемы не очень красивы для публикаций.
                        Просто разделил, чтобы понятно было какой номинал у резистора.
                          +7
                          Меня смущают не надписи, а проводник, идущий сквозь резистор.
                            +6
                            Вы не поняли, нельзя что бы пересекались элементы и проводники.
                              –6
                              Вы это серьезно?
                              В схемах соединение двух и более проводников отмечается жирной точкой, как на рисунке.
                              Если точки нет, значить и нет пересечения, и компоненты всегда рисуются на верхнем слое.
                                +3
                                Думаю, здесь все в курсе как отмечаются соединения :)

                                Однако о каких-либо слоях в принципиальных электических схемах речи не идёт, их просто не существует на двумерной бумаге, на которой эти схемы раньше чертились.
                                Рисовать компонент поверх проводника — жёсткий моветон, потому что этим вы:
                                1) искажаете УГО компонента (в данном случае резистор смахивает на нестандартно изображённый резистор с двумя ответвлениями),
                                2) делаете схему неоднозначной (вертикальные отводы от ОУ — это питание, или же просто провод проложенный под ОУ? :)
                                  –4
                                  Ну, возможно, моветон, но никогда не возникало никаких недоразумений и неоднозначностей с моими схемами ни у меня, ни у моих друзей :)
                                    0
                                    Просто уровень компетенции Ваших друзей позволяет им на лету в голове вычленять и редактировать ляпы на Ваших чертежах :)

                                    ЗЫ. Ещё ляп. Никакие запятые после индекса элемента и его номиналом в российских принц. схемах не ставятся. Это Вы у амеров наверно нахватались. :))
                                      +1
                                      Я этого даже в американских схема не видел =)
                          0
                          MAX232 можно было бы заменить на V-USB, и подключать Ваше устройство к компьютеру не через RS232, которого уже почти нигде не найдешь, а через USB (класс USB CDC, виртуальный последовательный порт). Плюсы — получаем подключение по USB и избавляемся от лишней микросхемы. Минусы — нужен дополнительный код для библиотеки V-USB (около 6 килобайт FLASH), и снизится быстродействие системы при обработке протокола USB.
                            0
                            Да, так тоже можно было сделать. Давно делал электронику, сейчас уже нет смысла все переделывать.
                            Но сейчас если бы я занимался этим проектом, то сделал бы либо на дешевом AT91SAM7
                            либо на AT90USB1287 с поддержкой аппаратного USB, поставил бы CDC драйвер и программу под ПК не пришлось бы переписывать даже.
                            0
                            А как на счет отслеживания двух источников?
                            Если фотодиоды направить в разные стоороны, то получится фасеточный глаз, как у мух-стрекоз.
                            В качестве фотодатчиков можно приспособить глаз от оптической мышки. В стародавние времена там была матрица 16х16, если память не изменяет. И скорость сканирования в районе 1кГц. В современаых мышах всего побольше, думаю.

                              +1
                              Нет, два источника не различимы с точки зрения алгоритма,
                              с этим ничего не выйдет,
                              а про глаз мухи — в первых комментах обсуждался такой робот, там даже ссылка есть,
                              но принцип действия там намного проще.
                              +1
                              Кхм. Поздравляю, вы только что убили воробья из пушки. Отслеживание источника света — тривиальная задача теории автоматического управления. Еще в институтские годы у нас были курсовые. камера, расположенная на подвижной платформе отслеживает перемещение точки лазерной указки. Делалось все тривиально: с камеры получалась картинка, на ней находился максимум освещенности(грубо — самый яркий пиксель). дальше высчитывалась ошибка по Х и У, по ним генерился сигнал для двигателей платформы, по Х и У соответственно. процесс повторялся с высокой частотой. Ваша схема с 4мя «пикселями» так же укладывается в эту схему: простейшими операциями выделяем разницу между освещенностью диодов, по ним генерим сигнал ошибки, и вырабатываем управляющее воздействие. ИНС тут явно лишняя.
                                +1
                                В Вашей институтской работе у Вас была камера,
                                которую нужно подключить и получать с нее изображения, потом их анализировать.

                                У меня же здесь всего 4 дешевых фотодиода.
                                Есть большая разница как по стоимости реализации аппаратной части, так и сложности работы CCD и фотодиодов.
                                В моей работе используется минимум компонентов. А уж если Вы использовали полноценную камеру,
                                тут можно было определять что угодно: 1 источник, несколько, движение, отдельные объекты и прочее.

                                В первых комментариях обсуждался робот, который вычисляет разность интенсивностей между левым-правым и верхним-нижним фотодиодами, там даже ссылка есть.
                                0
                                Картинки сдохли(( полюбоваться нечем

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое