Forum: Mikrocontroller und Digitale Elektronik Value >255 von Processing zum Ardu und zurück


von Ruediger (Gast)


Lesenswert?

Guten Tag die Herrschaften,

ich versuche gerade eine Kommunikation zwischen Arduino und Processing 
herzustellen.
Processing liest ja recht einfach Daten vom Seriellen Port, nur leider 
will der Ardu nicht das lesen was vom Processing kommt.

Ich glaube irgendwas mache ich falsch mit dem Handling der "Datentypen".
Soweit ich das verstanden hab wird "port.write" nur Werte bis 255 auf 
den Port schicken.

Zum Code:
Ein einfacher Slider in Processing soll seinen Wert an den Ardu 
schicken, dort will ich den Sliderwert später zum einstellen eines 
Schwellwertes nutzen.
Mittels Funktionsprüfung soll einfach nur die LED 13 an/aus gehen.


Arudo-Code:
1
#define PIN13 13
2
int val;
3
void setup() 
4
{
5
  Serial.begin(9600);  
6
  pinMode(PIN13, OUTPUT);
7
}
8
9
10
void loop() {  
11
 // if(Serial.available() )
12
 // {
13
    val = Serial.read();
14
    Serial.println(val);
15
    
16
    
17
 //}
18
19
  if (val > 512)
20
  { 
21
    digitalWrite(PIN13, HIGH); // turn the LED on
22
  }
23
  else
24
  {
25
    digitalWrite(PIN13, LOW); // Otherwise turn it OFF
26
  }
27
  /*
28
  // read all analog ports, split by " " // adjust i<2 --> to is the amount of scanned analog port
29
   for (int i=0;i<2;i++){
30
   Serial.print(analogRead(i));
31
   Serial.print(" ");
32
   }
33
   */
34
  // frame is marked by Linefeed
35
  //Serial.println();
36
  //Serial.print (val);
37
}


Processing Code:
1
import processing.serial.*;
2
import controlP5.*;
3
4
Serial myPort;
5
int val;
6
7
ControlP5 cp5;
8
int myColor = color(0, 0, 0);
9
10
int sliderValue = 100;
11
int sliderValueOld = 100;
12
13
Slider abc;
14
15
void setup() {
16
17
  String portName = Serial.list()[1];
18
  myPort = new Serial(this, portName, 9600);
19
  myPort.bufferUntil('\n');
20
  size(700, 400);
21
  noStroke();
22
  cp5 = new ControlP5(this);
23
24
  // add a horizontal sliders, the value of this slider will be linked
25
  // to variable 'sliderValue' 
26
  cp5.addSlider("sliderValue")
27
    .setPosition(100, 50)
28
      .setSize(20, 100)
29
        .setRange(0, 1024)
30
          ;
31
}
32
33
void draw() {
34
  //background(sliderTicks1);
35
36
  fill(map(sliderValue,0,1024,0,255));
37
  rect(0, 0, width, 200);
38
39
  if (sliderValue != sliderValueOld)
40
  {
41
    sliderValueOld = sliderValue;
42
    println(sliderValue);
43
    
44
    if ( myPort.available() > 0) // If data is available,
45
    {
46
    sliderValue = sliderValue;  
47
    myPort.write(sliderValue);
48
49
    delay(100);
50
    int inVal = myPort.read();
51
    println(inVal);
52
      }
53
    }
54
  }

Beim Printen von "inVal" gibt Processing aber nur "0" aus.
Wie und an welcher Stelle muß ich die Datentypen aneinander anpassen?

von Karl H. (kbuchegg)


Lesenswert?

Ruediger schrieb:

> Ich glaube irgendwas mache ich falsch mit dem Handling der "Datentypen".
> Soweit ich das verstanden hab wird "port.write" nur Werte bis 255 auf
> den Port schicken.´

Ganz genau.
Dieser read() bzw. write() Methoden, übrtragen nur jeweils 1 Byte.
Nur weil es dir erlaubt ist, da jeweils einen int (16 Bit) zu benutzen, 
heisst das noch lange nicht, dass da auch 16 Bit übertragen werden.

> Wie und an welcher Stelle muß ich die Datentypen aneinander anpassen?

So einfach ist die Sache nicht.
16 Bit überträgt man, in dem man 2 mal jeweils 8 Bit überträgt.

Nur: woher weiß der Empfänger welches das 1. Byte ist und welches das 
2.te? (Gemeint ist die Reihenfolge. Der Empfänger bekommt Byte auf Byte 
aus der Seriellen raus. Welches ist das jeweils 1. und welches das 2.?)

Und genau an dieser Stelle beginnt das Ganze interessant zu werden und 
du betrittst das Reich der sog. 'Übertragungsprotokolle', die unter 
anderem genau diese Dinge regeln.

von Ruediger (Gast)


Lesenswert?

Ahoi,

