Go Down

Topic: Licht auf bestimmte Musik !!! (Read 7 times) previous topic - next topic

lgrube96


Ok, wenn es nur die Reihenfolge der Lampen ist, dann ist es vermutlich kein elektrisches Problem. Dann poste doch mal Deinen Code. Bitte verwende dabei die "#" Tags (Insert Code - oben in der Editorleiste). Vermutlich stimmt nur irgendwie die Zuordnung der Pins nicht ganz.


Hier der Code:

Code: [Select]


// Output
int Chan1 = 22; 
int Chan2 = 24; 
int Chan3 = 26; 
int Chan4 = 28; 
int Chan5 = 30; 
int Chan6 = 32;
int Chan7 = 34;
int Chan8 = 36;


int i = 0;     // Loop counter
int incomingByte[7];   // array to store the 7 values from the serial port

//setup the pins/ inputs & outputs
void setup()
{
  Serial.begin(9600);        // set up Serial at 9600 bps

  pinMode(Chan1, OUTPUT);   // sets the pins as output
  pinMode(Chan2, OUTPUT);
  pinMode(Chan3, OUTPUT);
  pinMode(Chan4, OUTPUT);
  pinMode(Chan5, OUTPUT);
  pinMode(Chan6, OUTPUT);
  pinMode(Chan7, OUTPUT);
  pinMode(Chan8, OUTPUT);
 
 
}

void loop()
{  // 7 channels are coming in to the Arduino
   if (Serial.available() >= 7) {
    // read the oldest byte in the serial buffer:
    for (int i=0; i<8; i++) {
      // read each byte
      incomingByte[i] = Serial.read();
    }
   
    analogWrite(Chan1, incomingByte[0]);   // Write current values to LED pins
    analogWrite(Chan2, incomingByte[1]);   
    analogWrite(Chan3, incomingByte[2]);   
    analogWrite(Chan4, incomingByte[3]);   
    analogWrite(Chan5, incomingByte[4]);   
    analogWrite(Chan6, incomingByte[5]);
    analogWrite(Chan7, incomingByte[6]);
    analogWrite(Chan8, incomingByte[7]);
   
   
   
   }
   
}



Der Code sollte jetzt die 8 LEDs vernünftig schalten, aber da gibt es halt irgendein problem !?

mkl0815

Ich vermute mal, Dein Problem ist das
Code: [Select]

if (Serial.available() >= 7)

Damit wird schon aus dem Serial-Puffer gelesen, wenn erst 7 der 8 Channels übertragen wurden. Damit bleibt das 8 Byte im Puffer und wird beim nächsten Durchlauf als erstes Byte also für Channel 1 gelesen. Damit verschiebt sich Deine Sequenz um genau 1 Byte pro Durchlauf.
Ein weiterer Fehler, der sich aktuell zwar nicht auswirkt, aber später Probleme machen kann ist, das Dein Array zu klein ist.
Ein
Code: [Select]

int incomingByte[7];

Erzeugt ein Array mit 7 Einträgen, nicht mit 8. Eigentlich könntest Du nur von incomingByte[0] bis incomingByte[6] darauf zugreifen. Das Du incomingByte[7] verwendet kannst, liegt einfach nur daran das der Arduino kein Memory-Protection hat. Da der Compiler aber nicht weiss, das Du ein Byte mehr an Speicher verwendest, kann es sein das auf diesem Byte bereits wieder Daten einer anderen Variable im Speicher liegen und Du damit plötzlich deren Wert veränderst, wenn Du ein incomingByte[7]=xxx machst.

lgrube96


Ich vermute mal, Dein Problem ist das
Code: [Select]

if (Serial.available() >= 7)

Damit wird schon aus dem Serial-Puffer gelesen, wenn erst 7 der 8 Channels übertragen wurden. Damit bleibt das 8 Byte im Puffer und wird beim nächsten Durchlauf als erstes Byte also für Channel 1 gelesen. Damit verschiebt sich Deine Sequenz um genau 1 Byte pro Durchlauf.
Ein weiterer Fehler, der sich aktuell zwar nicht auswirkt, aber später Probleme machen kann ist, das Dein Array zu klein ist.
Ein
Code: [Select]

int incomingByte[7];

Erzeugt ein Array mit 7 Einträgen, nicht mit 8. Eigentlich könntest Du nur von incomingByte[0] bis incomingByte[6] darauf zugreifen. Das Du incomingByte[7] verwendet kannst, liegt einfach nur daran das der Arduino kein Memory-Protection hat. Da der Compiler aber nicht weiss, das Du ein Byte mehr an Speicher verwendest, kann es sein das auf diesem Byte bereits wieder Daten einer anderen Variable im Speicher liegen und Du damit plötzlich deren Wert veränderst, wenn Du ein incomingByte[7]=xxx machst.



