Boblight + Arduino + ShiftBrite = Ambilight
Ég er alltaf með of mikið að verkefnum í gangi í einu... sérstaklega þegar ég á orðið of mikið af Arduino brettum sem ég hef engin not fyrir.
Ég átti til ca 30 ShiftBrite módúla sem eru RGB LED perur sem hægt er að hlekkja saman með 6-víra köplum. Hver modúll getur haft sér lit í keðjunni og skipt um lit á mjög miklum hraða og hentar því flott fyrir ambilight verkefni.
Svo tengi ég Data, Latch, Enable og Clock beint í PWM pinna á arduino brettinu.
Perurnar virka "basicly" þannig að ég keyri 12V á power vírinn og jörðin tengist í arduino og 12V power supplyið. Arduino sendir svo LOW á Latch og Enable til þess að láta perurnar byrja taka við lita-skilaboðum (sem samanstendur af 10 bitum fyrir hvern lit og svo 2 bita til þess að loka). Svo púlsa ég aftur latch&enable með HIGH/LOW til þess að virkja litina alla í einu. Þetta er að gerast á 16mhz hraða sem er mjög hraðvirkt.
BobLight daemon á XBMC vélinni sendir array af litum yfir á arduino í HEX formatti á 38400bps.
Arduino hlustar og áframsendir skilaboðin í perurnar með þessum kóða:
int datapin = 10; int latchpin = 11; int enablepin = 12; int clockpin = 13; unsigned long SB_CommandPacket; int SB_CommandMode; int SB_BlueCommand; int SB_RedCommand; int SB_GreenCommand; int NumLEDs = 16; void setup() { pinMode(datapin, OUTPUT); pinMode(latchpin, OUTPUT); pinMode(enablepin, OUTPUT); pinMode(clockpin, OUTPUT); digitalWrite(latchpin, LOW); digitalWrite(enablepin, LOW); Serial.begin(38400); } void loop() { SB_CommandMode = B01; SB_RedCommand = 127; SB_GreenCommand = 113; SB_BlueCommand = 113; SB_SendPacket(); WaitForPrefix(); SB_CommandMode = B00; for (int i = 0; i < NumLEDs; i++) { while(!Serial.available()); SB_RedCommand = Serial.read() * 4; while(!Serial.available()); SB_GreenCommand = Serial.read() * 4; while(!Serial.available()); SB_BlueCommand = Serial.read() * 4; SB_SendPacket(); } } void WaitForPrefix() { uint8_t prefix = 0; while (prefix != 0x5A) { while (!Serial.available()); prefix = Serial.read(); } } void SB_SendPacket() { SB_CommandPacket = SB_CommandMode & B11; SB_CommandPacket = (SB_CommandPacket << 10)|(SB_BlueCommand & 1023); SB_CommandPacket = (SB_CommandPacket << 10)|(SB_RedCommand & 1023); SB_CommandPacket = (SB_CommandPacket << 10)|(SB_GreenCommand & 1023); shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 24); shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 16); shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 8); shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket); delay(1); digitalWrite(latchpin, HIGH); delay(1); digitalWrite(latchpin, LOW); }
Ég ætla að fínpússa kóðann og jafnvel henda þessu upp í library og setja á GitHub