我正在尝试使用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);
}
答案 0 :(得分:1)
要使用:您确定要放入标准确认函
换行
arduino = new Arduino(this, Arduino.list()[0], 9600);
收件人:
arduino = new Arduino(this, "COM3", 57600); // in Firmata -> Firmata.begin(57600);
您可以添加以下行来查看您的串行端口:
println(Arduino.list());
答案 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指示灯闪烁了很多代码,但重点是要了解串行通信的基础知识,从长远来看将很有用:
回到您的原始问题,您已经错过了有关正在处理中使用的Arduino库的重要细节:它依赖于一种称为Firmata的特殊Arduino草图(固件)。在本Arduino and Processing教程中,您将能够了解到更多信息以及如何使用该库。
如本教程所述,您需要先从 Arduino>示例> Firmata> StandardFirmata 上传此草图。另外请记住,波特率设置为57600
,而不是9600
,因此您需要像这样更新代码:
arduino = new Arduino(this, Arduino.list()[0], 57600);