Ambi-Light 2: 16bit PWM, 5 RGB-Kanäle
9. Software
In diesem Kapitel wird die Software-Ausstattung beschrieben. Bitte beachtet, dass die Firmware unter der Creative Commons Lizenz by-nc-sa steht. Ihr dürft die Daten nicht kommerziell verwenden und müßt den Urheber angeben. Eine Weitergabe zu den gleichen Bedingungen ist gestattet.
9.1 PC-Komponente
Am PC benötigen wir, wie bisher auch, einen Prozess, die die Farben aus dem Bildschirm ausliest und sie in einen seriellen Datenstrom verwandelt. Nachdem Boblight (ursprüngliche Seite, Google Code) hier sehr gute Dienste leistet, optimal unter Windows XP läuft und auch Standby/Resume überlebt, hat sich hier wenig getan. Wir müssen nur in der Konfiguration umstellen, dass wir jetzt 15 RGB-Kanäle statt drei haben. Hier noch einmal die Konfigurationsdatei.
9.2 MCU Firmware
Fast schon beschämend ist die Simplizität der Firmware. Mußte in der Soft-PWM-Variante noch jeder Taktzyklus gezählt werden, so können wir uns hier sehr entspannt zurücklehnen und einfach Bytes zwischen Hardware-Modulen hin- und herschieben. Nachdem es nicht viel Code ist, habe ich ihn hier kommentiert, wo notwendig.
WinAVR-Code für Ambilight Controller 2
#define F_CPU 7373742
#define MAX_CHANNELS_OF_DEVICE 15
#define ERROR_CONDITION 240
//#define WITH_PORTD1_AS_USART 1
#include
#include
#include
#include
uint16_t gamma25[256] = { 0, 0, 1, 2, 3, 6, 8, 11, 15, 20, 25, 31, 38, 46, 54, 64, 74, 86, 98, 112, 126, 142, 159, 176, 195, 215, 237, 259, 283, 308, 334, 362, 391, 421, 453, 486, 520, 556, 594, 632, 673, 714, 758, 803, 849, 897, 946, 998, 1050, 1105, 1161, 1219, 1278, 1339, 1402, 1467, 1533, 1601, 1671, 1743, 1816, 1892, 1969, 2048, 2129, 2212, 2296, 2383, 2472, 2562, 2655, 2749, 2846, 2944, 3045, 3147, 3252, 3358, 3467, 3578, 3691, 3805, 3923, 4042, 4163, 4287, 4412, 4540, 4670, 4803, 4937, 5074, 5213, 5354, 5498, 5644, 5792, 5942, 6095, 6250, 6407, 6567, 6729, 6894, 7061, 7230, 7402, 7576, 7752, 7931, 8113, 8297, 8483, 8672, 8864, 9058, 9254, 9453, 9655, 9859, 10066, 10275, 10487, 10701, 10918, 11138, 11360, 11585, 11813, 12043, 12276, 12511, 12750, 12991, 13235, 13481, 13730, 13982, 14237, 14494, 14754, 15017, 15283, 15552, 15823, 16097, 16374, 16654, 16937, 17223, 17511, 17803, 18097, 18394, 18694, 18997, 19303, 19612, 19924, 20238, 20556, 20877, 21200, 21527, 21857, 22189, 22525, 22864, 23205, 23550, 23898, 24249, 24603, 24960, 25320, 25684, 26050, 26419, 26792, 27168, 27547, 27929, 28314, 28702, 29094, 29489, 29887, 30288, 30692, 31100, 31511, 31925, 32342, 32763, 33186, 33613, 34044, 34478, 34915, 35355, 35798, 36245, 36696, 37149, 37606, 38066, 38530, 38997, 39467, 39941, 40418, 40899, 41383, 41870, 42361, 42856, 43353, 43855, 44359, 44867, 45379, 45894, 46413, 46935, 47460, 47989, 48522, 49058, 49598, 50141, 50688, 51238, 51792, 52350, 52911, 53475, 54044, 54615, 55191, 55770, 56353, 56939, 57529, 58123, 58720, 59321, 59926, 60534, 61147, 61762, 62382, 63005, 63632, 64263, 64897, 65535 };
uint16_t gamma22[256] = { 0, 2, 4, 7, 11, 17, 24, 32, 41, 52, 64, 78, 93, 110, 128, 147, 168, 191, 215, 240, 267, 296, 327, 359, 392, 428, 465, 504, 544, 586, 630, 676, 723, 772, 823, 875, 930, 986, 1044, 1104, 1165, 1229, 1294, 1361, 1430, 1501, 1574, 1648, 1725, 1803, 1884, 1966, 2050, 2136, 2224, 2314, 2406, 2500, 2595, 2693, 2793, 2895, 2998, 3104, 3212, 3322, 3433, 3547, 3663, 3781, 3900, 4022, 4146, 4272, 4400, 4530, 4663, 4797, 4933, 5072, 5212, 5355, 5499, 5646, 5795, 5946, 6099, 6255, 6412, 6572, 6733, 6897, 7063, 7231, 7402, 7574, 7749, 7926, 8105, 8286, 8469, 8655, 8843, 9033, 9225, 9419, 9616, 9815, 10016, 10219, 10425, 10632, 10842, 11054, 11269, 11486, 11705, 11926, 12149, 12375, 12603, 12833, 13066, 13301, 13538, 13777, 14019, 14263, 14509, 14758, 15009, 15262, 15517, 15775, 16035, 16298, 16563, 16830, 17099, 17371, 17645, 17922, 18201, 18482, 18765, 19051, 19339, 19630, 19923, 20218, 20516, 20816, 21119, 21424, 21731, 22040, 22352, 22667, 22984, 23303, 23624, 23949, 24275, 24604, 24935, 25269, 25605, 25943, 26284, 26628, 26973, 27322, 27672, 28026, 28381, 28739, 29100, 29462, 29828, 30196, 30566, 30939, 31314, 31692, 32072, 32454, 32840, 33227, 33617, 34010, 34405, 34802, 35202, 35605, 36010, 36417, 36827, 37240, 37655, 38072, 38493, 38915, 39340, 39768, 40198, 40631, 41066, 41503, 41944, 42387, 42832, 43280, 43730, 44183, 44639, 45097, 45557, 46020, 46486, 46954, 47425, 47899, 48374, 48853, 49334, 49818, 50304, 50793, 51284, 51778, 52275, 52774, 53276, 53780, 54287, 54796, 55308, 55823, 56341, 56860, 57383, 57908, 58436, 58966, 59499, 60035, 60573, 61114, 61657, 62203, 62752, 63303, 63857, 64414, 64973, 65535 };
//uint16_t gamma20[256] = { 0, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000, 10201, 10404, 10609, 10816, 11025, 11236, 11449, 11664, 11881, 12100, 12321, 12544, 12769, 12996, 13225, 13456, 13689, 13924, 14161, 14400, 14641, 14884, 15129, 15376, 15625, 15876, 16129, 16384, 16641, 16900, 17161, 17424, 17689, 17956, 18225, 18496, 18769, 19044, 19321, 19600, 19881, 20164, 20449, 20736, 21025, 21316, 21609, 21904, 22201, 22500, 22801, 23104, 23409, 23716, 24025, 24336, 24649, 24964, 25281, 25600, 25921, 26244, 26569, 26896, 27225, 27556, 27889, 28224, 28561, 28900, 29241, 29584, 29929, 30276, 30625, 30976, 31329, 31684, 32041, 32400, 32761, 33123, 33488, 33855, 34224, 34595, 34968, 35343, 35720, 36099, 36480, 36863, 37248, 37635, 38024, 38415, 38808, 39203, 39600, 39999, 40400, 40803, 41208, 41615, 42024, 42435, 42848, 43263, 43680, 44099, 44520, 44943, 45368, 45795, 46224, 46655, 47088, 47523, 47960, 48399, 48840, 49283, 49728, 50175, 50624, 51075, 51528, 51983, 52440, 52899, 53360, 53823, 54288, 54755, 55224, 55695, 56168, 56643, 57120, 57599, 58080, 58563, 59048, 59535, 60024, 60515, 61008, 61503, 62000, 62499, 63000, 63503, 64008, 64515, 65024, 65535 };
uint16_t gamma18[256] = { 0, 11, 22, 37, 55, 76, 101, 128, 158, 191, 227, 266, 307, 350, 397, 446, 497, 551, 607, 666, 727, 791, 857, 925, 995, 1068, 1143, 1220, 1300, 1382, 1466, 1552, 1640, 1731, 1824, 1919, 2016, 2115, 2216, 2319, 2425, 2532, 2642, 2753, 2867, 2983, 3100, 3220, 3342, 3466, 3591, 3719, 3849, 3981, 4114, 4250, 4387, 4527, 4668, 4812, 4957, 5104, 5254, 5405, 5558, 5712, 5869, 6028, 6188, 6351, 6515, 6681, 6849, 7019, 7190, 7364, 7539, 7716, 7895, 8076, 8259, 8443, 8629, 8817, 9007, 9199, 9392, 9588, 9785, 9983, 10184, 10386, 10590, 10796, 11004, 11213, 11424, 11637, 11852, 12068, 12286, 12506, 12728, 12951, 13176, 13403, 13631, 13861, 14093, 14327, 14562, 14799, 15038, 15278, 15520, 15764, 16009, 16257, 16505, 16756, 17008, 17262, 17517, 17775, 18033, 18294, 18556, 18820, 19085, 19353, 19621, 19892, 20164, 20438, 20713, 20990, 21269, 21549, 21831, 22114, 22399, 22686, 22975, 23265, 23556, 23849, 24144, 24441, 24739, 25038, 25340, 25642, 25947, 26253, 26561, 26870, 27181, 27493, 27807, 28123, 28440, 28759, 29079, 29401, 29724, 30049, 30376, 30704, 31034, 31365, 31698, 32033, 32369, 32706, 33045, 33386, 33728, 34072, 34417, 34764, 35113, 35463, 35814, 36167, 36522, 36878, 37235, 37595, 37955, 38318, 38681, 39047, 39413, 39782, 40152, 40523, 40896, 41270, 41646, 42024, 42403, 42783, 43165, 43549, 43934, 44320, 44708, 45098, 45489, 45881, 46275, 46671, 47068, 47466, 47866, 48268, 48671, 49075, 49481, 49889, 50298, 50708, 51120, 51533, 51948, 52364, 52782, 53202, 53622, 54044, 54468, 54893, 55320, 55748, 56178, 56609, 57041, 57475, 57911, 58347, 58786, 59226, 59667, 60109, 60554, 60999, 61446, 61895, 62345, 62796, 63249, 63703, 64159, 64616, 65075, 65535 };
unsigned char volatile resetCounter = 0;
unsigned char volatile currentChannelNumber = 0;
unsigned char volatile currentBaseAddress = 0;
unsigned char volatile channelValues[MAX_CHANNELS_OF_DEVICE] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
#ifdef WITH_PORTD1_AS_USART
ISR(USARTD1_RXC_vect) {
#else
ISR(USARTC1_RXC_vect) {
#endif
static unsigned char data;
unsigned char tmp;
#ifdef WITH_PORTD1_AS_USART
data = USARTD1.DATA;
#else
data = USARTC1.DATA;
#endif
//PORTA.OUTCLR = 0b00000100;
// Ok, "Timer" zum Zurücksetzen der Kanalnummer zurücksetzen
// und "enablen"
resetCounter=1;
if (USARTC1.STATUS & (USART_FERR_bm | USART_BUFOVF_bm | USART_PERR_bm)) {
// Transmission error, drop this frame
PORTA.OUTCLR = 0x02; // Grüne LED aus
PORTA.OUTSET = 0x01; // Rote LED an
currentChannelNumber = ERROR_CONDITION;
}
// Bei Fehler oder zu vielen Bytes ISR verlassen
if (currentChannelNumber == ERROR_CONDITION) { return; }
if (
currentChannelNumber >= currentBaseAddress
&&
currentChannelNumber < (currentBaseAddress+MAX_CHANNELS_OF_DEVICE)
) {
//PORTA.OUTSET = 0b00001000;
tmp = currentChannelNumber - currentBaseAddress;
if (tmp == 0) {
PORTA.OUTCLR = 0x01; // Rote LED aus
PORTA.OUTSET = 0x02; // Grüne LED an, Frame-Start.
}
channelValues[tmp] = data;
if (tmp == (MAX_CHANNELS_OF_DEVICE-1)) {
// Ok, letzter Kanal, Werte übernehmen
TCC0.CCABUF = gamma25[channelValues[0]]; // R1 = 0
TCC0.CCBBUF = gamma22[channelValues[5]]; // G1 = 5
TCC0.CCCBUF = gamma25[channelValues[10]]; // B1 = 10
TCC0.CCDBUF = gamma25[channelValues[1]]; // R2 = 1
TCC1.CCABUF = gamma22[channelValues[6]]; // G2 = 6
TCC1.CCBBUF = gamma25[channelValues[11]]; // B2 = 11
TCD0.CCABUF = gamma25[channelValues[2]]; // R3 = 2
TCD0.CCBBUF = gamma22[channelValues[7]]; // G3 = 7
TCD0.CCCBUF = gamma25[channelValues[12]]; // B3 = 12
TCD0.CCDBUF = gamma25[channelValues[3]]; // R4 = 3
TCD1.CCABUF = gamma22[channelValues[8]]; // G4 = 8
TCD1.CCBBUF = gamma25[channelValues[13]]; // B4 = 13
TCE0.CCABUF = gamma25[channelValues[4]]; // R5 = 4
TCE0.CCBBUF = gamma22[channelValues[9]]; // G5 = 9
TCE0.CCCBUF = gamma25[channelValues[14]]; // B5 = 14
// LED aus
PORTA.OUTCLR = 0x02;
}
//PORTA.OUTCLR = 0b00001000;
}
if (currentChannelNumber<ERROR_CONDITION) { currentChannelNumber++;}
}
int main() {
// Konfig. PORT A: Zwei Outputs, Rest IN
PORTA.DIR = 0b00011111;
PORTA.OUT = 0b00000011; // Both LEDs on
// Konfig. PORT A: Pullups einschalten
PORTA.PIN5CTRL = PORT_OPC_PULLUP_gc;
PORTA.PIN6CTRL = PORT_OPC_PULLUP_gc;
PORTC.DIR = 0b11111111;
PORTD.DIR = 0b11111111;
PORTE.DIR = 0b00001111;
// Osczillator-Modus: Crystal von 2-9MHz, mit 16k cycles startup-time
OSC.XOSCCTRL = OSC_XOSCSEL_XTAL_16KCLK_gc | OSC_FRQRANGE_2TO9_gc;
// CLK-Sourcen enablen
OSC.CTRL = /* OSC_RC32MEN_bm | */ OSC_XOSCEN_bm ; //enable external OSC, Crystal
while(!(OSC.STATUS & OSC_XOSCRDY_bm)); //wait for stability for External Clock Source
PORTA.OUT = 0x00; // LEDs off.
CCP = CCP_IOREG_gc; // Conf.Änderung erlauben
CLK.CTRL = 0x03; // CSource Clock Extern
CCP = CCP_IOREG_gc; // Conf.Änderung erlauben
CLK.PSCTRL = 0x00; // Prescaler 0 (Teiler)
//USART INIT
#ifdef WITH_PORTD1_AS_USART
PORTD.DIRCLR = 0b01000000; // RX Bit (6) als Eingang
PORTD.DIRSET = 0b10000000; // TX Bit (7) als Ausgang
USARTD1.CTRLA = 0b00010000; // Interrupt-Level: RX High, alles andere Off
USARTD1.CTRLC = 0b00000011; // Async, NoPar, 1SBit, 8Bit Wortgröße
USARTD1.BAUDCTRLA = 0b00000111; // 7 = 57k6
//USARTD1.BAUDCTRLA = 0b00001011; // 11 = 38k4
//USARTD1.BAUDCTRLA = 0b00010111; // 23 = 19k2
//USARTD1.BAUDCTRLA = 0b00101111; // 47 = 9600 Baud @7,32... Mhz
USARTD1.BAUDCTRLB = 0b00000000; //BSCALe=3x0, 11 hat keine high bits, daher auch 0
USARTD1.CTRLB = 0b00011000; // 000, RX ein, TX ein, Single-Speed, No-Multi, 2xDontCare
#else
PORTC.DIRCLR = 0b01000000; // RX Bit (6) als Eingang
PORTC.DIRSET = 0b10000000; // TX Bit (7) als Ausgang
USARTC1.CTRLA = 0b00010000; // Interrupt-Level: RX High, alles andere Off
USARTC1.CTRLC = 0b00000011; // Async, NoPar, 1SBit, 8Bit Wortgröße
USARTC1.BAUDCTRLA = 0b00000111; // 7 = 57k6
//USARTD1.BAUDCTRLA = 0b00001011; // 11 = 38k4
//USARTD1.BAUDCTRLA = 0b00010111; // 23 = 19k2
//USARTD1.BAUDCTRLA = 0b00101111; // 47 = 9600 Baud @7,32... Mhz
USARTC1.BAUDCTRLB = 0b00000000; //BSCALe=3x0, 11 hat keine high bits, daher auch 0
USARTC1.CTRLB = 0b00011000; // 000, RX ein, TX ein, Single-Speed, No-Multi, 2xDontCare
#endif
//TIMER PORTD_0 INIT
TCD0.CTRLA = TC_CLKSEL_DIV1_gc; // divide clock by 0, enable Timers
TCD0.PER = 0xFFFF; // set resolution to 16Bit
TCD0.CTRLB = 0xF0 | TC_WGMODE_SS_gc; // enable frequency generation for all 4 Channels
//TIMER PORTD_1 INIT
TCD1.CTRLA = 0x01;
TCD1.PER = 0xFFFF;
TCD1.CTRLB = 0xF3; // Es scheint nichts zu machen, wenn mann Bits für
// Output-Compare setzt, die nicht vorhanden sind.
// Manual schweigt sich darüber aus.
//TIMER PORTC_0 INIT
TCC0.CTRLA = 0x01; // divide clock by 0, enable Timers
TCC0.PER = 0xFFFF; // set resolution to 16Bit
TCC0.CTRLB = 0xF3; // enable frequency generation for all 4 Channels
//TIMER PORTC_1 INIT
TCC1.CTRLA = 0x01; // divide clock by 0, enable Timers
TCC1.PER = 0xFFFF; // set resolution to 16Bit
TCC1.CTRLB = 0xF3; // Es scheint nichts zu machen, wenn mann Bits für
// Output-Compare setzt, die nicht vorhanden sind.
// Manual schweigt sich darüber aus.
//TIMER PORTE_0 INIT
TCE0.CTRLA = 0x01; // divide clock by 0, enable Timers
TCE0.PER = 0xFFFF; // set resolution to 16Bit
TCE0.CTRLB = 0xF3; // enable frequency generation for all 4 Channels
// Interrupts anknipsen
CCP = CCP_IOREG_gc; // Conf.Änderung erlauben
PMIC.CTRL = 0b00000111; // ENABLE high, mid und low level interrupts
// Basisadresse für Kaskadierung auslesen
// Achtung: Zwei gesetzte Jumper = Adresse 3
// würde wegen Jumper->Masse "00" ergeben. Wir
// müssen daher zuerst invertieren, dann maskieren,
// dann shiften.
currentBaseAddress = ~PORTA.IN;
currentBaseAddress &= 0b01100000;
currentBaseAddress >>= 5;
currentBaseAddress *= MAX_CHANNELS_OF_DEVICE;
// Interrupts ein
sei();
while (1) {
_delay_us(10);
if ((resetCounter<0xFF) && (resetCounter>0)) { resetCounter++; }
if (resetCounter == 100) {
//PORTA.OUTSET = 0b00000100;
resetCounter = 0;
currentChannelNumber=0;
}
}
}
Kurz zur Funktionsweise: Nach der Initialisierung der MCU wartet die USART-ISR auf ein ankommendes Byte. Je nach Jumper-Einstellung wird dann die entsprechende Zahl an Kanälen eingelesen, gamma-korrigiert und beim letzten Byte in die gepufferten PWM-Timer-Register übernommen.
Mittels der Hauptschleife habe ich einen Software-Timer realisiert, der eine Millisekunde nach dem letzten Byte den Kanalindex zurücksetzt. Zur Synchronisation wird also die Pause zwischen den Frames benutzt, welche bei 50 Hz ~20ms lang ist. Die Übertragung von 45 Bytes dauert knapp 8ms, damit haben wir also genug Zeit.
Mit dem Define-Statement kann schnell von einem USART zu einem noch freien auf Port C umgeschaltet werden. Ich hatte meinen auf Port D getoastet, nachdem ich beim Messen des USART-Signals am Stecker oben mit der Oszi-Spitze an 12V und das MCU_RX-Signal gekommen bin. Sowohl AVR-USART wie auch MAX3232 haben das nicht überlebt.
Ihr könnt mit dem Oszi an PORTA.3 und 4 Debug-Signale abnehmen: Das eine markiert den Reset des Index-Counters, das andere Beginn und Ende des eingestellten Frames, sollte also bei z.B. Byte 0 angehen und Byte 14 wieder auf 0 fallen.
Wie gesagt, beschämend simpel.
12 Kommentare zu “Ambi-Light 2: 16bit PWM, 5 RGB-Kanäle”
Hallo. Klasse gemacht. Wir überlegen ob wir die Daten nicht per PWM rausschicken, sondern als DMX. Der dmx receiver macht dann den PWM Teil, zB eine PAR oder moving head oder LED rgb light.
Ein Atmel mit dmx zu versehen ist nicht viel arbeit. Jedoch erst mal in dein Code einsteigen. Theoretisch brauche ich nur einen hex Wert zwischen 0 und 255 pro r,g oder b. Also 12 Kanäle( 4 * rgb) Mal sehen wo ich den am besten abgreife. Leider ist mein c nicht besonders gut. Bislang verwende ich nur assembler. Den PWM Teil werde ich dann weg lassen. Noch habe ich dein Code noch nicht mal detailliert angeschaut.
Vielen Dank und mal sehen ob das Projekt was wird.
Fabian & Herman Oving
Hi, Danke. Ich hab nur nicht genau verstanden, was ihr machen wollt? Soll es ein Seriell-zu-DMX-Konverter werden? Da schaut mal unter http://www.mikrocontroller.net, da gibt’s einiges zum Thema. Ziel dieses Projektes sollte ja genau die PWM-Ausgabe sein…
Gibts den kompletten Quellcode auch nochmal zum Runterladen?
Danke
Hi, das versteh ich inhaltlich nicht. Auf Seite drei hast Du den gesamten Quelltext der Firmware. Mehr ist’s nicht. Und für die Sourcen von Boblight mußt Du auf seiner Seite schauen…
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avrxmega2/crtx16a4.o:(.init9+0x0): undefined reference to `main‘
Was mache ich falsch?
alles klar, es war ein dummer Fehler beim Kopieren und Einfügen, ich habe die neueste und vollständige Version eingebaut. Sollte funktionieren… Danke für den Hinweis.
Hallo nochmal.
Ich konnte das Projekt erfolgreich nachbauen! Funktioniert super.
Die Schaltung hat aber imho noch ein Problem: Die Sende- und Empfangsleitung zwischen MAX und dem COM-Anschluß sind gekreuzt.
Darum wird im aktuellen Schaltplan ein Nullmodemkabel zwischen PC und Platine benötigt. Bei der Verwendung eines USB-Serial-Adapters muss das gekreuzte Nullmodemkabel zusätzlich noch eingefügt werden.
Ich würde die Kreuzung auf der Platine entfernen und Stattdessen eine normales Modemkabel verwenden (siehe hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART)
Bei mir funktioniert das ganze mit dem USB-Serial-Wandler problemlos
Danke!
Sehr schön, freut mich, wenn es klappt. Wegen des UART haste Recht. Hintergrund ist, dass ich noch ein paar dieser Kabel mit 5m Länge daheim liegen hatte und dafür das Gerät entworfen habe. Es ist so aber tatsächlich keine saubere Umsetzung. Danke für den Hinweis.
Das einzige, was mir negativ auffällt ist die große Verzögerung. Gerade beim Filmen mit schnellen Farbwechseln ist dies stark zu bemerken. Es sind vielleicht 0.4 Sekunden. Konntes du dieses Delay auch feststellen? Woran liegt das? An der boblight-Software (1.3)? Gibt’s Abhilfe?
Hm, das kann imo an mehreren Dingen liegen:
a) USB2Seriell macht Ärger -> mit reiner HW-Schnittstelle testen.
b) Parameter „proportional“ in der boblight.conf steuert die Farbübergänge. Je größer, desto sanfter.
c) Desktop-Komposition in Vista und 7 aus?
Ansonsten schau Dir das Video an, so tuts bei mir; ich glaube nicht, dass es da Verögerungen gibt. Ich hab auch schon jerry bruckheimer filme gesehen auf dem system, da „klebten“ die LEDs an dem Blitz am Anfang. Sollte also kein Systemfehler sein.
Ich konnte das Problem wesentlich kleiner machen. Das von mir verwendete boblight-X11 kennt einen Parameter -t, mit dem die Abtastzeit eingestellt wird. Standard sind 0.5 Sekunden. Wenn man den Wert kleiner macht reagiert er viel schneller, jedoch braucht er dabei auch ziemlich viel CPU-Leistung.
Etwas Verzögerung bleibt zwar trotzdem noch, damit kann man aber durchaus leben.
Außerdem hoffe ich, dass dies bei der neuen Version von boblight besser wird. Leider kann ich die Entwicklerversion derzeit nicht testen, da boblight-X11 immer mit ner Fehlermeldunng abschmiert (Bug ist reported bei google-code)
Nochmal Feedback.
Hab jetzt doch die neue Version aus dem Google-Code-Repository zum laufen bekommen. Mit dieser Version sind wesentlich kleinere Abtastzeiten möglich. Standardmäßig sind 0.1 Sekungen eingestellt, aber auch 0.05s gehen bei mir problemlos.
Damit ists jetzt endlich so flott, wie von mir erwartet 🙂
Danke!
Einen Kommentar hinterlassen