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