当前位置: 首页 > 知识库问答 >
问题:

Arduino和处理-RX在板上闪烁,但LED不亮

夹谷弘亮
2023-03-14

我正在尝试用我的Arduino运行一个处理草图。我几天前得到的,所以我几乎是个新手。我做了两个类似的草图——一个在Arduino中,一个在处理中。Arduino确实有效,而处理草图则无效,尽管在运行处理时,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);
}

共有3个答案

和嘉澍
2023-03-14

我让它与Arduino一起工作,但我必须更改一些细节。我的端口是“COM3”或Arduino.list()[1](列表中的第二个端口),您可以在Windows设备管理器(Ports COM)中查看

ls /dev/ttyUSB*

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

衡子安
2023-03-14

使用方法:你确定要使用标准格式吗

  • 使用Arduino软件,上传StandardFirmata示例(位于示例中)

换线

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

到:

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

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

println(Arduino.list());
  • 修改“arduino=新arduino(…)”下面一行,更改Arduino中的数字。list()[0]到Arduino板串行端口对应的数字。或者,你可以替换Arduino。list()[0]带有串行端口的名称,用双引号括起来,例如Windows上的“COM3”或Mac上的“/dev/tty.usbmodem621”
嵇出野
2023-03-14

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

如果眨眼草图是你上传到黑板上的唯一一个Arduino代码,那就不够了。处理确实会向Arduino发送消息(这就是为什么您会看到RX LED亮起),但Arduino代码中没有初始化串行通信的内容

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

Serial.begin(9600);

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

// 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,然后在你运行处理草图时,TX LED闪烁。如果关闭该草图,在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(),我建议使用millis(),因为它不会像delay()那样阻止代码的执行。

因此,上面看起来像是相当多的代码只是为了闪烁LED,但重点是了解串行通信的基础知识,这将在长期内有用:

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

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

正如本教程所提到的,你需要首先从Arduino上传这个草图

arduino = new Arduino(this, Arduino.list()[0], 57600);
 类似资料:
  • LED是小而强大的灯,可用于许多不同的应用。 首先,我们将致力于闪烁LED,微控制器的Hello World。 它就像打开和关闭灯一样简单。 建立这一重要基线将为我们开展更复杂的实验奠定坚实的基础。 组件的要求 (Components Required) 您将需要以下组件 - 1 × Breadboard 1×Arduino Uno R3 1×LED 1×330Ω电阻器 2 × Jumper 过程

  • 我的情况是,我用移位寄存器控制72个LED。可通过特定请求激活每个LED。很容易将LED设置为高,但LED应闪烁。通过“for”使LED闪烁不是问题。我设法使LED闪烁,一旦它闪烁,当新的请求进来时,它不会停止。LED应仅在新请求到达之前闪烁。 我的问题是,如果在闪烁的过程中(在示例中3次)我不能停止它。如果我正在发送一个新的

  • 此示例演示了如何使用analogWrite()函数淡化LED。 AnalogWrite使用脉冲宽度调制(PWM),在打开和关闭之间以不同的比率非常快速地打开和关闭数字引脚,以产生衰落效果。 组件的要求 (Components Required) 您将需要以下组件 - 1 × Breadboard 1×Arduino Uno R3 1×LED 1×330Ω电阻器 2 × Jumper 过程 (Pro

  • 我有一个使用Apache Flink(Flink版本:1.8.1)使用Scala进行流式处理的工作。flow作业要求如下:Kafka->写给Hbase->用不同的主题再次发送给Kafka 在向Hbase写入过程中,需要从另一个表中检索数据。为确保数据不为空(NULL),作业必须(在一定时间内)重复检查数据是否为空。 编辑:我的意思是,有了我在内容中描述的问题,我想过必须在作业流中创建某种类型的作业

  • 所以我实际上正在用arduino和处理制作一个小项目。基本上,我使用C程序在8x8矩阵上绘图。该程序将您的绘图保存为以下格式的文本文件: 并将其显示到连接到arduino的led 8x8矩阵。 因此,首先在处理过程中,我将这个文件加载到一个字符串中,然后逐行将其发送到串行端口: 然后在arduino中,我读取串行端口并将数据存储到字符串中,我将该字符串的每一行转换为十进制。例如,如果字符串[0]的

  • 此示例显示如何读取模拟引脚0处的模拟输入,将analogRead()中的值转换为电压,并将其打印到Arduino软件(IDE)的串行监视器。 组件的要求 (Components Required) 您将需要以下组件 - 1 × Breadboard 1×Arduino Uno R3 1×5k欧姆可变电阻(电位器) 2 × Jumper 8×LED或您可以使用(LED条形图显示如下图所示) 过程 (