You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Processing代码与Arduino UNO控制伺服电机?技术求助

解决Arduino与Processing伺服电机控制的串口通信问题

问题根源分析

  1. 串口协议不匹配:Arduino代码期望的通信格式是「通道ID(char类型的0或1)+ 位置字节」,但Processing发送的是字符串(如"90x"),两者完全不兼容,导致Arduino无法解析指令。
  2. 串口资源冲突:Arduino串口监视器与Processing程序不能同时占用同一个串口,必须关闭监视器才能让Processing正常通信。
  3. 阻塞式串口读取:Arduino中的while(Serial.available() <=0)会让程序一直等待串口数据,没有数据时会卡死,表现为串口LED常亮。

修复步骤及代码

1. 确保串口独占

运行Processing前,必须关闭Arduino IDE的串口监视器,避免串口资源被抢占。

2. 修改Arduino代码(非阻塞读取+正确解析协议)

#include <Servo.h>
const char TILT_CHANNEL = 0;  // 俯仰通道ID
const char PAN_CHANNEL = 1;   // 偏摆通道ID
Servo servoTilt, servoPan;

void setup() {
  servoTilt.attach(9);
  servoPan.attach(10);
  servoTilt.write(90);  // 初始居中
  servoPan.write(90);
  Serial.begin(57600);
}

void loop() {
  // 非阻塞处理:仅当有足够数据(至少2字节)时才读取
  if (Serial.available() >= 2) {
    char channel = Serial.read();
    byte position = Serial.read();
    
    if (channel == TILT_CHANNEL) {
      servoTilt.write(position);
    } else if (channel == PAN_CHANNEL) {
      servoPan.write(position);
    }
  }
}

3. 修改Processing代码(匹配Arduino通信协议)

import processing.serial.*;
Serial port;
int xpos = 90;  // 俯仰初始位置
int ypos = 90;  // 偏摆初始位置

void setup() {
  size(360, 360);
  frameRate(30);  // 降低帧率,避免串口数据堆积
  // 打印可用串口列表,确认Arduino端口索引
  printArray(Serial.list());
  // 替换为你的Arduino实际端口索引,比如Serial.list()[1]
  port = new Serial(this, Serial.list()[0], 57600);
}

void draw() {
  fill(175);
  rect(0, 0, 360, 360);
  fill(255, 0, 0);
  rect(180, 175, mouseX - 180, 10);
  fill(0, 255, 0);
  rect(175, 180, 10, mouseY - 180);
  update(mouseX, mouseY);
}

void update(int x, int y) {
  // 计算位置并限制在0-180范围内(伺服安全角度)
  xpos = constrain(x / 2, 0, 180);
  ypos = constrain(y / 2, 0, 180);
  
  // 按照Arduino期望的格式发送数据:通道ID + 位置字节
  port.write(0);          // 发送俯仰通道ID
  port.write(xpos);       // 发送俯仰位置
  port.write(1);          // 发送偏摆通道ID
  port.write(ypos);       // 发送偏摆位置
}

额外注意事项

  • 如果Processing控制台打印的串口列表中,Serial.list()[0]不是Arduino的端口,需要修改索引为正确的序号(比如Serial.list()[1])。
  • constrain函数用于确保伺服位置不会超出0-180的安全范围,避免损坏电机。
  • 降低帧率到30可以减少串口发送频率,避免数据堆积导致通信异常。

内容的提问来源于stack exchange,提问作者Steve_veto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:55:42