POV – часы пропеллер

POV – часы пропеллер

В данном проекте часов-пропеллера используется так называемый POV (Persistence Of Vision)-эффект или говоря по русски: эффект персистенции. Эффект основан на возможности нашего мозга и глаз соединять в одно изображение быстро меняющиеся (движущиеся или мерцающие) картинки. К примеру на этом основан эффект кинематографа.

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

Цели и задачи проекта

Целью данного проекта является создание часов-пропеллера, использующих один цвет, с использованием POV-эффекта для создания оптической иллюзии. Устройство должно отображать изображение (точнее его часть в определенной точке) по всей окружности от 0° до 360° с точностью 1°. ИК-передатчик в паре с ИК-приемником, образуют нулевую точку для отслеживания местоположения пропеллера.

В нашем POV-девайсе используется два источника питания: один находится на плате пропеллера, второй управляет моторчиком, который вращает пропеллер. Принцип работы POV будет следующий: старт с нулевой точки, затем каждый 1° светодиоды будут загораться в зависимости от местоположения пропеллера в круге 360°.

Используемые радиоэлементы

PIC18F252 – микроконтроллер. Основной элемент нашего устройства. 74LS373 (отечественный аналог 555ИР22) – регистр-защелка для управления светодиодами. Компьютерный вентилятор (3800 об/мин) – я выбрал вентилятор с встроенным контроллером скорости и питания. Для POV-эффект требуется вентилятор с скоростью вращения не менее 3600 об/мин.

Инфракрасный светодиод и фототранзистор – пара этих элементов предназначена для отслеживания нулевой точки. Когда пропеллер пересекает нулевую точку, то в микроконтроллере срабатывает прерывание, по которому программа визуализации начинается с 0°.

Также, в проекте используются:

7805 +5В преобразователь

47мкФ конденсатор

40 МГц кварц

2x 330 резисторы

16x зеленые LED

ИК-диод

Фототранзистор

Макетная плата

Соединительные провода

9В держатель батарейки

PICkit2 программатор

Принципиальная схема POV

Схема устройства не сложная и содержит три основных компонента: преобразователь 7805 в источнике питания, микроконтроллер PIC18F252 и регистр 74LS373 для управления светодиодами и ИК-диод и фототранзистор для отслеживания нулевой точки.

Вкратце об основных модулях устройства:

Источник питания

Стандартные +5В для питания микроконтроллера получаем через преобразователь LM7805 (корпус Т220). Выходной конденсатор служит для фильтрации бросков напряжения.

Управление светодиодами

В PIC18F252 использована 8-бит шина данных с 2 линиями управления 74LS373, которые включают или выключают светодиоды, в зависимости от пришедших данных. При данном схемотехническом решении в один момент времени возможно управление только одной микросхемой 74LS373, поэтому светодиоды загораются не со 100% синхронностью.

Отслеживание нулевой точки

Синхронизации изображения осуществляется при помощи нулевой точки, для отслеживания которой используется ИК-диод и фототранзистор. Когда свет от диода попадает на транзистор, он открывается и +5В от коллектора идут к +0В эмиттера. Контроллер PIC обнаруживает спад сигнала и отрабатывает программу возврата к нулевой точке.

О микросхеме 74LS373

Микросхема 74LS373 (отечественный аналог 555ИР22) представляет собой регистр-защелку с тремя состояниями выходов, содержащая в себе 8 D-триггеров. Даташит PDF.

Данную микросхему я использовал в качестве LED-драйвера. Выхода м/с включают или выключают соответствующие светодиоды. Каждая м/с имеет два входа управления: LE (Latch Enable) и OE (Output Enable). Ниже, я кратко опишу как применять эти входы в нашем проекте.

Output Enable (OE) – подключает/отключает выхода микросхемы. Вход инверсный. Если на входе 1, то выхода имеет состояние высокого сопротивления, если на входе 0, то данные передаются от входа к выходу (см. таблицу истинности в даташите).

Latch Enable (LE) – вход, в зависимости от состоянии которого м/с будет сохранять текущее состояние выходов, либо устанавливать новое состояние выходов, в зависимости от данных на входе. Если вход LE активен (логическая 1 на входе), то данные свободно передаются от входа к выходу. Если на входе 0, то данные не передаются, а выходное состояние зависит от предыдущего значения входов.

Расчет таймингов POV

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

Частота вращения вентилятора = 3800 об/мин

Найдем частоту вращения в секунду 3800/60 = 63.3333 об/сек.

1 полный круг = 1/63.3333 = 0.015789 секунд

1° вращения = 0.015789/360 = 0.000043859 секунд

Частота выполнения инструкции 40 МГц/4 = 10 МГц

Инструкций на 1° вращения = 43.86 мкс/10000000 = 438.6

Получается 438 инструкций на каждый 1° вращения

Т.о. зная частоту вращения вентилятора, мы можем найти время для поворота на 1°. У нас получилось значение 43.86 мкс, это будет интервал вызова прерывания микроконтроллера, по которому будет обновляться состояние светодиодов. Для получения полной картинки, нам нужно будет выводить для каждого из 360 градусов свое состояние светодиодов.

Отслеживание нулевой позиции

Для того, чтобы наш POV-проект был более точен в отображении картинки, я использовал контроль нулевой точки при помощи ИК-светодиода и фототранзистора. После того, как точка 0° пройдена, изображение сбрасывается и начинается новый цикл.

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

На картинке выше показано, как реализовано отслеживание нулевой точки в нашем POV-проекте. Всякий раз, когда пропеллер проходит над ИК-светодиодом, транзистор открывается соединяя +5В с коллектора к земле эмиттера. Микроконтроллер PIC обнаруживает данный переход состояния и т.о. определяет нулевую точку.

Изготовление платформы пропеллера

На картинке ниже я собрал все детали, которые будут нужны нам для изготовления POV. Не показан только источник питания для вентилятора и ИК-диод.

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

Для этого, в основе сверлим четыре отверстия и закрепляем вентилятор в центре основы.

Прикрепляем небольшой кусок фанеры, при помощи клея или эпоксидки, к вентилятору.

Обрезаем лопасти вентилятора и прикрепляем держатель 9В батарейки.

Далее, прикрепляем при помощи болтов кусок фанеры к вентилятору.

Сверлим четыре отверстия в плате и закрепляем ее на 4-х шпильках фанеры. Стараемся соблюсти баланс.

Откручиваем плату и делаем ее прямоугольной. Затем опять прикрепляем.

Компоновка радиодеталей

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

На макетной плате я использовал монтаж накруткой, так называемый олд-скул метод. Для микросхем использовал сокеты.

Для начала я разместил все сокеты и компоненты стабилизатора.

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

После того, как все установлено, скручиваем или припаиваем все выводы согласно принципиальной схеме POV

Сначала, я соединил микроконтроллер PIC и триггеры

Затем, соединил светодиоды к источнику питания и схеме управления.

Последним шагом, я закрепил инфракрасный светодиод к основе.

ИК-светодиод должен быть закреплен очень прочно

…и должен быть размещен напротив фототранзистора на плате.

Наш проект POV почти готов!

Осталось залить прошивку и протестировать

Программное обеспечение

Основные функции в программе это:

-High Priority RB0 Interrupt

-Low Priority Timer0 Interrupt

High Priority RB0 Interrupt

void InterruptHandlerHigh() { if(INTCONbits.INT0IF) //check if INT0 interrupt flag is set { led_count = 325; WriteTimer0( 0xFFE0 ); INTCONbits.TMR0IF = 0; //Clear TMR0 Flag INTCONbits.INT0IF = 0; } INTCONbits.GIEH = 1; }

Работа данной функции прерывания высокого приоритета заключается в том, чтобы сбросить timer0 и начать вывод на LED с самого начала. Когда POV-эффект формируется, его отображение происходит много раз за секунду. Переменная led_count используется как счетчик прерываний таймера, чтобы знать какой выходной набор выводить на LED для отображения. INT0 также сбрасывается.

Low Priority Timer0 Interrupt

void InterruptHandlerHigh() { if(INTCONbits.INT0IF) //check if INT0 interrupt flag is set { led_count = 325; WriteTimer0( 0xFFE0 ); INTCONbits.TMR0IF = 0; //Clear TMR0 Flag INTCONbits.INT0IF = 0; } INTCONbits.GIEH = 1; }

По прерыванию от Timer0 уменьшается переменная led_count. Условие if/else используется для вывода данных часов/текста и т.п.

Тестирование POV

Мы подошли к заключительному этапу нашего проекта POV. Осталось запустить все и наслаждаться POV-эффектом. В клипе ниже, вы можете видеть все этапы конструирования и тестирование пропеллера-часов.

Интервалы в 1° легко успевает отрабатывать 40 МГц МК. Т.о. можно выводить как графическую информацию, так и текст, флэш памяти микроконтроллера я думаю хватит для любых паттернов

В заключении хотелось бы сказать, что это очень простой POV проект, который вы можете взять за основу для каких-либо своих улучшенных POV. А улучшать тут есть что: это может быть использование RGB-светодиодов для получения цветного изображения, или использование одного источника питания для всей системы и т.д. Данный пропеллер от 9В батарейки работает всего несколько часов

Скачать исходники

Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)

Написать коментарий

*
= 5 + 0

Добавить изображение