Ambilight Arduino Mega WS2801

Guten Abend Leute,

ich bin hier stark am verzweifeln und brauche dringend Hilfe. Bin gerade dabei ein Ambilight zu basteln aber ich komm nicht weiter.

Wenn ich die Datei LED-Stream aus der Adalight Libary auf mein Arduino spiele leuchtet nicht die Testsequenz und über Prismatik bekomme ich auch keine Reaktion zu Stande.

Der LED streifen funktioniert einwandfrei .... (mit anderen Projekten "Strandtest") und Data sowie Clock Pin sind 100 % richtig. Selbst wenn nicht habe ich die auch schon aus verzeweifelung zig ma getauscht.

Irgentwer erfahrung mit dem Problem

Gruß Chris

Und wir dürfen jetzt raten was du da verkehrt machst?

Schaltbild
Sketch
Foto des Aufbaus

Dann können wir weiter machen.

Ja das stimmt natürlich. Ich probier es mal noch ausführlicher.

Vom Prinzip hab ich an Hardware ein Arduino Mega und ein Strip WS2801. Beides ist hinter meinen Bildschirm installiert.
So vom Prinzip her bin ich in der Lage jede LED einzeln anzusteuern und in der gewünschten Farbe Leuchten zu lassen. Daher kann es eigentlich keine falsche Verdrahtung sein meiner Meinung nach nichts Falsch sein.

Sooo, laut meinen Info´s muss ich jetzt nur noch das am Ende geprostete Programm daraufladen und dann mit Prismatik verbinden und fertig. Jedoch scheitert es schon daran das normalerweise wenn folgendes Programm gestartet wird die LED´s nicht in Ihren Grundfarben als "Funktionstest" kurz einmal aufleuchten.

Mir ist jedoch in keinster Weise verständlich wo der Fehler ist. :frowning:

Adalight-master (1).zip (35.3 KB)

Erkläre mal bitte was eine Prismatik ist und wo du das Videosignal herbekommst.

Den Code bitte nicht als Anhang- hier möchte sich niemand nen Schnupfen holen...

An welchem Pin hast du die LEDs angeschlossen?

SPI liegt beim Mega auf anderen Pins...

Ich habe die an 11 und 13 Angeschlossen ....

So wie es in der Adalight Beschreibung drinsteht welche muss ich den nehmen ?

Prismatik ist das Programm was entsprechend den Bildschirm in den Gewünschten Bereichen analysiert und dann über den ComPort den Ardurino ansteuert.

Hier noch einmal das Programm

// Arduino "bridge" code between host computer and WS2801-based digital
// RGB LED pixels (e.g. Adafruit product ID #322). Intended for use
// with USB-native boards such as Teensy or Adafruit 32u4 Breakout;
// works on normal serial Arduinos, but throughput is severely limited.
// LED data is streamed, not buffered, making this suitable for larger
// installations (e.g. video wall, etc.) than could otherwise be held
// in the Arduino's limited RAM.

// Some effort is put into avoiding buffer underruns (where the output
// side becomes starved of data). The WS2801 latch protocol, being
// delay-based, could be inadvertently triggered if the USB bus or CPU
// is swamped with other tasks. This code buffers incoming serial data
// and introduces intentional pauses if there's a threat of the buffer
// draining prematurely. The cost of this complexity is somewhat
// reduced throughput, the gain is that most visual glitches are
// avoided (though ultimately a function of the load on the USB bus and
// host CPU, and out of our control).

// LED data and clock lines are connected to the Arduino's SPI output.
// On traditional Arduino boards, SPI data out is digital pin 11 and
// clock is digital pin 13. On both Teensy and the 32u4 Breakout,
// data out is pin B2, clock is B1. LEDs should be externally
// powered -- trying to run any more than just a few off the Arduino's
// 5V line is generally a Bad Idea. LED ground should also be
// connected to Arduino ground.

// --------------------------------------------------------------------
// This file is part of Adalight.

// Adalight is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.

// Adalight is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.

// You should have received a copy of the GNU Lesser General Public
// License along with Adalight. If not, see
// http://www.gnu.org/licenses/.
// --------------------------------------------------------------------

#include <SPI.h>

#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN _BV(PORTB5)

