Стыдно, стыдно..

Так сложилось – ничего не делаю :(

Нашелся новый внешний раздражитель – телефон с андроидом; понятно, что еще не наигрался: перепрошиваю туда-сюда, играюсь с новыми фичами, читаю умные книжки про яву и собственно андроид, хочется ж чего-то напрограммировать (даже есть 2 идеи реально мне полезных программ)

Хотя перечитал еще раз доки про i2c и вроде начало доходить, как мне его прикрутить себе в железки; не придумаю толком, как это отлаживать, когда бага может быть как в мастере, так и в приемнике.. и протеус ничего не показывает в теоретически рабочем примере

И еще был на море – там хорошо :)

Видео для привлечения внимания..

Диодам не хватает яркости; раньше заметил, что они достаточно ощутимо грелись, выяснилось, что блок питания выдавал 6 вольт (а резисторы то расчитаны на 5), добавил крен-ку; теперь рылся в коде, искал ошибку, потом додумался померять напряжение – а там 4 вольта всего..

6 В было, когда подключал всего пару rgb-светодиодов, а когда 9 штук (да * 3 канала)  – ток большой, а блок питания всего 350 мА обещает, вот напряжение и проседает.. Есть старый АТ-блок питания комповый небольшой, с ним светится веселее, но он неудобный..

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

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

Картинка для привлечения внимания..

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

За выходные доделал все, что касалось “железячной” части – сделал все микроплатки, допаял все разьемы и т.д. и т.п. и хорошенько занялся прошивкой; мой на бумаге хорошо выглядящий протокол на самом деле сократился до 3-х пунктов: самопроверка при старте (нужна по крайней мере сейчас, чтобы заметить, если где-то что-то оторвалось/отпаялось), отключение света (потому что для тестирования как минимум хорошо выключать свет, когда он не нужен, чтобы не светил в глаза) и собственно работа

Читать запись полностью »

Продолжение марлезонского балета..

Borderlands прошел, светодиоды приехали, больше вроде ничего не мешает (ну, Splinter Cell разве что еще.. зараза.. прошел)

Игрался все это время с мелкими проектиками, все в основном в протеусе, и все в основном бился с ним, разбирался, как работает :)

Но надо чухаться, а чухается лучше всего, когда завидно – для «завидования» себе вот выбрал видео:

Читать запись полностью »

Еще немного про протокол..

Благодаря моему первому (и единственному пока :) ) комментатору почитал про уже существующий протокол – AtmoLight, может действительно есть смысл поддерживать "стандартный", тогда и управляющую программу чужую можно использовать, и моя программа будет совместима с такого типа амби-системами..

Выглядит там все вот так:

Байт в посылке:

Смысл:

0xFF

Всегда 0xFF, стартовый байт

0х00

Номер стартового канала, младший байт

0х00

Номер стартового канала, старший байт (это на сколько ж каналов задел?..)

0x0F

Количество каналов (* 3), 15 = 3 * 3

0х23 0х23 0х23 …

R, G, B данные очередного канала

Вот так; одно не понял, зачем 2 байта под номер стартового канала, но видимо причины были

Я себе в MindMeister набросал немного другую схему:

Байт в посылке:

Смысл:

0х00 – 0х09

Стартовый байт, от 0 до 9 – зарезервировано место для 10 команд, 0х00 например – начало “обычной” передачи, 0х01 – тест излучателя и т.д.

0х0E

Длина посылки, что бы там внутри ни было

0х23 0х23 0х23 …

Данные посылки  ( например R,G,B канала или номер излучателя для теста)

0х88

CRC от тела посылки, для контроля целостности передачи

Из чисто практических целей пока вижу следующие команды: 0х00 – передача данных, 0х01 – проверка излучателей (каждый излучатель == 3-канальный светодиод) зажигается на 1 сек, потом тухнет), 0х02 – тест излучателя (указанный излучатель выводит по очереди основные цвета), 0х09 – отключение всех излучателей

Зачем проверка с crc – может конечно из-за отладки (а даже 99% скорее всего) у меня был глюк – перестали правильно отображаться света при управлении из тестовой программки, в которой 3 ползунка для каждого канала; все работало, но цвет неправильный генерировался.. Потом разобрался, что меняется не тот канал, который меняю (синий вместо красного например).. Начал уже дебажить код, потом перезагрузил контроллер и все починилось – видимо байт при приеме пропал, вот цвета и сместились..

Но там в “апи” еще есть вещи интересные, про которые даже не прочитал еще толком, некогда было.. Может именно они и “перевесят” в пользу готового протокола; а может как-то получится совместить их?.. надо думать в общем еще..

Протокол..

Много чего писал, но протоколов еще никогда не изобретал (вообще все мною написанное это gui и какие-то задачи по переработке файлов как правило)

Прикидываю: связь с компьютером у меня через сом-порт; максимальная скорость обмена с сом-портом допустим 112500.. или 115200?.. бит/сек, так, с учетом стоповых разных бит, четностей и прочего грубо говоря 10 бит на байт – значит максимальная скорость передачи данных будет где-то 10 кбайт/сек. Допустим, что я буду обновлять цвета 10 раз/сек, значит у меня есть где-то 1 кбайт данных на один «пакет обновления» – этого больше чем достаточно я считаю

Прикидываю с другой стороны: у меня 14 светодиодов по 3 цвета = 42 канала, по байту на канал – 42 байта на обновление – скорость обмена по сом-порту может быть мизерная совсем, на мои нужды хватит с головой

14 зон мне точно хватит для моего 32″ тв, картинки DIY-проектов показывают, что в углах обычно яркость ниже, чем по сторонам, так что я думаю, что в углах надо по 2 светодиода ставить

Дальше думаю принять скажем условие, что управляющая программа на компьютере никогда не будет слать значение 0х00 для канала – значит протокол будет выглядеть примерно так:

  • по прерыванию на Rx смотрю на принятый байт: вдруг не 0х00 – ничего не делаю, иначе ставлю признак, что прием идет;
  • принимаю 42 байта, складываю их в массив;
  • принимаю 43-й байт, считаю crc от полученных 42-х байт, если сходится – высвечиваю цвета
  • убираю признак приема и все с начала..

Для crc надыбал вот код:

#define CRC8INIT	0x00
#define CRC8POLY	0x18              //0X18 = X^8+X^5+X^4+X^0

uint8_t	crc8 ( uint8_t *data_in, uint16_t number_of_bytes_to_read )
{
	uint8_t crc;
	uint16_t loop_count;
	uint8_t  bit_counter;
	uint8_t  data;
	uint8_t  feedback_bit;

	crc = CRC8INIT;

	for (loop_count = 0; loop_count != number_of_bytes_to_read; loop_count++)
	{
		data = data_in[loop_count];

		bit_counter = 8;
		do {
			feedback_bit = (crc ^ data) & 0x01;

			if ( feedback_bit == 0x01 ) {
				crc = crc ^ CRC8POLY;
			}
			crc = (crc >> 1) & 0x7F;
			if ( feedback_bit == 0x01 ) {
				crc = crc | 0x80;
			}

			data = data >> 1;
			bit_counter--;

		} while (bit_counter > 0);
	}

	return crc;
}

Выбор железа, мысли про протокол..

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

Видится все примерно так: у меня есть ATtiny2313, он недорогой, но у него хватает ног/мозгов и сил делать практически все, что нужно для моего проекта: связываться с компом (uart), связываться с другим контроллером (usi), зажигать с заданной яркостью светодиоды; со светодиодами я игрался со встроенным генератором 8 МГц, хотя вчера для опытов с uart я поставил внешний кварц на 11 с чем-то МГц

Конструкция будет состоять из нескольких (одинаковых) контроллеров, из которых один будет главнее – подключаться к компу, а остальные  будут подключаться к нему последовательно

У основного контроллера вычитаем ноги: PA0, PA1 – используются для подключения кварца; PD0, PD1 – связь c сом-портом компьютера (или с ft232rt с usb портом); PB5, PB6, PB7 – связь с другими контроллерами по two/tree wire interface – остаются PD2-PD6, PB0-PB4 (еще PB6 если использовать two wire), т.е. всего 10 (11) выводов/каналов цвета или 3 полных источника цвета

У вспомогательных контроллеров – 12 выводов или 4 источника; всего у меня запланировано 14 светодиодов по периметру равномерно -> нужно 3 * 4 + 1 * 3 контроллера

Правда есть вариант сократить количество – у меня болтается с давних времен 3 меги16, одна в jtag, а две – для опытов; т.е. можно взять мегу для основного контроллера, в бенефитах – много ног + отладка в устройстве, если правильно считаю, то доступно будет PA0-PA7 + PB0-PB7 + PC6-PC7 + PD2-PD7 = 22 вывода -> 7 светодиодов сразу (это с учетом того, что jtag занимает 4 ножки); и памяти у него побольше, что с моим умением может оказаться аргументом..

Так что пока играюсь с макеткой с тини, а на вторую макетку вставлю мегу – как только прошью jtag, и с этой связкой буду разбираться с связью между контроллерами

С такими исходными можно думать про протокол; в любом случае (используется для главного контроллера тини или мега) понятно, что главный контроллер не такой как все остальные. Для подсветки всего экрана надо определить цвет в 14 точках экрана (накрыв экран сеткой 5 * 4) и передав в контроллер 42 значения компонентов цвета – или взяв цвет в 20 точках при другом разбиении и другом количестве контроллеров, и передав 60 значений компонентов цвета

В любом случае мастер (основной контроллер) получает пакет из компонент цвета, грубо говоря оставляет себе х * 3 значений (х – количество источников цвета, которое он поддерживает), а остальные значения передает дальше по цепочке

Следующий (рабочий) контроллер получает пакет, берет х * 3 значения из него (где опять же х – это количество источников цвета, которое он поддерживает), а остаток передает дальше

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

Компиляция прошивки

Прошивка пишется на языке Си, значит надо установить компилятор; кроме того, можно/нужно установить ide – интегрированную среду разработки, в которой писать просто удобнее

Читать запись полностью »

Инструменты

Инструменты не в смысле железок, а в смысле – чем буду пользоваться в процессе

Управляющая программа на РС – понятно, Delphi; я использую D2010, в основном из-за появившейся (наконец то) поддержки unicode, но в этом проекте юникод вроде как особо не нужен, так что в принципе и версия делфи не суть важна

Прошивка контроллеров – WinAVR и Eclipse + AVR Eclipse plugin; WinAVR – это набор, который содержит все необходимое для компиляции Си-проекта, а Eclipse – интегрированная среда разработки, т.е. место, в которой пишется исходный текст программы на Си, компилируется и записывается в контроллер

Для записи прошивки в контроллер нужен программатор; очень простой и надежный программатор, которым я пользуюсь – самодельный «stk-200/stk-300″-совместимый, подключается к lpt-порту, шьет быстро и практически без сбоев; если бы не было lpt-порта, то сделал-бы usb-программатор – такой или такой

Для красивого рисования схем и разводки плат можно использовать EAGLE Layout Editor, для небольших схем/плат бесплатный

Железные инструменты тоже конечно нужны – паяльник маломощный (хочу все купить новый, с регулировкой температуры, а так пользуюсь купленным году в 1989 еще паяльником 12-вольтовым не знаю, какой мощности, с накрученной на дало медной проволокой заточенной – smd паять) и тестер для прозвонки дорожек. Еще полезная штука – на массивном основании линза с несколькими крокодильными зажимами

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

IMG_0120.JPG

Пока все вроде…