Yet another POV –Wheel POV

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

Ну, а что из этого вышло с фотками и видеороликом можно посмотреть под катом (многа букаф прилагается)).


Введение

Естественно, первым делом я не хотел «изобретать велосипед» и начал искать чего бы повторить, но много проектов из интернета были либо совсем унылыми, либо платными, либо не полностью удовлетворяли моим запросам. Пожалуй самое стоящее что я находил – это проект леди Ада SpokePOV.
Во многом я опирался на него, но вот повторять его мне почему-то не захотелось.
Честно говоря, вначале я придумывал себе тех. задание с модульной конструкцией, возможностью управления с компа или андроид мобильника им тп. Но вовремя поняв, что так проект может вообще остается на бумаге, решил поумерить пыл, и реализовать что, то по проще.

Железо

Для тех, кто не сталкивался с подобными конструкциями кратенький ликбез:
На колесо вешают линейку светодиодов и датчик (холла или геркон), на раме магнит при срабатывании датчика контроллер вычисляет «скорость велосипеда» и в соответствии с ней выводит на диоды картинку, заложенную в памяти – эдакая динамическая индикация. Ну, а так как из-за инерции зрения, при некоторой частоте различить отдельные положения линейки становится не возможным, то создается впечатление, что на всю плоскость колеса выведено изображение.
И так после обдумывания некоторых технических аспектов, у меня родилась следующая идея.
Так во многих проектах мне не нравилось, что светодиоды светят, только с одной стороны колеса или же их световой поток идет параллельно в плоскости колеса, я решил установить светодиоды с двух сторон. Прикинув, что полоска на мое колесо в 16 светодиодов будет достаточна, сразу пришла мысль о том, что бы взять мк побольше, повесить их на его порты и не мучатся со сдвиговыми регистрами.
Таким образ получилась схема мега16 – 16 (32, так как по два на ногу на одну и другую сторону) светодиода подключенных к портам через резисторы, датчик холла на int0, и кнопка на int1. Схема в протеусе есть во вложении, тут приводить не стал, думаю из описания ясно.

Не много про протеус.

Часто на форуме или здесь проходят дискуссии, нужен он или нет. И на этом проекте я понял, что это всего лишь инструмент, которым надо уметь пользоваться. К примеру еще на уровне моделирования он мне помог отладить некоторые баги, которые не всегда видно в аврсимуляторе. Что огромный плюс, так как на столе девайс практически бесполезен, а подлезть к вращающемуся колесу с мультиметром или осциллом, кгхм…
С другой стороны от нескольких итераций, типа прошил- прикрепил к колесу – проверил – снял и тд., все равно не избавил.
Схема питается от трех батареек ААА, которые установлены в отдельный батарее — держатель (купил на рынке).
Немножко пришлось покумекать и над выбором светодиодов. С одной стороны, для данной конструкции чем ярче тем лучше. С другой, хоть я и не являюсь автомобилистом, но первым бы бросил камень в дебила, появись он на трасе, с мигающей хренью красного или зеленого цвета. Синие же китайские светодиоды отпали – ибо надоели, на каждом шагу стоят. Таким образом, я выбрал оранжевые, по светосиле они слабее, но вечером видно не плохо, а днем на солнце любые еле светят.
И так схема составлена:

Лутим, Травим, получается вот такая платка:

В саму схему я заложил возможность впайки eeprom типа at24 на TWI, даже развел, но так как при написании кода у меня возникли сомнения, хватит ли скорости общения с ней во время работы, то решил пока оставить на будущее. Так же на плате разведен юарт, но об этом чуть позже.
Немного про датчик холла
Сия маленькая вещица оставила во мне противоречивое впечатление. Во-первых, оказалось, что по мимо аналогових и цифровых датчиков, последние делятся на кучу видов (униполярные, омниполярные (защелки), биполярные ). При этом в разных источниках им приписывают разные характеристики. Униполярный брать не хотел, потому что он вроде реагирует на одну полярность, а значит надо подбирать сторону магнита. Но так как в наших радиомагазинах приходится покупать то, что есть, я взял SS411A – биполярный датчик холла, в надежде, что он реагирует на любую полярность. Итог фейл, он оказался биполярным с защелкой, то есть, чтобы перейти в 0 ему нужна одна полярность, а в 1 противоположная. И так как 2 магнита на раму я вешать не хотел, то пришлось еще клеить маленький магнитик на сам датчик. А при установке подбирать полярность магнита, ИЧСХ в пылу экспериментов, я ее таки попутал. Второй важный аспект – цена, этот дачик стоил мне всего на 2 гривны дешевле меги, hate. Плюс по даташиту он питается минимум от 3,5 вольт, поэтому и использовано 3 батарейки, хотя можно было и двумя обойтись.

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

Ну и перед самой установкой плату надо как то защитить от агрессивной среды, для этого был прикуплен чудо химикат Пластик70, который покрывает плату прозрачным изоляционным слоем, единственное даже маленькая баночка стоит дорого. Как себя поведет сказать трудно, но зиму на балконе при нуле отстояло и ничего (вот блин раскололся, ну про это чуть дальше). И все же агрессивная среда это не только дождь, но и пыль, песок или по научному – абразив. Лак от них не поможет, но есть дешевое решение – прозрачная термоусадка.


Софт МК

Как я нечаянно написал в предыдущем абзаце, реально разработкой я занимался в конце прошлого лета, и осенью даже сделал первое полевое испытание, но качество кода, характер работы, не давали мне это выносить на обзор. Ну а зимой, все старался доделать, но реально добрался только сейчас. Благо это хобби, на какой ни будь работе, меня погнали уже в три шеи))).
И так основной цикл программы предельно прост:
По срабатыванию датчика холла вычисляется период одного оборота (счет на таймере 1), и из него вычисляется время для одного столбца изображения. Всего на один оборот приходится 360 столбцов. Данное время заносится в прерывание таймера 0, по срабатывании которого, из флеша вытягивается 2 байта изображения и выпихивается в соответствующие порты. Я думаю кодирование в таком случае ясно,1 светодиод горит, 0 –нет.
По срабатыванию таймера 2, светодиод гасится (если нужна точка, а не сплошная заливка).
Ну и если таймер1 переполнится, значит едем очень медленно и начинается подготовка перехода ко сну – тускло горит 16й диод. Если же медленная езда продолжается, диод периодически вспыхивает (по срабатыванию датчика). Если же велик остановлен и стоит на месте более 5 минут МК уходи в сон выключая датчик холла.
Для того, что бы время переполнения таймера 1 было около секунды, с учетом имеющихся предделителей, мк настроен на 4МГц, с внутренним тактированием.
Во многих проектах виденных мною в интернете девайс позволял загружать либо одну картинку и делать с ней какие-то эффекты, либо несколько, но статичных. Короче, возникла мысль, нужен формат картинки, но какой?
Все компьютерные форматы: gif, bmp,png, jpeg довольно сложны для мк, и я их точно не прикручу для режима реального времени. Поэтому мне снова пришлось идти по пути «изобретения велосипеда», получилось как то так:
масивы рисунков имеют следующую структуру:
 Байт№	Ф-ция
 1		Количество кадров (не может быть 0)
 2		старший байт длины кадра( кол-во байт кадра без служебной информации )
 3		младший байт длины кадра
 4		Служебный байт смещения, биты:7 :	0-нет смещения;
 							1- есть
					  6 :	0-смещение в лево(против часовой стрелки)
						1- вправо( по час стрелке)
					  5..0 - задержка между смещением в один столбец (оборотов)
 5		Служебный байт времени  кадра и гашения:
 					биты: 7..2	количество оборотов на один кадр
	                             !!! должно всегда быть не 0 и больше задержки смещения
					  1..0 -время гашения (позволяет диодам создавать точки)
			допустимые значения (%процент время горения диода от времени
			  на один столбец)0-12%,1-25%,2-50%,3-100%.
Далее идут байты самого изображения в порядке старший байт, младший байт (сверху вниз)
и слева на право по столбцам:
			-->старш байт  		---->старш байт
					|			|		|
					млад. байт-->		млад. байт-->
При этом старший бит в байте крайний левый 
(или верхний если считывать биты в размещенном вертикально байте).

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

Важно! По структуре, есть некоторые ограничение, но подробнее можно посмотреть в приложенном проекте авр студии. Также необходимо, отметить, что пока в программе массив изображения выводится на колесо, не в полярных координатах, а как в прямоугольную область 16*360. По этому прямая нарисованная в таком прямоугольнике превратится на колесе в круг!