static const uint8_t magic[] = {'A','d','a'};
#define MAGICSIZE sizeof(magic)
#define HEADERSIZE (MAGICSIZE + 3)

#define MODE_HEADER 0
#define MODE_HOLD 1
#define MODE_DATA 2

static const unsigned long serialTimeout = 15000; // 15 seconds

void setup()
{

uint8_t
buffer[256],
indexIn = 0,
indexOut = 0,
mode = MODE_HEADER,
hi, lo, chk, i, spiFlag;
int16_t
bytesBuffered = 0,
hold = 0,
c;
int32_t
bytesRemaining;
unsigned long
startTime,
lastByteTime,
lastAckTime,
t;

LED_DDR |= LED_PIN; // Enable output for LED
LED_PORT &= ~LED_PIN; // LED off

Serial.begin(115200); // Teensy/32u4 disregards baud rate; is OK!

SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 MHz max, else flicker

// Issue test pattern to LEDs on startup. This helps verify that
// wiring between the Arduino and LEDs is correct. Not knowing the
// actual number of LEDs connected, this sets all of them (well, up
// to the first 25,000, so as not to be TOO time consuming) to red,
// green, blue, then off. Once you're confident everything is working
// end-to-end, it's OK to comment this out and reprogram the Arduino.
uint8_t testcolor[] = { 0, 0, 0, 255, 0, 0 };
for(char n=3; n>=0; n--) {
for(c=0; c<25000; c++) {
for(i=0; i<3; i++) {
for(SPDR = testcolor[n + i]; !(SPSR & _BV(SPIF)); );
}
}
delay(1); // One millisecond pause = latch
}

Serial.print("Ada\n"); // Send ACK string to host

startTime = micros();
lastByteTime = lastAckTime = millis();

// loop() is avoided as even that small bit of function overhead
// has a measurable impact on this code's overall throughput.

for(;:wink: {

// Implementation is a simple finite-state machine.
// Regardless of mode, check for serial input each time:
t = millis();
if((bytesBuffered < 256) && ((c = Serial.read()) >= 0)) {
buffer[indexIn++] = c;
bytesBuffered++;
lastByteTime = lastAckTime = t; // Reset timeout counters
} else {
// No data received. If this persists, send an ACK packet
// to host once every second to alert it to our presence.
if((t - lastAckTime) > 1000) {
Serial.print("Ada\n"); // Send ACK string to host
lastAckTime = t; // Reset counter
}
// If no data received for an extended time, turn off all LEDs.
if((t - lastByteTime) > serialTimeout) {
for(c=0; c<32767; c++) {
for(SPDR=0; !(SPSR & _BV(SPIF)); );
}
delay(1); // One millisecond pause = latch
lastByteTime = t; // Reset counter
}
}

switch(mode) {

case MODE_HEADER:

// In header-seeking mode. Is there enough data to check?
if(bytesBuffered >= HEADERSIZE) {
// Indeed. Check for a 'magic word' match.
for(i=0; (i<MAGICSIZE) && (buffer[indexOut++] == magic[i++]););
if(i == MAGICSIZE) {
// Magic word matches. Now how about the checksum?
hi = buffer[indexOut++];
lo = buffer[indexOut++];
chk = buffer[indexOut++];
if(chk == (hi ^ lo ^ 0x55)) {
// Checksum looks valid. Get 16-bit LED count, add 1
// (# LEDs is always > 0) and multiply by 3 for R,G,B.
bytesRemaining = 3L * (256L * (long)hi + (long)lo + 1L);
bytesBuffered -= 3;
spiFlag = 0; // No data out yet
mode = MODE_HOLD; // Proceed to latch wait mode
} else {
// Checksum didn't match; search resumes after magic word.
indexOut -= 3; // Rewind
}
} // else no header match. Resume at first mismatched byte.
bytesBuffered -= i;
}
break;

case MODE_HOLD:

// Ostensibly "waiting for the latch from the prior frame
// to complete" mode, but may also revert to this mode when
// underrun prevention necessitates a delay.

if((micros() - startTime) < hold) break; // Still holding; keep buffering

// Latch/delay complete. Advance to data-issuing mode...
LED_PORT &= ~LED_PIN; // LED off
mode = MODE_DATA; // ...and fall through (no break):

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;
}
// If serial buffer is threatening to underrun, start
// introducing progressively longer pauses to allow more
// data to arrive (up to a point).
if((bytesBuffered < 32) && (bytesRemaining > bytesBuffered)) {
startTime = micros();
hold = 100 + (32 - bytesBuffered) * 10;
mode = MODE_HOLD;
}
} else {
// End of data -- issue latch:
startTime = micros();
hold = 1000; // Latch duration = 1000 uS
LED_PORT |= LED_PIN; // LED on
mode = MODE_HEADER; // Begin next header search
}
} // end switch
} // end for(;:wink:
}