Vielen dank !
Nur ich weiß nicht genau wie ich das problem lösen kann und ob man es überhaupt lösen kann....im moment fällt mir noch nichts passendes ein ! -_-
Hättest du da zufällig eine lösung. ?

uwefed

Wie wärs wenn Du statt 7 eine 8 schreibst?
Grüße Uwe

mkl0815

Quote
Nur ich weiß nicht genau wie ich das problem lösen kann und ob man es überhaupt lösen kann....im moment fällt mir noch nichts passendes ein !

Das verstehe ich nicht ganz, Du hast doch das Beispiel auf die 8 LEDs erweitert, nur lediglich vergessen an allen Stellen den Code auf 8 LEDs zu erweitern.
Die Stelle
Code: [Select]
if (Serial.available() >= 7)
fragt ab, ob bereits 7 Bytes für 7 Channels im seriellen Puffer liegen. Was muss man wohl machen, wenn man statt 7 nun 8 Channel hat und daher warten will, bis 8 Bytes für 8 Channel im Puffer liegen?
Ebenso das Array
Code: [Select]
int incomingByte[7];
das für 7 Byte definiert wird. Was muss ich wohl machen, damit ich ein Array für 8 Bytes definiere?

lgrube96

#20
Apr 07, 2012, 01:10 pm Last Edit: Apr 07, 2012, 01:20 pm by lgrube96 Reason: 1

Quote
Nur ich weiß nicht genau wie ich das problem lösen kann und ob man es überhaupt lösen kann....im moment fällt mir noch nichts passendes ein !

Das verstehe ich nicht ganz, Du hast doch das Beispiel auf die 8 LEDs erweitert, nur lediglich vergessen an allen Stellen den Code auf 8 LEDs zu erweitern.
Die Stelle
Code: [Select]
if (Serial.available() >= 7)
fragt ab, ob bereits 7 Bytes für 7 Channels im seriellen Puffer liegen. Was muss man wohl machen, wenn man statt 7 nun 8 Channel hat und daher warten will, bis 8 Bytes für 8 Channel im Puffer liegen?
Ebenso das Array
Code: [Select]
int incomingByte[7];
das für 7 Byte definiert wird. Was muss ich wohl machen, damit ich ein Array für 8 Bytes definiere?



Ja das hab ich ja schon löngst ausprobiert funktioniert aber nicht !? -_-
Deswegen weiß ich nciht ob man das überhaupt lösen kann ?!

der Code würde ja dann so aussehen:

Code: [Select]
// Output
int Chan1 = 22; 
int Chan2 = 24; 
int Chan3 = 26; 
int Chan4 = 28; 
int Chan5 = 30; 
int Chan6 = 32;
int Chan7 = 34;
int Chan8 = 36;


int i = 0;     // Loop counter
int incomingByte[8];   // array to store the 8 values from the serial port

//setup the pins/ inputs & outputs
void setup()
{
  Serial.begin(9600);        // set up Serial at 9600 bps

  pinMode(Chan1, OUTPUT);   // sets the pins as output
  pinMode(Chan2, OUTPUT);
  pinMode(Chan3, OUTPUT);
  pinMode(Chan4, OUTPUT);
  pinMode(Chan5, OUTPUT);
  pinMode(Chan6, OUTPUT);
  pinMode(Chan7, OUTPUT);
  pinMode(Chan8, OUTPUT);
 
 
}

void loop()
{  // 7 channels are coming in to the Arduino
   if (Serial.available() >= 8) {
    // read the oldest byte in the serial buffer:
    for (int i=0; i<9; i++) {
      // read each byte
      incomingByte[i] = Serial.read();
    }
   
    analogWrite(Chan1, incomingByte[0]);   // Write current values to LED pins
    analogWrite(Chan2, incomingByte[1]);   
    analogWrite(Chan3, incomingByte[2]);   
    analogWrite(Chan4, incomingByte[3]);   
    analogWrite(Chan5, incomingByte[4]);   
    analogWrite(Chan6, incomingByte[5]);
    analogWrite(Chan7, incomingByte[6]);
    analogWrite(Chan8, incomingByte[7]);
   
   
   
   }
   
}

lgrube96


Wie wärs wenn Du statt 7 eine 8 schreibst?
Grüße Uwe


Funktioniert leider nicht ! Hab ich auch gedacht aber funktioniert aus irgendeinem grund nciht !?

mkl0815

