我正在尝试用我的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);
}
我让它与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或处理手动命令参数。
使用方法:你确定要使用标准格式吗
换线
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发送消息(这就是为什么您会看到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,但重点是了解串行通信的基础知识,这将在长期内有用:
回到你最初的问题,你错过了一个关于你在处理过程中使用的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条形图显示如下图所示) 过程 (