void loop()
{
// Not used. See note in setup() function.
}

SPI: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS). These pins support SPI communication using the SPI library. The SPI pins are also broken out on the ICSP header, which is physically compatible with the Arduino /Genuino Uno and the old Duemilanove and Diecimila Arduino boards.

http://www.arduino.cc/en/Main/ArduinoBoardMega2560

MaHa76:
Erkläre mal bitte was eine Prismatik ist und wo du das Videosignal herbekommst.

Das würde mich auch interessieren.

"Ambilight" kannte ich noch nicht...

hi,

ggogel mal nach enigma ambilight und geh auf videos.

zb.: Ambilight SEDU Board + Vu+ Solo2 + 60" TV - YouTube

wie der TO es macht, kann man nur videos vom PC so ansehen, mit einem linux-receiver jeden film.

gruß stefan

Hallo,

Die Anleitung von Adafruit funktioniert nur mit dem Uno.
Beim Mega musst die SPI Verdrahtung anpassen.
Bei Prismatik Setup durchführen und passt. Leider sehr "Effektlastig".

Weitaus besser gehts mit Processing, anpassbar für jeden Geschmack.
Playclaw läuft auch Problemlos und erzeugt beim abspielen von Soundtracks "Lichtorgelflackern".

mfg Martin

Eisebaer:
hi,

ggogel mal nach enigma ambilight und geh auf videos.

zb.: https://www.youtube.com/watch?v=c0NqYTQv4Yc

wie der TO es macht, kann man nur videos vom PC so ansehen, mit einem linux-receiver jeden film.

gruß stefan

Also nix mit TV & Ambilight?!

hi,

Also nix mit TV & Ambilight?!

was meinst Du damit? mit dem richtigen sat-receiver kannste es machen...

gruß stefan

Sorry, ich hab's noch nicht kapiert:

Also ich habe einen Samsung TV mit TrippleTuner und Schüssel dran.

Anschlüsse: USB, Netzwerk, HDMI

Von welchem Anschluß bekommt der UNO seine Infos? :o

Hallo,

Ambilight mit dem UNO braucht einen PC der die Daten aufbereitet.
Der UNO arbeitet nur als SPI-Controller für die LED´s.

Am TV gehts mit einem HDMI2AV Converter und einem USB VideoGrabber.
Bei mehreren Geräten ( Konsole / BlueRay..) brauchts noch einen Splitter.
Die Bilddaten werden einem Raspi gefüttert, der mittels Hyperion die LED´s steuert.

Ein Raspi B als Multimediacenter (Kodi / Hyperion) geht auch gut, bei HD Wiedergabe läuft das
System ständig unter Vollast.

mfg Martin

hi,

Ambilight mit dem UNO braucht einen PC der die Daten aufbereitet.

nicht unbedingt.

mit einem sat (oder kabel) - receiver wie meiner dreambox oder einer VU+ geht es direkt. mit den sat - tunern im fernserer natürlich nicht, da muß man umwege gehen.

gruß stefan

Es wäre Knorke, wenn es eine Möglichkeit gäbe, jedes HDMI-Signal dafür abzugreifen.

hi,

geht auch, wenn Du die geräte an eine heimkino-anlage angeschlossen hast. da gehst Du ja nur mit einem kabel zum TV und dort greifst Du ab.

wenn Du den internen tuner des TV verwendest, sehe ich schwarz... obwohl hier mal die rede davon war, daß das signal am scart rausgeschliffen wird. bin da aber nicht sicher.

gruß stefan