Es wäre aber z.B. gut zu wissen, das Du das bereits probiert hast. Wie sollen wir Dir effektiv helfen, wenn wir raten müssen.
Wenn Du den Code schon bereinigt hast, würde ich eher auf ein Problem bei der übermittelten Sequenz vermuten. Da ich das Protokoll nicht kenne, kann ich dazu aber nicht viel schreiben.
Leider ist das debugging hier ein wenig schwierig, da die serielle Verbindung die man normalerweise für Ausgaben verwendet, bereits blockiert ist. Schau Dir daher evtl. nochmal genau die definierten Channels und Sequenzen im Vixen an, vielleicht steckt da ja ein kleiner Fehler drin. (Channel vertauscht o.ä.)
Der Code sieht aus meiner Sicht zumindest erstmal sauber aus.

uwefed


Code: [Select]
...
void loop()
{  // 7 channels are coming in to the Arduino
  if (Serial.available() >= 8) {
   // read the oldest byte in the serial buffer:
   for (int i=0; i<9; i++) {
     // read each byte
     incomingByte[i] = Serial.read();
   }    
  }  
}



MIt " for (int i=0; i<9; i++) {" liest Du aber 9 Byte ein nicht 8 und hast einen Array-Überlauf.

Grüße Uwe

lgrube96

#24
Apr 07, 2012, 01:32 pm Last Edit: Apr 07, 2012, 01:36 pm by lgrube96 Reason: 1

Es wäre aber z.B. gut zu wissen, das Du das bereits probiert hast. Wie sollen wir Dir effektiv helfen, wenn wir raten müssen.
Wenn Du den Code schon bereinigt hast, würde ich eher auf ein Problem bei der übermittelten Sequenz vermuten. Da ich das Protokoll nicht kenne, kann ich dazu aber nicht viel schreiben.
Leider ist das debugging hier ein wenig schwierig, da die serielle Verbindung die man normalerweise für Ausgaben verwendet, bereits blockiert ist. Schau Dir daher evtl. nochmal genau die definierten Channels und Sequenzen im Vixen an, vielleicht steckt da ja ein kleiner Fehler drin. (Channel vertauscht o.ä.)
Der Code sieht aus meiner Sicht zumindest erstmal sauber aus.


Nein ich hab das kurz bevor du dein post gepostet hast ausprobiert deswegen konnte ich das auch nicht so schnell da posten ! tut mir leid !
Ok ich werd mir das protokoll mal anschauen und gucken was ich machen kann.
Ansonsten vielen dank nochmal...
wenn ich noch fragen hab meld ich mich...

mkl0815

Quote
MIt " for (int i=0; i<9; i++) {" liest Du aber 9 Byte ein nicht 8 und hast einen Array-Überlauf.

Gut aufgepasst Uwe :-)
Der Punkt im neuen Code war mir gar nicht aufgefallen, da er ja vorher schon richtig war und erst im neuen Code falsch. :-)
Anstatt ein Byte zuwenig zu lesen, wird nun ein Byte zuviel gelesen, das dann noch nicht mal verwendet wird.
Zumindest sollte sich aber die Blinksequenz geändert haben. ;-)

Achso, das wäre im übrigen eine "einfache" Methode zum debuggen. Erzeuge eine Sequenz in Vixen die immer nur eine LED eine Sekunde schaltet. Die Sequenz sollte bei der ersten LED starten und bis zur letzten durchlaufen. Anhand der "fehlenden" LEDs die nicht leuchten, kann man dann zumindest vermuten wo ein Fehler sein könnte. Nicht schön, aber besser als nix.

lgrube96



Code: [Select]
...
void loop()
{  // 7 channels are coming in to the Arduino
  if (Serial.available() >= 7) {
   // read the oldest byte in the serial buffer:
   for (int i=0; i<8; i++) {
     // read each byte
     incomingByte[i] = Serial.read();
   }    
  }  
}



MIt " for (int i=0; i<9; i++) {" liest Du aber 9 Byte ein nicht 8 und hast einen Array-Überlauf.

Grüße Uwe


ich dachte ich müsste das auch ändern weil der code für 7 LEDs ja so aussieht:
Code: [Select]

// Output
int Chan1 = 22; 
int Chan2 = 24; 
int Chan3 = 26; 
int Chan4 = 28; 
int Chan5 = 30; 
int Chan6 = 32;
int Chan7 = 34;



int i = 0;     // Loop counter
int incomingByte[7];   // array to store the 7 values from the serial port

//setup the pins/ inputs & outputs
void setup()
{
  Serial.begin(9600);        // set up Serial at 9600 bps

  pinMode(Chan1, OUTPUT);   // sets the pins as output
  pinMode(Chan2, OUTPUT);
  pinMode(Chan3, OUTPUT);
  pinMode(Chan4, OUTPUT);
  pinMode(Chan5, OUTPUT);
  pinMode(Chan6, OUTPUT);
  pinMode(Chan7, OUTPUT);
 
 
 
}

