Arduino和处理-板上的RX闪烁,但LED没有点亮

时间:2018-12-29 11:26:26

标签: arduino processing arduino-uno

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

我已经用220欧姆电阻将LED连接到板上的D9,并将另一脚插入GND。然后,我继续运行Arduino草图,这是一个简单的草图,它将LED点亮和熄灭一秒钟。这个工作了。

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

我尝试仅在Arduino之间建立串行连接,并且可以正常工作-我将操纵杆模块连接到Arduino,并通过串行端口发送X和Y,然后Processing草图通过串行端口接收信息,因此他们确实在交流。

使用的端口是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);
}

2 个答案:

答案 0 :(得分:1)

要使用:您确定要放入标准确认函

  • 使用Arduino软件,上传StandardFirmata示例(位于 在“示例”>“固件”>“ 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”。

答案 1 :(得分: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);
        }

如果您上载链接的示例,如果您有一个串行端口,则在运行“处理”草图时,您应该会看到RX和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. 从处理和发送数据初始化串行通讯

回到您的原始问题,您已经错过了有关正在处理中使用的Arduino库的重要细节:它依赖于一种称为Firmata的特殊Arduino草图(固件)。在本Arduino and Processing教程中,您将能够了解到更多信息以及如何使用该库。

如本教程所述,您需要先从 Arduino>示例> Firmata> StandardFirmata 上传此草图。另外请记住,波特率设置为57600,而不是9600,因此您需要像这样更新代码:

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