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