Pages: 1 [2] 3 4   Go Down
Author Topic: Licht auf bestimmte Musik !!!  (Read 5336 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

// 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 !?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich vermute mal, Dein Problem ist das
Code:
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:
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.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich vermute mal, Dein Problem ist das
Code:
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:
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. ?
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
int incomingByte[7];
das für 7 Byte definiert wird. Was muss ich wohl machen, damit ich ein Array für 8 Bytes definiere?
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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:
// 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]);
   
   
   
   }
   
}
« Last Edit: April 07, 2012, 06:20:27 am by lgrube96 » Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
...
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
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
« Last Edit: April 07, 2012, 06:36:09 am by lgrube96 » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
...
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:
// 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 ! smiley-grin

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

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

so hab das mal gerade fix ausprobiert, aber es gibt keine gute nachricht:
keine einzige led geht in der richtigen rheinfolge an !
« Last Edit: April 07, 2012, 06:59:44 am by lgrube96 » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 2
Posts: 285
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?!
Logged

Pages: 1 [2] 3 4   Go Up
Jump to: