Пристрій стеження за рушійним джерелом світла

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

Суть пристрою проста - є матриця фотодіодів (в даному випадку 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. Думаю, що більшість знають як працюють нейромережеві алгоритми, але про всяк випадок повторюся на моєму прикладі.

Тут нейромережа повинна спочатку навчитися з учителем.

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

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

На цьому все,

наступного разу, як знайду час - напишу продовження в якому будуть освячені такі частини як:

  • Отримання даних від МК
  • Навчання нейромережі
  • Аналіз даних за допомогою нейромережі

Наступна частина буде повністю програмною.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND