Круто! Молодец! :)
Я к сожалению сейчас не могу поэкспериментировать с этим проектом, времени катастрофически не хватает :(
Как немного освобожусь, так сразу поэкспериментирую и отпишусь о результатах.
Вид для печати
Как просили, Lightpack с расширенным количеством зон (255).
Атлично! :) Eraser, cпасибо огромное.
Надеюсь это попадет и во все последующие сборки в том числе и для линукса.
И еще вопрос-пожелание-идея, раз уж ты присоединился и поддержал нашу беседу :)
Я её описывал еще когда сделал первый вариант:
добавить в протокол передачи данные с компа на контроллер после синхронизирующего кода 255 количество зон. Библиотека WS2801 позволяет динамически менять количество адресуемых пикселей. И это параметр позволит менять количество зон без перепрошивки контроллера. 8 бит на 1 кадр не сильно увеличат объем передаваемых данных, зато сильно упростят конфигурацию конечной пользовательской системы.
Можно ли добавить галочку-настроечку - передавать/непередавать первым байтом последовательности (после разделителя 255) количество зон?
Но в этом случае максимальное количество зон надо будет убавить до 254.
HiddenPilot, скажи, пжлста, есть ли в твоей ленте косяки, которые были в моей ленте а именно:
- перепутаны местами контакты data, clock
- перепутан порядок цветов вместо RGB надо указывать BRG. Описывал тут
Китаец их еще даже не выслал ) Они 3 дня назад были только заказаны) Если они были бы в наличии я не стал бы просить тебя проводить эксперименты )
У китайца еще есть 6 days 2 hours 47 minutes 22 seconds )))
"This order will be automatically cancelled if the supplier does not ship your order within"
+ месяц пересылки... так что до сентября я спокоен и раслаблен )
Да, именно так
потому что текущее максимальное значение 255 (FF)- это разделитель пакета данных для разных кадров.
и чтобы не было всякого рода коллизий от получения двух разделителей (FF FF 00 00 00 AA AA AA ...), лучше убавить до 254 (FF FE 00 00 00 AA AA AA ...)
Может быть и будет работать со значением 255, можно например на первое время оставить 255, потестировать, а там уже принять окончательное решение.
Сомневаюсь что в ближайшее время кто-нибудь себе сделает эмбилайт на 255 зон. Это какой же телек надо иметь? :)
Если 32зоны на метр, 255зон, получаем периметр телека 8 метров
считаем, считаем, считаем
Получаем телек диагональю чуть меньше 3метров - 116дюймов :)
Чтоб я так жил :)
Но если использовать проектор ... :)
Другое ограничение, но я этот момент еще опять же не исследовал, - это размер оперативной памяти в контроллере.
Используемая на текущий момент библиотека создает в памяти массив размером количество_зон*3 байт.
Т.е. для 255 зон надо чтобы в ОЗУ контроллера было место для массива как минимум 765байт.
В АТМеге 328 и покруче, в которых 2048 байт оперативки, наверное найдется место, а вот в АТМеге 168 оперативки всего 1024 байт, часть из которой будет тратится на рабочие переменные. Тонкости использования оперативки надо спрашивать у Chipa - гуру по микроконтроллерам :)
Опять же, у кого такой телек или проектор и кто купит такую длиннющую ленточку, наверное найдет чуть чуть деньжат и на контроллер чуть покруче чем АТМега 168 :)
MAKC, спасибо за развернутое объяснение
Данная фишка будет добавлена!
ЗЫ тестовая версия в аттаче
Отлично, буду ждать :) Наверняка не только я один :)
Еще на всякий случай хочу повторить, эта фича должна быть настраиваемой, т.е. надо уметь её включить и отключить.
Т.е. кому-то она нужна, а кому-то не нужна.
Второй байт с количеством зон будет мешать после обновления софта текущим владельцам Ardulight, где в софте не предусмотрено такое гибкое, динамическое изменение количества зон.
Да и на текущий момент нет опубликованного скетча, поддерживающего такой режим работы.
тестовая версия
http://www.compcar.ru/forum/attachme...3&d=1344585679
А я вот смотрю сюда и думаю, а стоит ли изобретать велосипед ?
https://github.com/adafruit/Adalight.../LEDstream.pde
может воспользоваться этим скетчем ? тем более поддержка АДА в LightPack'e уже есть.... А в АДА есть поддержка WS2801....
Тоже хорошее решение.
Только по скетчу пока не пойму как они определяют границы, кадров.
Вроде вижу синхросигнал "Ada" от контроллера в компьютер - запрос получения данных для очередного кадра.
Но как определяется конец данных для кадра, пока не пойму.
Вроде похоже на таймаут ожидания получения порции данных, но пока не уверен на 100%.
Кстати они у себя на странице ссылаются на использование LightPack, как на утилитку с дружественным GUI и хорошей производительностью
http://learn.adafruit.com/adalight-d...ftware-options
Ну в коде вроде все описали...
После magic word (Ada) идет 16битное значение количества светодиодов(только количество начинается с 0, т.е. для 120 светодиодов прилетает 119).....Код:immediately following the magic word
// are three bytes: a 16-bit count of the number of LEDs (high byte
// first) followed by a simple checksum value (high byte XOR low byte
// XOR 0x55). LED data follows, 3 bytes per LED, in order R, G, B,
// where 0 = off and 255 = max brightness.
далее чексум по формуле (high byte XOR low byte XOR 0x55). ну а далее цвета.... кстати в коде(во втором скетче ) написано, что у WS2801 цвета перепутаны. Кстати может добавить опцию порядка цветов на уровне Host'а ?
Ну а если я не ошибаюсь, то где-то тут весь буфер уходит в SPI:
Код:case MODE_DATA:
while(spiFlag && !(SPSR & _BV(SPIF))); // Wait for prior byte
if(bytesRemaining > 0) {
if(bytesBuffered > 0) {
SPDR = buffer[indexOut++]; // Issue next byte
bytesBuffered--;
bytesRemaining--;
spiFlag = 1;
Не работает :(
Требует дополнительно к файлам из комплекта LightPack 5.8.6-1 библиотеку libstdc++-6.dll
После добавления ругается:
"Точка входа в процедуру _ZN6QMutex12lockInternalEv не найдена в библиотеке DLL QtCore4.dll"
Сама библиотека QtCore4.dll в каталоге с программой присутствует.
МАКС, во! У меня такая же была ошибка кода я пытался скомпилировать LightPack из свежих исходников
Для запуска тестовой версии, нужны файлы из архива с программой на 255 зон для ardulight
http://www.compcar.ru/forum/attachme...2&d=1344572460
MAKC, думал тут думал, а ведь все очень просто получается с кодом управления через SPI.. что то типа
на ошибки проверил, а вот как работает к сожалению пока не могу... так что тебе карты в руки... но по логике должно все работать....Код:#include <SPI.h>
unsigned long LastByteTime, t;
uint8_t data;
void setup()
{
Serial.begin(115200);
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 МГц
//DDRB |= _BV(PORTB5); // Enable output for LED
//PORTB &= ~_BV(PORTB5); // LED off
//PORTB |= _BV(PORTB5); // LED on
}//setup()
void loop()
{
// for(;;){
t= millis();
if ((data = Serial.read()) >= 0) {
LastByteTime = t;
//if (data == 255){delay(1);continue;} //подождем 1мс для след кадра
if (data == 255){delay(1);return;} //подождем 1мс для след кадра
else{
while(!(SPSR & _BV(SPIF)));
SPDR = data;
}
}else{
//гасим подсветку если нет потока более 10 сек
if((t - LastByteTime) > 10000) {
for(char i=0; i<255; i++) {
SPDR = 0;while(!(SPSR & _BV(SPIF)));
}
delay(1); // подождем 1мс
LastByteTime = t; // Reset counter
}
}
// }//for
}
Очередная итерация скетча для работы с WS2801.
1. проверена работа в паре с другой Ардуиной в режиме SPI приемника, соотвественно исправлены все ошибки.
2. заменены библиотеки COM порта на более легкие и быстрые.
3. произведена оптимизация в сторону максимального отказа от Ардуиновских библиотек.
4. После оптимизаций прошивка на порядок полегчала , с 3.16кб до 0,85кб. Думаю, так же улучшилась отзывчивость кода.
Сам скетч:
(некоторые комментарии оставил для понимания кода)
Если кому-нибудь нужно, могу дополнительно выложить Скетч для Ардуино, который переводит мегу в режим приемника SPI и посылает принятые данные из шины SPI на COM порт. Очень удобно для отладки...Код:#include <util/delay.h>
#include <smallUart.h>
//#include <SPI.h>
unsigned long LastByteTime, t;
uint8_t data,byte_count = 0;
void setup()
{
UART_Init(115200);
//Заменяем команду SPI.begin();
//SPI.begin();
DDRB |= (1<<MOSI) | (1<< SCK) | (1<<SS);
PORTB |= _BV(PORTB2);
PORTB &= ~((1<<PORTB3)|(1<<PORTB5));
//SPI.setBitOrder(MSBFIRST);
//SPI.setDataMode(SPI_MODE0);
//SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 МГц
SPCR = 1; SPSR = 0; // 1 МГц; MSBFIRST; SPI_MODE0
//SPCR = 1; SPSR = 1; // 2 МГц; MSBFIRST; SPI_MODE0
//SPCR = 2; SPSR = 1; // 0.5 МГц; MSBFIRST; SPI_MODE0
}//setup()
void loop()
{
//for(;;){
t= millis();
if (UART_ReadByte(data)){
LastByteTime = t;
//if (data == 255){_delay_ms(1);continue;} //подождем 1мс для след кадра(for(;;))
if (data == 255){_delay_ms(1);return;} //подождем 1мс для след кадра(loop())
else{
// PORTB &= ~_BV(PORTB2); // для отладки: SS off, начинаем передачу
SPDR = data;while(!(SPSR & _BV(SPIF)));
//PORTB |= _BV(PORTB2); // для отладки: SS on, закончили передачу
}
}else{
//гасим подсветку если нет потока более 10 сек
if((t - LastByteTime) > 10000) {
for(int8_t i=0; i<255; i++) {
SPDR = 0;while(!(SPSR & _BV(SPIF)));
}
_delay_ms(1); // подождем 1мс
LastByteTime = t;
}
}
//}//for
}
PS: библиотеку SmallUart можно взять отсюда
Продолжение темы/Очередная доработка:
Отказался от библиотеки SmallUart, так что теперь нет необходимости скачивать библиотеку SmallUart. Основные функции перенес в скетч.
После очередной оптимизации программа снова "похудела" почти на 200 байтКод:#include <util/delay.h>
//#include <smallUart.h>
//#include <SPI.h>
unsigned long LastByteTime, t;
uint8_t data;
void setup()
{
//Инициализация UART
UBRR0L = 16;UBRR0H = 0; //115200
//UBRR0L = 34;UBRR0H = 0; //57600
UCSR0A = ( 1<<U2X0 ); //UART_DOUBLESPEED
UCSR0C=((1<<UCSZ01) | (1<<UCSZ00)); //Set Frame Format
UCSR0B = ((1<<TXEN0) | (1<<RXEN0)); //Enable The receiver and transmitter
//Инициализация SPI;
//SPI.begin();
DDRB |= (1<<MOSI) | (1<< SCK) | (1<<SS);
PORTB |= _BV(PORTB2);
PORTB &= ~((1<<PORTB3)|(1<<PORTB5));
//SPI.setBitOrder(MSBFIRST);
//SPI.setDataMode(SPI_MODE0);
//SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 МГц
SPCR = 1; SPSR = 0; // 1 МГц; MSBFIRST; SPI_MODE0
//SPCR = 1; SPSR = 1; // 2 МГц; MSBFIRST; SPI_MODE0
//SPCR = 2; SPSR = 1; // 0.5 МГц; MSBFIRST; SPI_MODE0
}//setup()
bool Read_Next_Byte(uint8_t& data)
{
if (_SFR_MEM8(0xC0) & (1<<7)) //(UCRA & (1<<UART_RXREADY))
{
data = _SFR_MEM8(0xC6); //data = UDR;
return true;
}
else return false;
}
void loop()
{
//for(;;){
t= millis();
if (Read_Next_Byte(data)){
//if (true){
LastByteTime = t;
//if (data == 255){_delay_ms(1);continue;} //подождем 1мс для след кадра(for(;;))
if (data == 255){_delay_ms(1);return;} //подождем 1мс для след кадра(loop())
else{
// PORTB &= ~_BV(PORTB2); // для отладки: SS off, начинаем передачу
SPDR = data;while(!(SPSR & _BV(SPIF)));
//PORTB |= _BV(PORTB2); // для отладки: SS on, закончили передачу
}
}else{
//гасим подсветку если нет потока более 10 сек
if((t - LastByteTime) > 10000) {
for(int8_t i=0; i<255; i++) {
SPDR = 0;while(!(SPSR & _BV(SPIF)));
}
_delay_ms(1); // подождем 1мс
LastByteTime = t;
}
}
//}//for
}
Знаковое число получилось )))Цитата:
Размер скетча в двоичном коде: 666 байт
Твоя лента уже приехала?
Chip, 2 сентября вышла с таможни, в начале след недели 100% будет у меня....
На данный момент прикрутил пульт, и начинаю наполнять скетч различными автономными режимами работы ленты....
Приехала лента!! ) Проверил, лента работает замечательно. По SPI лента стабильно держит аж до 4 МГц, что не может не радовать.
Нашел в скетче еще несколько ошибок связанных с инициализацией SPI. Чуть позже исправлю скетч, или выложу обновленный, в котором уже будет работа пульта, а так же автономные режимы работы ленты.
Ждем видео отчета, если все ОК, я себе тоже закажу такую ленту
Ну это долго придется ждать :). Лента работает замечательно, с LightPack'ом синхронизируется на отлично. Пришлось допиливать скетч путем ввода массива-буфера на 3 цвета, т.к. порядок цветов отличается от RGB, точнее RBG.
При 200 зонах размером 150х150, задержке 1мс, FPS в среднем 50 кадров (40-60) кадров(SPI 1МГц, ноут Core2Duo 1333 МГц, 1366*768).
Работу с теликом на стене пока не могу выложить, и если выложу, то не раньше, чем через неделю т.к. телек у меня висит "на тросе" аля картина, и расстояние от лицевой строрны телека до стены 3см, это очень мало для ленты, нужно отодвигать еще хотя бы на 2 см, ну и настраивать 116 зон тоже не особо быстрое дело). Да и ДР у ребётенка через 2 дня, будет не до того. А в черновом варианте выкладывать не хочу чтобы не портить впечатление о работе.
Работу в Автономном режиме(переход цветов) могу выложить. Работу с ЛайтПаком тоже могу заснять, но пока только с лентой на столе.
2МАКС, CLK и DI у меня не были перепутаны, а вот порядок цветов отличается от RGB.
Не очень корректно телефон передает яркость и насыщенность цветов (пересветляет), но для демонстрации работы вполне пойдет. Так же нужно вводить функцию или массив гамма коррекции(хорошо видно, что смешанные цвета более протяженные нежели основные-RGB).
А как насчет видео работы Ardulight?
кто просил ХЛЕБА и ЗРЕЛИЩЬ ? :)
Отлично!!! Эффект классный!
Себе тоже закажу такую ленту
Ага... сам в восторге)... Но есть несколько мелких НО.
1. Пока еще не понял откуда ноги растут, но первых 4 зоны лента попросту пропускает. т.е. первый светодиот отображает цвет 5той зоны и далее по порядку, пришлось расставить зоны со смещением.... 5-118.
2. лента идет в силиконовой "прямоуголной" трубке. и у нее получился эффект "стекловолокна". На видео можно разглядеть, где находится каждый светодиод. И что самое противное сами светодиоды спрятаны за телевизор, а точки это свечение поверхности той самой силиконовой трубки.
3. 256(8bit) градаций каждого света оказалось слегка маловато. это очень сильно заметно на темных сценах при включенной гамма коррекции... А вот на ярких сценах будет достаточно и 6bit на каждый цвет... так что сразу хочу отговорить от лент на базе LPD8806 и им подобных с 7bit'ным цветом.
еще коечто по мелочи, например расстояние до стены у меня всего 5 см получилось, от ленты и того меньше около 2-3 см.
Обои с перламутровой текстурой так же дают повышенную яркость около светодиодов и наоборот пониженная засветка при удалении от светодиода.
Специально подкладывал альбомный лист, засветка получалась более равномерно-удаленной.
Ну и ставший нормой для демонстрации - АВАТАР и ролик с предыдущей страницы :) :
HiddenPilot, Красотища!!!
Для себя осталось разрулить все дела, выкроить время, и повторно заняться подсветкой, на новой ленте :)
Плотность светодиодов самая подходящая, для такой подсветки больше и не надо.
Даже думаю немного избыточна, телек наверное стоит подальше от стенки отодвинуть, чтобы пятна побольше размывались. И светящиеся точки тоже не очень хорошо выглядят, наверное ленту надо подальше от края отодвинуть, ну потеряется по паре зон на углах, тут это абсолютно не принципиально.
Это мое личное субъективное мнение.
Как известно, вкус и цвет - лучший повод для драки :)
Доброго времени суток!
Подскажите, ленту на WS2801 на каком ардуино собирать? 32-36 зон.
Carduino Nano V.4 будет достаточно?
Результаты развития проекта впечатляют!
Еще пара вопросов:
- При самостоятельной сборке подобия Arduino реально ли вместо FT232 использовать обычный MAX232 и подключать к "реальному" COM-порту? (как в старых версиях Arduino).
- Необходим ли бутлоадер, или можно скомпилить скетч и залить .hex в мегу программатором?
Carduino Nano будет достаточно, HiddenPilot использовал в проекте Carduino Nano
Можно и без bootloaderaЦитата:
Необходим ли бутлоадер, или можно скомпилить скетч и залить .hex в мегу программатором?
Это зависит от программы на PCЦитата:
При самостоятельной сборке подобия Arduino реально ли вместо FT232 использовать обычный MAX232 и подключать к "реальному" COM-порту? (как в старых версиях Arduino)
Спасибо
В Лайтпаке переключение между мониторами отсутствует? Или я туплю?
conler, Лайт пак воспринимает 2 монитора как одну картинку.... т.е. для второго монитора координаты больше на размер разрешения первого монитора... к примеру
2 монитора по ширине: один 1366 второй 1920... так вот первый пиксель второго монитора будет 1367 последний 1366+1920. Как то так. порбуй раставб зоны на втором мониторе и посмотри что он сохранил в файле настроек