Multiple consecutive values โ€‹โ€‹from arduino to processing?

I have a little problem.

I transmit information from a 3-axis accelerometer + 3-axis magnetometer + compass attached to the arduino. They scale to midi ranges (0-127).

ARDUINO: This is transmitted in serial printing in the format 76a45b120c23d12e23f34g

Serial.print(shiftAx); Serial.print("a"); Serial.print(shiftAy); Serial.print("b"); Serial.print(shiftAz); Serial.print("c"); Serial.print(shiftMx); Serial.print("d"); Serial.print(shiftMy); Serial.print("e"); Serial.print(shiftMz); Serial.print("f"); Serial.print(shiftHead); Serial.print("g"); 

I see how this works using my serial monitor. (however, I'm not sure if I printed it as println on "g" or not.)

PROCESSING 2:

I buffer until g in my void () setting

 port = new Serial(this, "/dev/tty.usbmodem411", 9600); port.bufferUntil('g'); 

i has a function

  void serialEvent (Serial port) { data = port.readStringUntil('g'); AxVal = data.substring(0, data.indexOf('a')); AyVal = data.substring(data.indexOf("a") + 1, data.indexOf("b")); AzVal = data.substring(data.indexOf("b") + 1, data.indexOf("c")); MxVal = data.substring(data.indexOf("c") + 1, data.indexOf("d")); MyVal = data.substring(data.indexOf("d") + 1, data.indexOf("e")); MzVal = data.substring(data.indexOf("e") + 1, data.indexOf("f")); HeadVal = data.substring(data.indexOf("f") + 1, data.indexOf("g")); } 

PROBLEM So this will not work. The text is not displayed. (just fill it (), text ())

I do not understand why. Is the problem my protocol (if I can call it), how do I unpack a string? Or some other problem.

I am very confused.

I can make it work with only two values, as in this tutorial

Notes: The arduino main circuit is on hold (100); arduino has a speed of 9600 baud.

Attach all sketches, if necessary, to help me, which I will provide my thanks in advance.

CODE:

TREATMENT

 import themidibus.*; //Import the library import javax.sound.midi.MidiMessage; //Import the MidiMessage classes http://java.sun.com/j2se/1.5.0/docs/api/javax/sound/midi/MidiMessage.html import javax.sound.midi.SysexMessage; import javax.sound.midi.ShortMessage; import processing.serial.*; MidiBus myBus; // The MidiBus Serial port; String AxVal = " ", AyVal = " ", AzVal = " "; String MxVal = " ", MyVal = " ", MzVal = " "; String HeadVal = " "; String AxString="Ax",AyString = "Ay",AzString = "Az"; String MxString="Mx",MyString = "My",MzString = "Mz"; String HeadString="Heading"; String data = " "; PFont font; int status_byte = 0xB0; // send control change int channel_byte = 0; // On channel 0 int first_byte; // cc number; int second_byte; // value void setup() { size(1000,500); port = new Serial(this, "/dev/tty.usbmodem411", 9600); port.bufferUntil('g'); font = loadFont("NanumBrush-48.vlw"); textFont(font, 48); MidiBus.list(); // List all available Midi devices on STDOUT. This will show each device index and name. myBus = new MidiBus(this, 1, 0); // Create a new MidiBus object } void draw() { background(0,0,0); //first_byte = 1; //second_byte = int(AxVal); // But with less velocity //myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte); fill(46, 209, 2); text(AxVal, 60, 75); text(AxString, 60, 125); //first_byte = 2; //second_byte = int(AyVal); // But with less velocity //myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte); fill(0, 160, 153); text(AyVal, 120, 75); text(AyString,120,125); // first_byte = 3; //second_byte = int(AzVal); // But with less velocity //myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte); fill(0, 160, 153); text(AzVal, 180, 75); text(AzString,180,125); /* first_byte = 4; second_byte = int(MxVal); // But with less velocity myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte); fill(0, 160, 153); text(MxVal, 240, 75); text(MxString,240,125); first_byte = 5; second_byte = int(MyVal); // But with less velocity myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte); fill(0, 160, 153); text(MyVal, 300, 75); text(MyString,300,125); first_byte = 6; second_byte = int(MzVal); // But with less velocity myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte); fill(0, 160, 153); text(MzVal, 360, 75); text(MzString,360,125); first_byte = 7; second_byte = int(HeadVal); // But with less velocity myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte); fill(0, 160, 153); text(HeadVal, 420, 75); text(HeadString,420,125); */ } void serialEvent (Serial port) { data = port.readStringUntil('g'); data = data.substring(0, data.length() - 1); AxVal = data.substring(0, data.indexOf('a')); AyVal = data.substring(data.indexOf("a") + 1, data.indexOf("b")); AzVal = data.substring(data.indexOf("b") + 1, data.length()); /* index = data.indexOf("c")+1; MxVal = data.substring(index, data.indexOf("d")); index = data.indexOf("d")+1; MyVal = data.substring(index, data.indexOf("e")); index = data.indexOf("e")+1; MzVal = data.substring(index, data.indexOf("f")); index = data.indexOf("f")+1; HeadVal = data.substring(index, data.indexOf("g")); */ } /* void serialEvent (Serial port) { data = port.readStringUntil('g'); AxVal = data.substring(0, data.indexOf('a')); AyVal = data.substring(data.indexOf("a") + 1, data.indexOf("b")); AzVal = data.substring(data.indexOf("b") + 1, data.indexOf("c")); MxVal = data.substring(data.indexOf("c") + 1, data.indexOf("d")); MyVal = data.substring(data.indexOf("d") + 1, data.indexOf("e")); MzVal = data.substring(data.indexOf("e") + 1, data.indexOf("f")); HeadVal = data.substring(data.indexOf("f") + 1, data.indexOf("g")); } 

ARDUINO:

 // Add lastvalue check #include <Wire.h> #include <LSM303DLH.h> LSM303DLH glove; //set max min magnetometer int maxMx = +353, maxMy = +527, maxMz = 426; int minMx = -700, minMy = -477, minMz = -561; int maxA = 2019; int minAx = -1043, minAy = -2048, minAz = -2048; int shiftMx,shiftMy,shiftMz; int shiftAx,shiftAy,shiftAz; float shiftHeadTemp; int shiftHead; void setup() { Wire.begin(); glove.enableDefault(); Serial.begin(9600); } void loop() { glove.read(); shiftMx = ((glove.mx - minMx) / (maxMx - minMx)) * 127; shiftMy = ((glove.my - minMy) / (maxMy - minMy)) * 127; shiftMz = ((glove.mz - minMz) / (maxMz - minMz)) * 127; shiftAx = ((glove.ax - minAx) / (maxA - minAx)) * 127; shiftAy = ((glove.ay - minAy) / (maxA - minAy)) * 127; shiftAz = ((glove.az - minAz) / (maxA - minAz)) * 127; shiftHeadTemp = (glove.heading((LSM303DLH::vector){0,-1,0})); shiftHead = (shiftHeadTemp/360)*127; if (shiftMx < 0){shiftMx=0;} if (shiftMx >127){shiftMx=127;} if (shiftMy < 0){shiftMy=0;} if (shiftMy >127){shiftMy=127;} if (shiftMz < 0){shiftMz=0;} if (shiftMz >127){shiftMz=127;} if (shiftAx < 0){shiftAx=0;} if (shiftAx >127){shiftAx=127;} if (shiftAy < 0){shiftAy=0;} if (shiftAy >127){shiftAy=127;} if (shiftAz < 0){shiftAz=0;} if (shiftAz >127){shiftAz=127;} if (shiftHead < 0){shiftHead=0;} if (shiftHead >127){shiftHead=127;} Serial.print(shiftAx); Serial.print("a"); Serial.print(shiftAy); Serial.print("b"); Serial.print(shiftAz); Serial.print("c"); Serial.print(shiftMx); Serial.print("d"); Serial.print(shiftMy); Serial.print("e"); Serial.print(shiftMz); Serial.print("f"); Serial.print(shiftHead); Serial.println("g"); delay(100); } 
+6
source share
2 answers

I canโ€™t check your code right now, but here are some ideas.

You can send JSON from your Arduino for processing. Here is an example that I use in one of my projects, but you can easily adapt it to suit your needs:

 void sendJson(){ String json; json = "{\"accel\":{\"x\":"; json = json + getXYZ(0); json = json + ",\"y\":"; json = json + getXYZ(1); json = json + ",\"z\":"; json = json + getXYZ(2); json = json + "},\"gyro\":{\"yaw\":"; json = json + getYPR(0); json = json + ",\"pitch\":"; json = json + getYPR(1); json = json + ",\"roll\":"; json = json + getYPR(2); json = json + "}}"; Serial.println(json); } 

The good thing about JSON is that it is easily "parsed" with processing using the getType() function. No more readUntil , it all looks like this: (note that in void setup() you need to change port.bufferUntil('g'); to port.bufferUntil('\n'); because json sent to Arduino with Serial.println(); )

 void serialEvent (Serial port){ String json = port.readString(); shiftAx = getInt("shiftAx"); shiftAy = getInt("shiftAy"); // and so on... } 

You will have to change your code a little, but in the long run it will be much more convenient to maintain, say, if you add more sensors. You just need to change json in arduino and just get the value when processing.

Another thing: you can use the limit function to limit your value between 0 and 127 .

 value = constrain(value, 0, 127); 

Hope this helps!

+7
source

I have the same problem in C # (second parameter, in C # - the length of the subtraction line). However, I saw that if I do not wait a little time, the line that is transmitted is not always in the same form: such as: somtime, your line will be (value) a (value) b (value) c (value) d (value ) e (value) f (value) g, BUT other times will be: (value) a (value) b (value) c (value) d (value), and the next line will be e (value) f (value) g ( value) a (value) b (value), etc. In the end, all the data will be transmitted, but it will not have the same structure, so I added a bit of delay before each serial reading (to be sure that the previous consecutive line was read until all timpe and I get the line in the same form) and it works great for me. Hope this is useful for you too.

0
source

Source: https://habr.com/ru/post/951490/


All Articles