6

私は小さな問題があります。arduinoから処理までの複数のシリアル値?

私はarduino付属の3軸加速度計+ 3軸磁力計+方位計の情報を渡しています。これらはミッドレンジ(0〜127)にスケーリングされています。

ARDUINO: 私はこれが私のシリアルモニタを使用して動作します見ることができます。これは、

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

を76a45b120c23d12e23f34gのような形式でシリアル印刷に渡されます。 (ただし、私は "G" かでのprintlnとしてそれを印刷するとわからないと思います。)

PROCESSING 2:

私は私の無効設定(中グラム まで、バッファ)

port = new Serial(this, "/dev/tty.usbmodem411", 9600); 
port.bufferUntil('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")); 

} 

PROBLEM だから、これは動作しません。テキストは表示されません。 (その単純なfill()、text())

私はなぜそれが表示されません。問題は私のプロトコル(私はそれを呼び出すことができます)、文字列をどのように解いているのでしょうか?またはその他の問題。

私は非常に混乱しています。私はそれがこのtutorial

ノートのようにちょうど2つの値で動作するように取得することができます

: Arduinoのメインループは、遅延(100)です。 arduinoは9600ボーレートです

私は、必要に応じてスケッチ全体を添付します。私は事前に感謝します。

CODE:

PROCESSING

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's 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.m.x - minMx)/(maxMx - minMx)) * 127; 
    shiftMy = ((glove.m.y - minMy)/(maxMy - minMy)) * 127; 
    shiftMz = ((glove.m.z - minMz)/(maxMz - minMz)) * 127; 

    shiftAx = ((glove.a.x - minAx)/(maxA - minAx)) * 127; 
    shiftAy = ((glove.a.y - minAy)/(maxA - minAy)) * 127; 
    shiftAz = ((glove.a.z - 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); 


} 

答えて

7

私はここに今、あなたのコードをテストすることはできませんが、いくつかのアイデアです。

ArduinoのJSONを処理に送信できます。ここで私は自分のプロジェクトの一つに使用しています例ですが、簡単にあなたのニーズに合わせて、それを適応させることができます:

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

JSONの良いところは、それが処理getType()を使用して簡単に「解析可能」であるということです関数。 readUntilよりいいえ、それはすべてがこのように書き:(Serial.println();に送信されます。これはアルドゥイーノ、jsonvoid setup()にあなたがport.bufferUntil('\n');port.bufferUntil('g');を変更する必要があることに注意)

void serialEvent (Serial port){ 
     String json = port.readString(); 

     shiftAx = getInt("shiftAx"); 
     shiftAy = getInt("shiftAy"); // and so on... 
} 

あなたはあなたのコードを少し変更する必要はないだろうが、長期的には、より多くのセンサーを追加すれば、より多くのメンテナンスが可能になります。あなたはarduino内のjsonを変更するだけで処理の価値を得るだけです。

別のこと:constrain関数を使用して、値を0127の間に制限することができます。

value = constrain(value, 0, 127); 

希望します。

+0

これはまさに私が欲しかったものです。それをやるより良い方法。メルシ。 編集*私は投票権を持ちますが、代理人はいません、代理人がいる人は、この人に代理人を与えてください – ash

+0

あなたはちょうど答えを受け入れるべきです。右の小さなマーク –

0

私はC#で同じ問題を抱えています(2番目のパラメータは、c#で、引く文字列の長さです)。しかし、私は少し時間を待たないと、送信された文字列が常に同じ形であるとは限りません:somtime、あなたの文字列は(値)a(値)b(値)c(値(値)b(値)c(値)d(値)d(値)e(値)f(値)まあまあ、すべてのデータは送信されますが、同じ構造を持たないので、少し遅れて追加しました。すべてのシリアル読み込みの前に(以前のシリアル文字列がandとすべてのtimpeと同じ形式で文字列を取得するまで読み込まれていることを確認してください)、それは私のためにはうまくいきます。それがあなたにも役立つことを願っています。

関連する問題