如何在Processing中修改数组并将它们从串行发送到Arduino?

How to modify arrays in Processing and send them from serial to Arduino?

提问人:Bradbut 提问时间:10/21/2023 最后编辑:Bradbut 更新时间:10/21/2023 访问量:73

问:

我有一个代码,该代码当前从处理中的控制器输入中获取值,通过串行将这些值发送到Arduino Uno,Arduino Uno通过无线电将这些值发送到另一个Arduino Uno。我正在尝试更改格式以发送数组以实现更好的通信,这是我目前失败的尝试

当前处理代码

 int status[] = {0, 0, 0, 0, 0}
 void draw
 if (thumblefty > .2)
 {
 status[0]=3;
 }
 if (thumblefty < -.2)
 {
 status[0]=0;
 }
 if (thumbleftx>.2)
 {
 status[0]=1;
 }
 if (thumbleftx<-.2)
 {
 status[1]=2;
 }
 //etc etc on the if statements
 myPort.write(status);
 }

然而,这会在 myPort.write 上产生一个错误行,指出函数 “write()” 需要类似 “write(byte[])” 的参数。我不想发送一个字节,因为我想在这个数组中做超过 1 和 0 的事情。即使我确实修改了代码以使其

byte status[]={0,0,0,0,0}

我在接收 arduino 时没有得到预期的结果

发射器代码 (Arduino)

byte state[4];
void loop
state[4] = Serial.read();
radio.write(&state, sizeof(state));

接收代码 (Arduino)

byte state[4];
void loop
radio.read(&state, sizeof(state));
Serial.println(state[4]);

当控制器处于向上位置时,我希望接收序列号上的输出为 [3,0,0,0,0],但串行端口充满了随机整数,这些整数不会根据控制器位置而变化,并且不是字节或数组形式

我希望帮助配置我的处理代码以发送数组,并帮助弄清楚如何通过串行解释该数组并通过 RF24 发送。最终目标是让接收方Arduino能够查看数组每个位置的值,比如说

if state[3]==2
{
motor 2 full power
}

并且能够对阵列的所有位置执行此操作,以破译阵列中所有可能的输入,但我首先需要我的串行端口来接收阵列本身

Java Arduino 串行端口 处理

评论


答:

0赞 apodidae 10/21/2023 #1

以下源代码将 Processing 中的整数数组中的一串随机状态值作为逗号分隔值发送到 Arduino;字符串的末尾以换行符终止。补遗:在写入Arduino之前,编辑了原始答案以将数组整数转换为字符串,即str(myState[i])。

处理代码:

import processing.serial.*;

int[] myState = new int[4];
Serial myPort;

void setup() {
  // Output is in console
  surface.setVisible(false);
  printArray(Serial.list());
 // Set port number for your system
  myPort = new Serial(this, Serial.list()[3], 9600);
}

void draw() {
  if (frameCount % 60 == 0) {
    myState[0] = int(random(4));
    myState[1] = int(random(4));
    myState[2] = int(random(4));
    myState[3] = int(random(4));
    for (int i = 0; i < myState.length-1; i++) {
      myPort.write(str(myState[i]));
      myPort.write(',');
    }
    myPort.write(str(myState[3]) + '\n');
    printArray(myState);
    println("=============");
  }
   
}

备选解决方案:以下源代码使用发送数组字符串的替代方法。它适用于下面的Arduino代码。在项目中添加了一个 LED,以证明阵列确实在 Arduino 端使用,因为我们不能使用串行监视器(端口被处理捆绑)。如果您不想使用 LED 代码,可以将其删除。

import processing.serial.*;

int[] myState = new int[4];
Serial myPort;
String inStr;
String outStr;
int x1, x2, x3, x4;
void setup() {
  // Output is in console
  surface.setVisible(false);
  printArray(Serial.list());
  // Set port number for your system
  myPort = new Serial(this, Serial.list()[3], 9600);
}

void draw() {
  if (frameCount % 60 == 0) {
    myState[0] = int(random(4));
    myState[1] = int(random(4));
    myState[2] = int(random(4));
    myState[3] = int(random(4));
    outStr = str(myState[0]) + "," + str(myState[1]) + "," + str(myState[2]) + "," + str(myState[3]) + "\n";
    myPort.write(outStr);
    printArray(myState);
    println("=============");
  }   
}

void serialEvent(Serial p) {
  inStr = p.readStringUntil('\n');
  if (inStr != null) {
    String trimStr = trim(inStr);
    println("receivedBack : " + trimStr);   
}
}

Arduino代码:

const int LED = 12;

int myState[4];

String inStr;

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    inStr = Serial.readStringUntil('\n');
    myState[0] = Serial.parseInt(); 
    Serial.println("state[0]"); 
    myState[1] = Serial.parseInt();
    Serial.println("state[1]"); 
    myState[2] = Serial.parseInt(); 
    Serial.println("state[2]");
    myState[3] = Serial.parseInt();
    Serial.println("state[3]");
  }
  
  if(myState[3] == 2){
    digitalWrite(LED, HIGH); 
    delay(2000);
  } else {
    digitalWrite(LED, LOW);
    delay(2000);
  }
  }

评论

0赞 apodidae 10/21/2023
我可能没有正确理解你的问题。看来您可能想要此演示的相反,即将数组从 Processing 发送到 arduino。这是正确的吗?
0赞 Bradbut 10/21/2023
没错,是的!感谢您提供当前的代码,但我确实正在尝试将数组从 Processing 发送到 Arduino,对于我的问题格式错误,我深表歉意
0赞 apodidae 10/21/2023
请参阅编辑后的答案。
0赞 Bradbut 10/21/2023
您的代码看起来令人难以置信,并且在处理方面运行良好,处理控制台显示 =============== [0] 1 [1] 0 [2] 0 [3] 0 ============= 并且第一个值随着我移动触发器而变化。我的接收方仍然有问题,但我认为这就是我发送它的方式,会解决它,谢谢!
0赞 apodidae 10/21/2023
有关随附的Arduino代码的替代处理解决方案,请参阅编辑后的答案。在写入Arduino之前,编辑了原始答案以将数组整数转换为字符串。