void loop()
{  // 7 channels are coming in to the Arduino
   if (Serial.available() >= 8) {
    // read the oldest byte in the serial buffer:
    for (int i=0; i<8; i++) {
      // read each byte
      incomingByte[i] = Serial.read();
    }
   
    analogWrite(Chan1, incomingByte[0]);   // Write current values to LED pins
    analogWrite(Chan2, incomingByte[1]);   
    analogWrite(Chan3, incomingByte[2]);   
    analogWrite(Chan4, incomingByte[3]);   
    analogWrite(Chan5, incomingByte[4]);   
    analogWrite(Chan6, incomingByte[5]);
    analogWrite(Chan7, incomingByte[6]);
   
   
   
   
   }
   
}


und dann dachte ich, wenn man die 7 zu einer 8 umändert dann muss man die 8 auch dort einen erhöhen ! :D

danke dafür ! aber es ändert sich leider nichts !

lgrube96

#27
Apr 07, 2012, 01:54 pm Last Edit: Apr 07, 2012, 01:59 pm by lgrube96 Reason: 1

Quote
MIt " for (int i=0; i<9; i++) {" liest Du aber 9 Byte ein nicht 8 und hast einen Array-Überlauf.

Gut aufgepasst Uwe :-)
Der Punkt im neuen Code war mir gar nicht aufgefallen, da er ja vorher schon richtig war und erst im neuen Code falsch. :-)
Anstatt ein Byte zuwenig zu lesen, wird nun ein Byte zuviel gelesen, das dann noch nicht mal verwendet wird.
Zumindest sollte sich aber die Blinksequenz geändert haben. ;-)

Achso, das wäre im übrigen eine "einfache" Methode zum debuggen. Erzeuge eine Sequenz in Vixen die immer nur eine LED eine Sekunde schaltet. Die Sequenz sollte bei der ersten LED starten und bis zur letzten durchlaufen. Anhand der "fehlenden" LEDs die nicht leuchten, kann man dann zumindest vermuten wo ein Fehler sein könnte. Nicht schön, aber besser als nix.


Es funktioniert aber leider immer noch nicht und es hat sich auch nichts an der blinksequenz geändert.

ja mit der "einfachen" methode könnte ich das mal testen...mal schauen was dabei rauskommt ;)

so hab das mal gerade fix ausprobiert, aber es gibt keine gute nachricht:
keine einzige led geht in der richtigen rheinfolge an !

mkl0815

Dann hast Du ein grundsätzliches Problem. Tritt das nur auf, wenn Du mehr als 7 LEDs betreibst, oder ist es egal wieviele LEDs angesteuert werden.
Um dem Problem auf die Schliche zu kommen, würde ich schrittweise vorgehen.
Also erstmal nur eine einzige LED ansteuern mit einer bestimmten Blinksequenz, die Du auch prüfen kannst. (z.b. 1 sekunde an, 1 sekunde aus, 0,5 sekunden an, 0.5 sekunden aus -> langes blinken, kurzes blinken)
Dann siehst Du, das die Sequenz korrekt übertragen wird. Das Ganze dann mit unterschiedlichen LEDs und Channel probieren. Wenn das einzeln auf allen Channels klappt, dann mit 2 LEDs weitermachen.

lgrube96


Dann hast Du ein grundsätzliches Problem. Tritt das nur auf, wenn Du mehr als 7 LEDs betreibst, oder ist es egal wieviele LEDs angesteuert werden.
Um dem Problem auf die Schliche zu kommen, würde ich schrittweise vorgehen.
Also erstmal nur eine einzige LED ansteuern mit einer bestimmten Blinksequenz, die Du auch prüfen kannst. (z.b. 1 sekunde an, 1 sekunde aus, 0,5 sekunden an, 0.5 sekunden aus -> langes blinken, kurzes blinken)
Dann siehst Du, das die Sequenz korrekt übertragen wird. Das Ganze dann mit unterschiedlichen LEDs und Channel probieren. Wenn das einzeln auf allen Channels klappt, dann mit 2 LEDs weitermachen.



Also bei 7 leds funktioniert noch alles einwandfrei jedoch wenn ich dann 8 anschließe dann spielen alle leds verrückt !
Und das mit dem durchspielen jeder led hab ich mal gerade gemacht (mit 8leds) ,aber das problem is halt keine einzige led geht so an wie man es festgelegt hat !
Ist schon irgendwie merkwürdig ?!

Go Up