Пристрій стеження за рушійним джерелом світла
Сьогодні я вирішив написати про один цікавий проект, яким займався у вільний від навчання час.
Суть пристрою проста - є матриця фотодіодів (в даному випадку 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. Думаю, що більшість знають як працюють нейромережеві алгоритми, але про всяк випадок повторюся на моєму прикладі.
Тут нейромережа повинна спочатку навчитися з учителем.
Сенс навчання полягає в тому, що мережа повинна підлаштовувати коефіцієнти матриць шарів таким чином, щоб мінімізувати різницю між вихідним вектором і навчальним вектором.
Кожна задача унікальна в якомусь сенсі, і тому немає теорії, яка б говорила якої кількості нейронів достатньо, щоб вирішитися завдання, яку передавальну функцію слід використовувати і так далі.
На цьому все,
наступного разу, як знайду час - напишу продовження в якому будуть освячені такі частини як:
- Отримання даних від МК
- Навчання нейромережі
- Аналіз даних за допомогою нейромережі
Наступна частина буде повністю програмною.