Danke für die "Stichworte", bei der Gelegenheit konnte ich direkt 
nochmal üben wie man Funktionen schreibt.
Großer Teil ist leider CopyPaste, aber ich steig einigermaßen durch.

Hier mal der Code.

Ardu:
1
// BinaryDataFromProcessing
2
// Diese Definitionen mu¨ssen denen des Senders entsprechen:
3
const char HEADER = 'H';
4
const char SLIDER_TAG = 'S';
5
const char MOUSE_TAG = 'M';
6
const int TOTAL_BYTES = 6 ; // Gesamtgro¨ße der Nachricht
7
int schwelle = 0;
8
int schwellealt = 0;
9
int ledPin = 13;
10
11
void setup()
12
{
13
  Serial.begin(9600);
14
  pinMode(ledPin, OUTPUT); 
15
16
}
17
void loop(){
18
  Serialpost();  
19
  halbeschwelle();
20
}
21
22
void halbeschwelle(){
23
  if (schwelle >= 512)
24
  { 
25
    //Serial.println("LED AN");
26
    digitalWrite(ledPin, HIGH); // turn the LED on
27
  }
28
  else
29
  {
30
  //  Serial.println("LED AUS");
31
    digitalWrite(ledPin, LOW); // Otherwise turn it OFF
32
  }
33
}
34
35
void Serialpost(){
36
  if ( Serial.available() >= TOTAL_BYTES)
37
  {
38
    if( Serial.read() == HEADER)
39
    {
40
      char tag = Serial.read();
41
      if(tag == MOUSE_TAG)
42
      {
43
        int x = Serial.read() * 256;
44
        x = x + Serial.read();
45
46
        int y = Serial.read() * 256;
47
        y = y + Serial.read();
48
        Serial.print("Maus-Nachricht empfangen, x = ");
49
        Serial.print(x);
50
        Serial.print(", y = ");
51
        Serial.println(y);
52
      }
53
      else if(tag == SLIDER_TAG)
54
      {
55
        int x = Serial.read() * 256;
56
        x = x + Serial.read();
57
        schwelle = x;
58
        int y = Serial.read() * 256;
59
        y = y + Serial.read();
60
        schwellealt = y;
61
        Serial.print("Slider-Wert wurde geändert, Neu = ");
62
        Serial.print(x);
63
        Serial.print(", ALT = ");
64
        Serial.println(y);
65
      }
66
      else
67
      {
68
        Serial.print("Unbekannter Tag in Nachricht: ");
69
        Serial.write(tag);
70
      }
71
    }
72
  }
73
}

Processing:
1
import processing.serial.*;
2
import controlP5.*;
3
Serial myPort;
4
public static final char HEADER = 'H';
5
public static final char SLIDER_TAG = 'S';
6
public static final char MOUSE_TAG = 'M';
7
int val;
8
ControlP5 cp5;
9
int myColor = color(0, 0, 0);
10
int sliderValue = 100;
11
int sliderValueOld = 100;
12
13
Slider abc;
14
15
void setup() {
16
17
  String portName = Serial.list()[1];
18
  myPort = new Serial(this, portName, 9600);
19
  //myPort.bufferUntil('\n');
20
  size(700, 400);
21
  noStroke();
22
  cp5 = new ControlP5(this);
23
24
  // add a horizontal sliders, the value of this slider will be linked
25
  // to variable 'sliderValue' 
26
  cp5.addSlider("sliderValue")
27
    .setPosition(100, 50)
28
      .setSize(20, 100)
29
        .setRange(0, 1024);
30
}
31
32
void draw() {
33
34
  fill(map(sliderValue, 0, 1024, 0, 255));
35
  rect(0, 0, width, 200);
36
  SliderValueChanged ();
37
}
38
39
void SliderValueChanged () {
40
  if (sliderValue != sliderValueOld)
41
  {
42
    sendMessage(SLIDER_TAG, sliderValue, sliderValueOld);
43
    sliderValueOld = sliderValue;
44
  }
45
}
46
47
void mousePressed() {
48
  sendMessage(MOUSE_TAG, mouseX, mouseY);
49
}
50
void serialEvent(Serial p) {
51
  // handle incoming serial data
52
  String inString = myPort.readStringUntil('\n');
53
  if (inString != null) {
54
    print( inString ); // Textstring vom Arduino ausgeben
55
  }
56
}
57
58
void sendMessage(char tag, int x, int y) {
59
  // Sende gegebenen Tag und Wert an seriellen Port
60
  myPort.write(HEADER);
61
  myPort.write(tag);
62
  myPort.write((char)(x / 256)); // MSB
63
  myPort.write(x & 0xff); //LSB
64
  myPort.write((char)(y / 256)); // MSB
65
  myPort.write(y & 0xff); //LSB
66
}

Schöne Sache :D
Nun muß ich nur noch meine Sensordaten ans Proc schicken und 
visualiersieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.