6

Küçük bir sorunum var.Arduino'dan işlemeye kadar birçok seri değer var mı?

3 eksenli ivmeölçer + 3 eksenli manyetometre + pusula istikametindeki arduinodan bilgi aktarıyorum. Bunlar midi aralıklarına (0-127) ölçeklendirilmiştir.

ARDUINO: bu benim seri monitörü kullanarak çalışır görebilirsiniz Bu

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 gibi bir formata sahip bir seri baskı geçirilir. (Ancak ben "g" de println veya olmasın olarak yazdırmak için emin değilim.)

İŞLEME 2:

Tampon olmak i var

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

benim geçersiz kurulumunda g () kadar fonksiyon

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

} 

SORUN Yani bu işe yaramaz. Metin görüntülenmedi. (Sadece basit bir dolgu(), metin())

Neden göremiyorum. Sorun benim protokolüm (eğer bunu söyleyebilirsek), ipliği nasıl açarım? Ya da başka bir problem.

Çok kafam karıştı. Ben bu tutorial

notlarda olarak sadece iki değer ile çalışmak alabilirsiniz

: arduino ana döngü gecikmesi (100) üzerindedir; arduino, 9600 baud hızındadır.

Bana yardım etmek için gerekirse eskizleri ekleyeceğim, bu sayede önceden teşekkürlerimi sunacağım.

KODU:

İŞLEME

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


} 

cevap

7

Ben şu anda burada kodunuzu test ancak bazı fikirler.

JSON'u Arduino'nuzdan işlemeye gönderebilirsiniz. İşte ben kendi projesi birinde kullanıyorum örnektir ancak kolayca ihtiyaçlarınıza göre adapte olabilir:

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 hakkında iyi bir şey işleme getType() kullanarak kolayca "ayrıştırılamaz" olmasıdır işlevi. readUntil Artık, tüm şöyledir: (Arduino içinde, jsonSerial.println(); ile gönderildiği için void setup() size port.bufferUntil('\n'); için port.bufferUntil('g'); değiştirmek gerektiğini unutmayın)

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

     shiftAx = getInt("shiftAx"); 
     shiftAy = getInt("shiftAy"); // and so on... 
} 
Sen kod biraz değiştirmek zorunda kalacak

ama Daha fazla sensör ekleyecekseniz uzun vadede çok daha fazla bakım yapılabilir.Arduino'da json'u değiştirmeniz ve işlem sırasında değeri almanız yeterlidir.

Başka bir şey: 0 ve 127 arasındaki değerinizi sınırlamak için kısıtlama işlevini kullanabilirsiniz.

value = constrain(value, 0, 127); 

Umut eder!

+0

Bu tam olarak istediğim şey. Bunu yapmanın çok daha iyi yolu. Mersi. edit * Oy ver, oy kullanamazdım, birisiyle birlikte, bu adama bir kaç tane ver – ash

+0

Sadece cevabı kabul etmelisin. Küçük sağ işareti –

0

I (substracting dize uzunluğu C#, ikinci parametre ise) C# aynı sorunu var. Ancak, biraz beklemezsem, iletilen dizinin her zaman aynı biçimde olmadığını gördüm: öyle ki: somtime, dizgin (value) a (value) b (value) c (value)) d (değer) e (değer) f (değer) g, BUT diğer zamanlar: (değer) a (değer) b (değer) c (değer) d (değer) ve bir sonraki dize e (değer) olur. f (değer) g (değer) a (değer) b (değer) ve benzeri ... Sonuçta, tüm veriler iletilecek, ancak aynı yapıya sahip olmayacak, bu yüzden biraz gecikme ekledim Her seri okumadan önce (bir önceki seri dizgenin okunduğuna ve her timpe'ye aynı forma girdiğinden emin olmak için) ve benim için iyi çalışıyor. Umarım sizin için de yararlıdır.

İlgili konular