【问题标题】:Arduino and Processing - RX is blinking on board, but LED is not lighting upArduino 和处理 - RX 在板上闪烁,但 LED 不亮
【发布时间】:2018-12-29 11:26:25
【问题描述】:

我正在尝试使用我的 Arduino 运行处理草图。我是几天前收到的,所以我几乎是个菜鸟。我制作了两张类似的草图——一张在 Arduino 中,一张在 Processing 中。 Arduino 可以工作,而 Processing 草图则不能,即使在运行 Processing 时,板上的 RX 也会亮起。

我已经用一个 220 欧姆的电阻将一个 LED 连接到板上的 D9,并将另一条腿插入 GND。然后我开始运行 Arduino 草图,这是一个简单的草图,它点亮和熄灭 LED 一秒钟。这个有效。

然后我尝试运行处理草图,使用 Arduino 库运行完全相同的代码(适用于处理),并且板似乎与我的草图通信,因为 RX 在板上每秒闪烁(我尝试了不同的时间间隔时间,它们与 RX 闪烁的间隔相匹配),但 LED 不会像 Arduino 草图那样打开和关闭。

我尝试只在 Arduino 之间建立一个串行连接,它起作用了——我将一个操纵杆模块连接到 Arduino 并通过串行端口发送 X 和 Y,处理程序通过串行端口接收信息,所以他们确实在交流。

使用的端口是 COM3,并以 9600 波特率运行。

这是 Arduino 草图:

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(1000);
}

这是处理(3.4 版)草图:

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;

void setup() {  
  arduino = new Arduino(this, Arduino.list()[0], 9600);
  arduino.pinMode(9, Arduino.OUTPUT);
}

