Arduino 和处理 - RX 在板上闪烁,但 LED 不亮
Arduino and Processing - RX is blinking on board, but LED is not lighting up
我正在尝试 运行 使用我的 Arduino 进行处理草图。几天前我得到它,所以我几乎是一个菜鸟。我画了两个类似的草图——一个在 Arduino 中,一个在 Processing 中。 Arduino 确实可以工作,而 Processing sketch 却没有,即使 运行 在 Processing one 上,RX 在板上亮起。
我用一个 220 欧姆的电阻将一个 LED 连接到板上的 D9,并将另一条腿插入 GND。然后我继续 运行 Arduino 草图,这是一个简单的草图,它会点亮和熄灭 LED 一秒钟。这个奏效了。
然后我尝试 运行使用 Arduino 库使用 Processing sketch,完全相同的代码(适用于 Processing ),并且板似乎与我的 sketch 通信,因为 RX 每秒都在闪烁板(我尝试了不同的时间间隔,它们与 RX 闪烁的间隔相匹配),但 LED 不会打开和关闭,就像 Arduino 草图一样。
我尝试只在 Arduino 之间建立一个串行连接,它成功了——我将一个操纵杆模块连接到 Arduino 并通过串行端口发送 X 和 Y,Processing sketch 通过串行端口接收信息,所以他们确实在交流。
使用的端口是 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);
}
使用:你确定要放标准的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] 替换为串行端口的名称,用双引号括起来,例如"COM3" Windows 或 /dev/tty.usbmodem621 Mac.
在逐步调试方面做得很好,例如仔细检查电子方面的接线并单独使用 Arduino 测试闪烁代码以隔离问题。
如果 Blink 草图是您上传到电路板的唯一 Arduino 代码,那是不够的。 Processing 确实会向 Arduino 发送消息(这就是为什么您会看到 RX LED 亮起),但是 Arduino 代码中没有任何内容可以初始化 Serial communication
如您在该示例中所见,在 setup()
中,串行通信初始化为 9600 波特率(通信速度,每秒 9600 bytes/chars):
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 然后在 TX LED 闪烁之后略微闪烁。如果你关闭那个草图,在 Arduino 中打开串行监视器并输入一些东西然后按回车你会看到从 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
将其关闭。
唯一剩下的就是从 Processing:
发送相同的数据
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);
}
}
次要注意事项:请注意,我没有在 Processing 中使用 delay()
,我建议使用 using millis(),因为它不会像 delay()
那样阻止代码的执行。
所以上面的代码看起来有点像让 LED 闪烁的代码,但重点是了解串行通信的基础知识,这将对长期有用 运行:
- 初始化与Arduino的串口通信(了解波特率)
- 串行
上的基本 reading/writing 字节
- 正在从处理和发送数据初始化串行通信
回到你原来的问题,你错过了一个关于你在 Processing 中使用的 Arduino 库的重要细节:它依赖于一个名为 Firmata 的特殊 Arduino 草图(固件)。您将能够在此 Arduino and Processing 教程中阅读更多相关内容以及如何使用该库。
正如教程中提到的,您需要先从 Arduino > Examples > Firmata > StandardFirmata 上传此草图。另外请记住,波特率设置为 57600
,而不是 9600
,因此您需要像这样更新代码:
arduino = new Arduino(this, Arduino.list()[0], 57600);
我在 Arduino 上使用它,但我不得不更改一些细节。我的端口是“COM3”或 Arduino.list()[1](列表中的第二个端口),您可以在安装后检查 Windows 设备管理器(端口 COM 和 LPT:USB-SERIAL)使用系统更新并重新启动最新驱动程序(可能在其他设备下连接 Arduino 时出现的 USB 端口上),然后您可能需要重复系统更新并重新启动 2 或 3 次。或者在 Linux 上,您可以找到它所在的端口:
ls /dev/ttyUSB*
然后拔掉插头再检查一下。
首先,我必须在右下方菜单上具有相同的精确波特率后,从工具菜单 ctrl-shft-m 上传 Arduino IDE 程序(运行 它与串行监视器 window程序中的选项)。然后我可以关闭它并编译处理程序,只要我也将完全相同的波特率输入到处理程序中即可。我尝试过的所有 3 种不同的波特率,9600、57600、115200,都要求它们在 Arduino IDE、Arduino IDE 串行监视器和处理之间相等。如果我在 IDE 中上传了一个不同的项目,那么 Processing 甚至没有连接到 Arduino,所以它必须是同一个项目 运行 才能使 Processing 与 Arduino Uno 正确通信。处理基本上是使用 Arduino IDE 通过发送或接收已经为其编程的消息,在这种情况下它不会对 Arduino 进行编程。我什至遇到了一个大麻烦,试图让 Visual Micro 工作(Visual Studio 上的 Arduino)跨平台,但它仍然不允许我 link 其他库和头文件,因为 Arduino 的挑剔程度编程是!最好的学习方法之一是在找出问题所在后检查实际的 arduino.cc 或处理手动命令参数。
我正在尝试 运行 使用我的 Arduino 进行处理草图。几天前我得到它,所以我几乎是一个菜鸟。我画了两个类似的草图——一个在 Arduino 中,一个在 Processing 中。 Arduino 确实可以工作,而 Processing sketch 却没有,即使 运行 在 Processing one 上,RX 在板上亮起。
我用一个 220 欧姆的电阻将一个 LED 连接到板上的 D9,并将另一条腿插入 GND。然后我继续 运行 Arduino 草图,这是一个简单的草图,它会点亮和熄灭 LED 一秒钟。这个奏效了。
然后我尝试 运行使用 Arduino 库使用 Processing sketch,完全相同的代码(适用于 Processing ),并且板似乎与我的 sketch 通信,因为 RX 每秒都在闪烁板(我尝试了不同的时间间隔,它们与 RX 闪烁的间隔相匹配),但 LED 不会打开和关闭,就像 Arduino 草图一样。
我尝试只在 Arduino 之间建立一个串行连接,它成功了——我将一个操纵杆模块连接到 Arduino 并通过串行端口发送 X 和 Y,Processing sketch 通过串行端口接收信息,所以他们确实在交流。
使用的端口是 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);
}
使用:你确定要放标准的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] 替换为串行端口的名称,用双引号括起来,例如"COM3" Windows 或 /dev/tty.usbmodem621 Mac.
在逐步调试方面做得很好,例如仔细检查电子方面的接线并单独使用 Arduino 测试闪烁代码以隔离问题。
如果 Blink 草图是您上传到电路板的唯一 Arduino 代码,那是不够的。 Processing 确实会向 Arduino 发送消息(这就是为什么您会看到 RX LED 亮起),但是 Arduino 代码中没有任何内容可以初始化 Serial communication
如您在该示例中所见,在 setup()
中,串行通信初始化为 9600 波特率(通信速度,每秒 9600 bytes/chars):
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 然后在 TX LED 闪烁之后略微闪烁。如果你关闭那个草图,在 Arduino 中打开串行监视器并输入一些东西然后按回车你会看到从 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
将其关闭。
唯一剩下的就是从 Processing:
发送相同的数据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);
}
}
次要注意事项:请注意,我没有在 Processing 中使用 delay()
,我建议使用 using millis(),因为它不会像 delay()
那样阻止代码的执行。
所以上面的代码看起来有点像让 LED 闪烁的代码,但重点是了解串行通信的基础知识,这将对长期有用 运行:
- 初始化与Arduino的串口通信(了解波特率)
- 串行 上的基本 reading/writing 字节
- 正在从处理和发送数据初始化串行通信
回到你原来的问题,你错过了一个关于你在 Processing 中使用的 Arduino 库的重要细节:它依赖于一个名为 Firmata 的特殊 Arduino 草图(固件)。您将能够在此 Arduino and Processing 教程中阅读更多相关内容以及如何使用该库。
正如教程中提到的,您需要先从 Arduino > Examples > Firmata > StandardFirmata 上传此草图。另外请记住,波特率设置为 57600
,而不是 9600
,因此您需要像这样更新代码:
arduino = new Arduino(this, Arduino.list()[0], 57600);
我在 Arduino 上使用它,但我不得不更改一些细节。我的端口是“COM3”或 Arduino.list()[1](列表中的第二个端口),您可以在安装后检查 Windows 设备管理器(端口 COM 和 LPT:USB-SERIAL)使用系统更新并重新启动最新驱动程序(可能在其他设备下连接 Arduino 时出现的 USB 端口上),然后您可能需要重复系统更新并重新启动 2 或 3 次。或者在 Linux 上,您可以找到它所在的端口:
ls /dev/ttyUSB*
然后拔掉插头再检查一下。 首先,我必须在右下方菜单上具有相同的精确波特率后,从工具菜单 ctrl-shft-m 上传 Arduino IDE 程序(运行 它与串行监视器 window程序中的选项)。然后我可以关闭它并编译处理程序,只要我也将完全相同的波特率输入到处理程序中即可。我尝试过的所有 3 种不同的波特率,9600、57600、115200,都要求它们在 Arduino IDE、Arduino IDE 串行监视器和处理之间相等。如果我在 IDE 中上传了一个不同的项目,那么 Processing 甚至没有连接到 Arduino,所以它必须是同一个项目 运行 才能使 Processing 与 Arduino Uno 正确通信。处理基本上是使用 Arduino IDE 通过发送或接收已经为其编程的消息,在这种情况下它不会对 Arduino 进行编程。我什至遇到了一个大麻烦,试图让 Visual Micro 工作(Visual Studio 上的 Arduino)跨平台,但它仍然不允许我 link 其他库和头文件,因为 Arduino 的挑剔程度编程是!最好的学习方法之一是在找出问题所在后检查实际的 arduino.cc 或处理手动命令参数。