Но, тем не менее, при таком подходе есть и плюсы:
Во-первых, при выводе узоров (как на первом фото) можно сэкономить память записывая лишь 1 элемент узора, до полного круга его дорисует программа.
Во-вторых, можно записывать текст.
Сама по себе организованная структура хранения, тоже имеет плюсы:
Можно хранить до 7 отдельных рисунков, которые переключаются кнопкой + 8й циклический режим, вывод поочередно всех рисунков.
Каждый рисунок может иметь до 200 кадров. При этом кадр (по мимо заголовка) может состоять от 2 до 360 разных столбцов (или пикселов по ширине). И все это безобразие на данный момент ограничено лишь размером флеша меги16.

Ну, вроде с софтом все, хотя есть еще один момент – бутлоадер.
Ясно, что на такой плате полноценный ISP ни к селу…
По этому нужен бутлоадер, для которого собственно и разведен юарт. Вот тут, тоже пришлось немного поискать. Не плохо про бутлоадеры, расписал ДиХальт на сайте, но вот выложенный им проект в упор не хотел у меня работать, в процессе поиска я выбрал для себя следующий:
Chip45boot2

  • Плюсы:
    1. Завелся с полпинка.
    2. Имеет неплохую номенклатуру МК.
    3. Прошивки для МК уже готовы.
    4. Сам определяет скорость юарт ( по заверению производителей)
    5. Поддерживает RS485 (мне без разницы)
  • Минусы
    1. Отжирает кило флеша.
    2. Все прошивки закрыты (можно купить исходный код).
    3. Требует свою софтину для записи (хотя протокол, общения открыт, так что, при желании можно свою запилить)
Софт и печатку вложил в архив внизу.

Софт PC

Кажись все, запаяли, прошили, протестировали на тестовых изображениях, можно кататься. Но ведь хочется картинок красивых и разных. И составив одну такую вручную, я мог лишь выдать: FFFFUUU-UUUUU-U.

Начался безуспешный поиск, того что мне необходима прога, типа для создания рисунков для экранов нокий и тд. Фактически мне нужно было две проги, одна, что бы натыкать попиксельно изображение (а так как в таких программах круглое изображения сделать нельзя я и отказался от полярных координат, пока), а вторая что бы сформировать массив си.
С первым мне повезло FastLCD, позволяет натыкать нужное изображение и сохранить BMP.
Со второй, же беда, находились почти идеальные программы, но к примеру, число записывалось как 0Хаа, которого винавр не понимает, ей 0хАА подавай. А если еще вспомнить, что сами заголовки считать тоже скучно, то как говорится, если гора не идет к Магомету, Магомет идет горе.
С пылу, с жару программа создания массивов для WheelPOV:

Программа на С# .Net 3.5, всесторонне испытана и проверена мной на 3,5 компьютерах, вроде работает))). ( Описание работы в отдельном файле)
Отметить хотелось бы загрузку изображений. В принципе программа может скушать любой bmp файл, но все равно преобразует его в черно-белое изображение16*Х(где Х- ширина в пикселях, выбирается как самое близкое к ширине загружаемого рисунка но не более 360).
Немного про черно-белые изображения
Честно говоря, с понятием черно-белое изображение существует небольшая путаница, вероятно пришедшая из разговорного ч/б фотография. В английском как то логичнее: color – цветное, grey scale –оттенки серого, black&white – черно — белое (то- есть, из двух цветов). В рунете же под ч/б как раз понимают оттенки серого. Поэтому я потратил много времени на поиск алгоритма цветное – >черно-белое ( в смысле двухцветное) изображение. Пока не вспомнил, что в науке такие изображения называют бинаризироваными. А уж алгоритмов бинаризации великое множество, которое постоянно увеличивается (потому что они тесно связанны с модными понятиями pattern recognition, machine learning и тд). Я же выбрал самый простой путь цветное -> серое -> бинаризированое, где порог бинаризации выбирается по средней яркости. Так что наедятся на идеальную обработку цветных рисунков не стоит (ну и, по крайней мере, нормализовать по динамическому диапазону, перед преобразованием хотя бы).

В завершение не много самокритики:
Стандартная скорость на велике около 15 км/час, что дает всего 2-3 Гц развертки, что конечно далеко до идеальной картины, выход — только увеличение числа светодиодных линеек на колесе.
Датчик Холла лучше заменить хорошим герконом, и потребление меньше и работа с ним проще (остается, только снять шляпу перед китайцами, сделавшими мой велокомп, который питается от 1.5в LR44 батерейки уже год, при накате несколько сот км).
Форма платы вышла уж больно замысловатая, травить быстро, но вот обрабатывать.
Программа для компа, требует хорошей обработи кода (по этому код не вкладывал).

Ну и как обещал видео работы, прилагается (качество мобильник)*

