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); }