用Processing读取Arduino int数组

时间:2015-09-21 13:20:18

标签: arduino processing

我有一个arduino处理通信问题。 我有arduino代码,它给我一个触摸屏的X和/ Y坐标 它运作良好,没问题,我得到了我的X和Y坐标。 但是我需要想象一下,我正在尝试在Processing 3.0中编写代码,以便我能够在我的计算机上看到touchFolie被触摸的位置。 所以我需要将arduino中的x-y发送到处理,以便我能够绘制。 有谁知道如何从arduino发送整数数组[X,Y]到处理??

2 个答案:

答案 0 :(得分:0)

在处理中使用Serial library SerialRead 示例(在处理>文件>示例>库>>序列>中玩游戏会很有帮助; SimpleRead

让我们说你是从头开始的。 要从Arduino发送数据,您需要打开Serial连接。 在这个阶段,唯一重要的细节是波特率:数据流动的速度。

这里是一个最小的Arduino数据示例:

void setup() {
  //initialize the Serial library with baud rate 115200
  Serial.begin(115200);
}

void loop() {
  //write data to the serial port
  Serial.println("test");
  delay(1000);
}

如果您在Arduino软件中打开串行监视器并将波特率设置为115200,您应该会看到测试每秒打印一次。

要在Processing中读取相同的数据,除了指定波特率之外,还必须指定串行端口(在Tools> Port中选择的内容,并且还列在当前Arduino草图的右下角):

import processing.serial.*; 

void setup() { 
  //update the serial port index based on your setup
  println(Serial.list());
  Serial arduino = new Serial(this, Serial.list()[0], 115200); 
  arduino.bufferUntil('\n'); 
} 

void draw() { 
} 

void serialEvent(Serial p) { 
  //read the string from serial
  String rawString = p.readString();
  println(rawString);
}

请注意,我们告诉Processing缓冲,直到它达到'\n'个字符,这样我们就不必担心等待每一个字符并将其手动附加到String。相反,使用bufferUntil()serialEvent()readString()大部分工作都是为我们完成的。

现在你可以从Arduino发送一个String并在Processing中读取它,你可以进行一些字符串操作,比如通过split()函数使用分隔符将字符串拆分成多个:

String xyValues = "12,13";
printArray(xyValues.split(","));

最后一部分是将分割值从String转换为int

String xyValues = "12,13";
String[] xy = xyValues.split(","); 
printArray(xy);
int x = int(xy[0]);
int y = int(xy[1]);
println("integer values: " + x + " , " + y);

所以,理论上,你应该能够在Arduino上做这样的事情:

int x,y;

void setup() {
  //initialize serial 
  Serial.begin(115200);
}

void loop() {
  //simulating the x,y values from the touch screen, 
  //be sure to replace with the actual readings from 
  //NOTE! If the screen returns values above 255, scale them to be from 0 to 255
  x = map(analogRead(A0),0,1024,0,255);
  y = map(analogRead(A1),0,1024,0,255);
  //write the data to serial
  Serial.print(x);
  Serial.print(",");
  Serial.print(y);
  Serial.print("\n");
}

然后在Arduino方面:

import processing.serial.*; 

float x,y;

void setup() { 
  size(400,400);
  //update the serial port index based on your setup
  Serial arduino = new Serial(this, Serial.list()[0], 115200); 
  arduino.bufferUntil('\n'); 
} 

void draw() { 
  background(0); 
  ellipse(x,y,10,10);
} 

void serialEvent(Serial p) { 
  //read the string from serial
  String rawString = p.readString();
  //trim any unwanted empty spaces
  rawString = rawString.trim();
  try{
    //split the string into an array of 2 value (e.g. "0,127" will become ["0","127"]
    String[] values = rawString.split(",");
    //convert strings to int
    int serialX = int(values[0]);
    int serialY = int(values[1]);
    //map serial values to sketch coordinates if needed
    x = map(serialX,0,255,0,width);
    y = map(serialY,0,255,0,height);
  }catch(Exception e){
    println("Error parsing string from Serial:");
    e.printStackTrace();
  }
}

注意上面的Arduino代码可能无法解决您的问题,您需要集成触摸传感器代码,但希望它提供一些有关如何解决此问题的提示。

发送一个字符串,然后解析它是一种方法,但不是最有效的方法。如果你的x,y值在0-255范围内,你可以只发送2个字节(每个坐标作为单个char)而不是最多8个字节,但是现在它可能更容易发挥使用字符串而不是直接跳转到字节。

答案 1 :(得分:-2)

tutorial会对您有所帮助。 5分钟,你可以相互联系!

编辑:

首先看一下教程的第一部分("来自Arduino ......"" ......来处理")。 在arduino中,您只需要在Serial中发送坐标。

Serial.println(coordX);
Serial.println(coordY);

在处理过程中,您会将此坐标作为文本接收,但您可以使用parseFloat()函数将其转换为Float。

这是您在Processing中接收坐标并将其存储在变量中所需的代码。

    import processing.serial.*;
    Serial myPort;  // Create object from Serial class
    String val;     // Data received from the serial port

    float x = 0;
    float y = 0;
    boolean first = true;
    setup() {
       String portName = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
       myPort = new Serial(this, portName, 9600); 
    }
    void draw() {
      if ( myPort.available() > 0) {  // If data is available,
         val = myPort.readStringUntil('\n');         // read it and store it in val
         if (first) {
            x = parseFloat(val);
            first = false;
            println("x= "+val); //print it out in the console
            } 
         else {
             y = parseFloat(val);
             first = true;
             println("y= "+val); //print it out in the console
             }
      }

我希望这可以帮助您解决问题。