*На видео дергается конечно сильно, но это скорее эффект от слабенькой камеры телефона, в реальности мерцает не так сильно.

Выводы:

Девайс, оправдал возложенные первоначально на него функции, так что есть куда развиваться (возможно, допилю обработку рисунков для работы в полярных координатах, а также прикошачу внешний накопитель, для больших рисунков).
Файлы в топике: Wheelpov.zip

Комментарии (20)

RSS свернуть / развернуть
Интересно. Смущает, что батарейки вращаются вместе с колесом, внося дисбаланс. Нужно на другую сторону прикрепить что-то равное по массе, например еще три батарейки :) Ну и шагать в сторону RGB, добавив еще две планки светодиодов.
0
Да, мне тоже кажется что так не самый лучший вариант, но остальные не проще. Может плюнуть на удобство и закрепить прямо на ось колеса, дисбаланс будет менее заметен.
0
самое хреновое, что это красиво сделано для комнаты) А ежели захочется покататься? В лужу не заедешь — плате будет каюк (нету защиты — имхо нужно было как-то разнести схему управления и индикации и залить все компаундом).
0
Как я писал, плата вскрыта лаком и усажена в термотрубку, все места, куда влага может затеял щелкать термоклеем. Пока узкое место это батарейки, как их изолировать думаю. А компаунд было бы интересно, но на глаза для плат ничего подобного не попадалось.
0
блин, андроид…
все места куда влага может затекать залил…
0
Кстати по итогам сегодняшней рыбалки пришла мысль. Берем колено от удочки нужного диаметра отрезаем и получаем легкий и прочный тубус для батареек. Осталось придумать как закрепить в нем контакты, точнее закрепить ерунда, а вот как сделать хорошую и быстросьемную крышку? Думаю трубки в сантиметров 17 на три батареки со всеми прибамбасами хватит, как раз под колесо.
0
А почему батарейки? Можно сделать аккумулятор, и залить всё герметиком, а заряжать по принципу зубной электрощётки, муторно делать, дороговато, но выйдет не убиваемое. Вообще, наверное можно отказаться от внешнего питания вообще, что-то типа генератора сделать, но это так научная фантастика…
0
тогда уже аккумы закрепить на раме, а питание передавать через вращающийся транс, как кулера запитывают. и ни дисбаланса, и герметизировать можно всю вращающуюся часть.
0
ну можно не вращающийся транс, а генератор. магниты на вилку, и катушки на колесо.
0
и что, оно даст достаточно энергии, чтобы запитать три десятка светиков? сомневаюсь…
не знаю — не пробовал, потому и сомневаюсь.
плюс, как и любой генератор — будет сильно зависеть от скорости.
0
ну мощность зависит от количества катушек и вполне может хватить. ну и надо накопление правильно сделать + стабилизатор импульсный.
а от скорости тут вся суть зависит, так что не проблема актуальна.
0
еще один геныч на заднее колесо
0
а передавать мощность на переднее? скользящим контактом? ;)
0
Думаю над этим вариантом, но пока не встречал более менее нормальный расчет по ним, все как то на глазок делают. И вторая с ним проблема- точно установить, зазор ведь мал, боюсь прямизны рук не хватит.
0
считать (теоретически) как транс, только с воздушным зазором. хотя проще на глазок по месту…
а установить просто — временная прокладка требуемой толщины, потом снять.
0
Да зачем отдельный блог. Пусть у тебя лежит. Все проекты которые джаст фор лулз авторы держат у себя.
0
Спасибо, впринципе тоже пришел к такому же выводу, в тематических блогах лучше смотрятся разные How to и описание теории.
0
У меня друг вывод рисунка не делал, а просто ленты светодиодов к спицам прикрепил. Он решил проблему батареек применив щёточный узел, закреплённый с противоположенной от кассеты стороны колеса. Щётки угольные, взял от небольшого электромотора. Токосъёмники выполненны в виде концентрических колец, вытравлены на текстолите с толстым меднением. Откатал с такой системой сезон, потом протёрлась медь.
0
щетки не айс в открытом исполнении делать — вода, грязь, окисляться будут дорожки. индуктивная передача тут была бы более к месту
0
С одной стороны в щетках плюс в простоте и то что надо подводить всего один полюс. Но все же я отверг данную конструкцию так как делал подобную мигалку пару лет назад но на двигателе от флопика.И все те же проблемы, неконтакт при малейшем перекосе и истирается медь. Пока склоняюсь к варианту treasure пробовать сделать вращающейся трансформатор.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.