Go Down

Topic: multiple values von processing an arduino senden (Read 2670 times) previous topic - next topic

handyaner

hallo miteinander,

ich möchte per processing eine led steuern. sprich definieren, wie lange sie leuchtet und wie lange sie aus ist.
beim upload auf arduino gab es keine probs. aber die led blinkt nicht

Processing
Code: [Select]
// import the processing serial library
import processing.serial.*;
// and declare an object for our serial port
Serial port;

void setup() {
  // Get the name of the first serial port
  // where we assume the Arduino is connected
  String portName = Serial.list()[0];
  // initialize our serial object with this port
  // and the baud rate of 9600
  port = new Serial(this, portName, 9600);
}

void draw() {     
  int value1 = 2500;
  int value2 = 1000;
 
  // load up all the values into a byte array
  // then send the full byte array out over serial
  // NOTE: This only works for values from 0-255 
  byte out[] = new byte[2];
  out[0] = byte(value1);
  out[1] = byte(value2);
  port.write(out);
}


Arduino
Code: [Select]
int currentValue = 0;
int values[] = {0,0};
int an;
int aus;
int ledPin = 13;

void setup()  {
  Serial.begin(9600);
}


void loop() {   
  if(Serial.available()){
    int incomingValue = Serial.read();
   
    values[currentValue] = incomingValue;

    currentValue++;
    if(currentValue > 1){
      currentValue = 0;
    }
    an = values[0];
    aus = values[1];
    digitalWrite(ledPin, HIGH);
    delay(an);
    digitalWrite(ledPin, LOW);
    delay(aus);

  }
}

pylon

Code: [Select]
void draw() {     
  int value1 = 2500;
  int value2 = 1000;
 
  // load up all the values into a byte array
  // then send the full byte array out over serial
  // NOTE: This only works for values from 0-255 
  byte out[] = new byte[2];
  out[0] = byte(value1);
  out[1] = byte(value2);
  port.write(out);
}


Hast Du schon mal etwas von Datentypen und deren Grösse bzw. Wertebereich gehört? Wenn Du einen Integer-Wert von 1000 einer Byte-Variablen zuweist, die Werte bis max. 255 aufnehmen kann, wirst Du nicht die wahrscheinlich erwartete Reaktion vom System bekommen.
Zudem solltest Du Ganzzahl-Werte, die mehr als ein Byte beanspruchen, explizit in die Network-Byte-Order (http://de.wikipedia.org/wiki/Byte-Reihenfolge) konvertieren, da Du sonst unangenehme Überraschungen erleben könntest.

handyaner

ok vielen dank für deine hilfe.

an sich reichen mir auch dreistellige ziffern.
Code: [Select]
// import the processing serial library
import processing.serial.*;
// and declare an object for our serial port
Serial port;

void setup() {
  // Get the name of the first serial port
  // where we assume the Arduino is connected
  String portName = Serial.list()[0];
  // initialize our serial object with this port
  // and the baud rate of 9600
  port = new Serial(this, portName, 9600);
}

void draw() {     
  int value1 = 250;
  int value2 = 200;


aber trotzdem blinkt die led nicht

pylon

Code: [Select]
void setup() {
  // Get the name of the first serial port
  // where we assume the Arduino is connected
  String portName = Serial.list()[0];
  // initialize our serial object with this port
  // and the baud rate of 9600
  port = new Serial(this, portName, 9600);
}


Ich denke mal, dieser Code ist irgendwoher kopiert. Ist es bei Dir auch wirklich so, dass der Arduino das einzige serielle Gerät ist, das am PC angeschlossen ist? Ich würde den Port mal ausgeben und vergleichen, ob das der selbe Port ist, über welchen Du den Arduino auch programmierst.

KUCKY

#4
Jun 18, 2013, 02:52 pm Last Edit: Jun 19, 2013, 09:53 am by kucky Reason: 1
Ich bin kein Experte, aber ich hatte auch mal das Problem. "Serial.list()[0];" muss nicht immer richtig sein. Versuche doch mal               " port = new Serial(this, "COM5", 9600); "

Gemeint ist der Port mit dem Du auch den Arduino programmierst

LG
Willi

handyaner

mh leider hat das auch nicht geholfen.
selbst wenn ich einen festen wert beim delay angebe blinkt die led nicht
Code: [Select]
int currentValue = 0;
int values[] = {0,0};
int an;
int aus;
int ledPin = 13;

void setup()  {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}


void loop() {   
  if(Serial.available()){
    int incomingValue = Serial.read();
   
    values[currentValue] = incomingValue;

    currentValue++;
    if(currentValue > 1){
      currentValue = 0;
    }
    an = values[0];
    aus = values[1];
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    delay(1000);
  }
}

pylon

Ohne Betrieb auf der seriellen Schnittstelle wird der Code auch nicht aufgerufen. Probier's mal so:

Code: [Select]
void loop() {   
  if(Serial.available()){
    int incomingValue = Serial.read();
   
    values[currentValue] = incomingValue;

    currentValue++;
    if(currentValue > 1){
      currentValue = 0;
    }
    an = values[0];
    aus = values[1];
  }
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

handyaner

ja das weiß ich. deshalb habe ich auch processing mit dem oben genannten code am laufen.
ich dachte, ich probiere es mal mit festen delays probeweise. aber es geht dann auch nicht.
d.h. dann doch im umkehrschluss, dass seriell keine daten ankommen?

pylon

Quote
d.h. dann doch im umkehrschluss, dass seriell keine daten ankommen?


Genau.

Klappt denn das Blinken mit meiner Version überhaupt? Sprich: ist die LED in Ordnung?

Hast Du den Tipp von kucky umgesetzt und den Namen der seriellen Schnittstelle korrekt ersetzt? Welchen verwendest Du?

handyaner

hallo

danke für die hilfe jetzt klappt es :)
Der Port war COM8




Go Up