RGB пропеллер
 

    До этого момента я уже ставил эксперименты со светодиодными дисплеями, основанными на механическом сканировании. Например, это было описано здесь. Поэтому данная работа стала логическим продолжением этой темы.
    Итак, пропеллер - это линейка(лопасть) из светодиодов, вращающаяся по кругу. Светодиоды в нужное время зажигаются, образуя изображение. Восновном любители собирают одноцветные часы/дисплеи. Весьма популярным источником информации на эту тему можно считать сайт[1]. Но одного цвета мне показалось мало и я взялся за работу...
    Описанный ниже дисплей хранит в памяти один цветной кадр с разрешением 256х32 точек. Он может воспроизводить 8 цветов(вместе с черным). Цвета без градаций, т.е. светодиод либо включен, либо выключен.

    Железо.

    Принципиальная схема контроллера.

    Картинка хранится в чипе SPI EEPROM памяти 25LC640. Чип на 64 КБит/8 КБайт, поэтому больше одного изображения туда не помещается. Контроллер ATTINY2313 загружает информацию из чипа памяти и отсылает ее в блок светодиодной индикации(в светодиодную лопасть). Помимо этого, контроллер принимает импульсы от датчика Холла, по которым он синхронизирует начало вывода изображения и рассчитывает время через которое необходимо загружать новую часть изображения. Через U1 MAX232 контроллер можно подключить к последовательному порту компьютера для загрузки новой картинки.
    Описание алгоритма работы. Датчик Холла подключен ко входу модуля захвата 16-битного таймера 1(вывод 11 ICP). При прохождении датчика мимо магнита и поступлении очередного импульса происходит захват значения счетного регистра таймера. Генерируется прерывание и мы попадаем в функцию обработчика
interrupt [TIM1_CAPT] void timer1_capt_isr(void).

Т.к. у нас "горизонтальное" разрешение 256 пикселов/столбцов, то полученное значение мы делим на 256(или просто сдвигаем вправо на 8 разрядов). Т.о. мы получаем отрезок времени(или число тактов) через которое нужно загрузить новый столбец изображения. Затем мы активируем модуль сравнения 8-битного таймера 0. Когда прошел этот промежуток времени, то мы попадем в обработчик сравнения
interrupt [TIM0_COMPA] void timer0_compa_isr(void).
Здесь мы последовательно считываем очередные 12 байт(или 96 бит - по кол-ву диодов) из чипа памяти и выгружаем их в светодиодный блок.
Если от датчика долгое время нет импульса(например, нет движения или скорость недостаточна), то первый таймер  переполняется  - обработчик
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
и отключается нулевой таймер, все светодиоды гасятся.

    Загрузка новой картинки из компьютера происходит через приемопередатчик UART, соответствующий обработчик -
interrupt [USART_RXC] void usart_rx_isr(void).
Микросхема памяти EEPROM поддерживает загрузку и запись информации в страничном режиме(размер страницы 32 байт). Поэтому для ускорения процедуры записи разработанный мной коммуникационный протокол может переключатья в блочный режим передачи. Размер блока - 35 байт. Формат представления данных:
1. Команда, 1 байт:
    0x00 - сброс устройства, в ответ посылается байт 'R'. Всего должно быть передано 3 байта: первый 0x00, остальные два - неважно какие;
    0x02 - считать байт по указанному адресу, в ответ высылается байт данных. Всего должно быть передано 3 байта:
первый 0x02, затем адрес;
    0x01 - записать 32 байтную страницу по указанному адресу, в ответ отсылается 'W'
2. Адрес, 2 байта в следующем порядке: старший, младший байты.
3. Данные страницы памяти, 32 байт. Принимаются только тогда, когда была передана команда записи 0x01. После приема всего блока из 35 байт, активируется запись в чип памяти. Через 5 мс, когда запись окончена, в ответ отсылается байт 'W'.

    Изначально я планировал запитать всю конструкцию от трехвольтового источника питания(2 батареи типа AA). Но датчик Холла отказался работать при напряжении ниже 4,5-4,6 вольт, поэтому мне пришлось добавить еще две батареи, а излишек напряжения погасить с помощью двух последовательно включенных кремниевых диодов. Датчик Холла должен иметь цифровой выход, он был взят из старого компьютерного вентилятора.

    Принципиальная схема светодиодного блока.

    Светодиодный блок состоит из 12 последовательно соединенных сдвиговых регистров и светодиодов. Данные загружаются по последовательному каналу, затем при поступлении разрешающего импульса на вход ST_CP состояние выходов обновляется. 32 RGB светодиода мне бы обошлись в сумму около 40 долларов. Я посчитал что это дорого и купил по 32 отдельных диода с широким углом свечения на каждый цвет. Всего 96 дискретных диодов. Т.о. сэкономил в 2-3 раза. Моя идея заключалась в том, что можно для каждой цветовой компоненты отдельно выставить смещение на изображении. Например, в данном пикселе сначала загорается красный диод, затем когда на его место встанет зеленый - загорится зеленый, потом синий. Конечно, плата сильно увеличилась в ширину.
    Из-за того, что светодиоды отстоят друг от друга на расстояние в несколько мм  и по причине несимметричного расположения проявился эффект, схематично изображенный на рисунке:

Он был особенно хорошо заметен с небольшого расстояния на тестовых изображениях: когда из центра исходят белые прямые. В целом, такое рассогласование на обычных изображениях было почти незаметно.

    Фотография устройства.

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

    Вид со стороны монтажа.

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

    Софт.

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

В настройках вывода можно указать смещение каждой цветовой компоненты и смещение базы.
    Программа экспортирует изображения в двоичные файлы .BIN - простые дампы памяти. Их можно загружать в EEPROM отдельным программатором либо воспользоваться специальной утилитой загрузки POV Programmer.

    Скачать:
    1. Исходник + прошивка для ATTINY2313.
    2. Редактор + загрузчик + небольшая библиотека кадров.

    Ссылки:
    1. SpokePOV - Persistence of Vision for your Bike!
 
 

На главную

Hosted by uCoz