void draw() {
  arduino.digitalWrite(9, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(9, Arduino.LOW);
  delay(1000);
}

【问题讨论】:

    标签: arduino processing arduino-uno


    【解决方案1】:

    在逐步调试方面做得很好,例如仔细检查电子侧的接线并单独使用 Arduino 测试闪烁代码以隔离问题。

    如果 Blink 草图是您上传到开发板的唯一 Arduino 代码,这还不够。处理确实会向 Arduino 发送消息(这就是您看到 RX LED 亮起的原因),但 Arduino 代码中没有初始化 Serial communication

    正如您在该示例中看到的,在setup() 中,串行通信初始化为 9600 波特率(通信速度,每秒 9600 字节/字符):

    Serial.begin(9600);
    

    然后在 draw() 中,如果有可用数据,则读取每个字符,然后一次打印一个并带有前缀消息:

    // send data only when you receive data:
            if (Serial.available() > 0) {
                    // read the incoming byte:
                    incomingByte = Serial.read();
    
                    // say what you got:
                    Serial.print("I received: ");
                    Serial.println(incomingByte, DEC);
            }
    

    如果您上传链接的示例,如果您有一个串行端口,那么当您运行处理程序草图时,您应该会在 TX LED 闪烁之后看到两个 RX。如果您关闭该草图,在 Arduino 中打开串行监视器并输入一些内容,然后按 Enter,您将看到从 Arduino 读回的调试消息。

    使用这些概念,您可以像这样编写基本草图:

    int incomingByte = 0;   // for incoming serial data
    
    void setup() {
      pinMode(9, OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      // send data only when you receive data:
      if (Serial.available() > 0) {
              // read the incoming byte:
              incomingByte = Serial.read();
    
              // say what you got:
              Serial.print("I received: ");
              Serial.println(incomingByte, DEC);
    
              // if we received ASCII character '1', turn LED on
              if(incomingByte == '1'){
                digitalWrite(9,HIGH);
              }
              // if we received ASCII character '0', turn LED off
              if(incomingByte == '0'){
                digitalWrite(9,LOW);
              }
      }
    }
    

    将此草图上传到您的 Arduino 应该允许您在串行监视器中输入 1,然后按 Enter 键打开 LED 或按 0 将其关闭。

    唯一剩下的就是从处理中发送相同的数据:

    import processing.serial.*;
    
    Serial arduino;
    
    void setup(){
      try{
        arduino = new Serial(this, Serial.list()[0], 9600);
      }catch(Exception e){
        println("error connecting to serial port, double chek USB connection, serial port and close other programs using Serial");
        e.printStackTrace();
      }
    }
    
    void draw(){
    
    }
    
    void keyPressed(){
      if(key == '1'){
        if(arduino != null){
          arduino.write('1');
        }else{
          println("arduino serial connection wasn't initialised");
        }
        background(255);
      }
      if(key == '0'){
        if(arduino != null){
          arduino.write('0');
        }else{
          println("arduino serial connection wasn't initialised");
        }
        background(0);
      }
    }
    

    小注:注意我没有在处理中使用delay(),我推荐using millis(),因为它不会像delay()那样阻止代码的执行。

    所以上面的代码看起来有点像只是为了让 LED 闪烁,但关键是要了解串行通信的基础知识,从长远来看这将是有用的:

    1. 初始化与 Arduino 的串行通信(了解波特率)
    2. 串行字节的基本读/写
    3. 从处理和发送数据初始化串行通信

    回到您最初的问题,您错过了有关您在 Processing 中使用的 Arduino 库的一个重要细节:它依赖于一个名为 Firmata 的特殊 Arduino 草图(固件)。您将能够在此 Arduino and Processing 教程中阅读更多关于此内容以及如何使用该库的信息。

    正如教程中提到的,您需要先从 Arduino > Examples > Firmata > StandardFirmata 上传此草图。还要记住波特率设置为57600,而不是9600,因此您需要像这样更新您的代码:

    arduino = new Arduino(this, Arduino.list()[0], 57600);
    

    【讨论】:

    • 非常感谢,这似乎解决了问题...我尝试调试它并摆弄了几个小时,但后来决定是时候寻求帮助了。好像我错过了那个说我应该在 Arduino 上闪现 StandardFirmata 草图的小部分……哎呀!感谢您的详细回答,伙计!真的很有帮助。
    【解决方案2】:

    使用方法:你确定放标准的firmata

    • 使用 Arduino 软件,上传 StandardFirmata 示例(位于 在示例 > Firmata > StandardFirmata)到您的 Arduino 板。

    换行

    arduino = new Arduino(this, Arduino.list()[0], 9600);
    

    到:

    arduino = new Arduino(this, "COM3", 57600); // in  Firmata -> Firmata.begin(57600);
    

    您可以添加此行来管理您的串行端口:

    println(Arduino.list());
    
    • 修改下面的“arduino = new Arduino(...)”行,将Arduino.list()[0]中的数字改为你的Arduino板串口对应的数字。或者,您可以将 Arduino.list()[0] 替换为串行端口的名称,用双引号括起来,例如Windows 上的“COM3”或 Mac 上的“/dev/tty.usbmodem621”。

    【讨论】:

      【解决方案3】:

      我让它与 Arduino 一起工作,但我不得不更改一些细节。我的端口是“COM3”或 Arduino.list()[1](列表中的第二个端口),您可以在安装最新的驱动程序(可能在使用系统更新并重启时出现的usb端口),那么您可能需要重复系统更新并重启2或3次。或者在 Linux 上,您可以找到它所在的端口:

      ls /dev/ttyUSB*
      

      然后将其拔下并再次检查。 首先,我必须上传 Arduino IDE 程序(在右下方菜单选项与程序中的波特率相同后,使用串行监视器窗口从工具菜单 ctrl-shft-m 运行它)。然后我可以关闭它并编译处理程序,只要我也将相同的波特率输入到处理程序中。我尝试过的所有 3 种不同的波特率,9600、57600、115200,都需要 Arduino IDE、Arduino IDE 串行监视器和处理之间的相等性。如果我在 IDE 中上传了一个不同的项目,那么 Processing 甚至没有连接到 Arduino,所以它必须是在其上运行的同一个项目,Processing 才能与 Arduino Uno 正确通信。处理基本上是通过发送或接收已经编程的消息来使用Arduino IDE,在这种情况下它不会对Arduino进行编程。我什至经历了一场大混乱,试图让 Visual Micro 跨平台工作(Visual Studio 上的 Arduino),但它仍然不允许我链接其他库和头文件,因为 Arduino 的编程非常挑剔!最好的学习方法之一是在找出问题所在后检查实际的 arduino.cc 或处理手动命令参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多