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

通过处理读取Arduino串行数据

翟冷勋
2023-03-14

我想做的是从我用Arudino制作的转速表电路中读取连续的数据流,然后将其输入处理;我已经使用下面的代码成功完成了:

我不确定如何处理数据,以便每当检测到某个值时,处理中都会发生事件。

编辑:有人建议关闭,所以我的问题是调用myMovie。loop()是一个阻塞调用,这意味着void setup()中的指令指针将保持在myMovie上。loop()。指针将调用void Draw()movieEvent,但永远不会到达启动串行端口的线路

port = new Serial(this, "/dev/tty.usbmodem1411", 9600); 
port.bufferUntil('\n');

建议的解决方案是将这些行移动到ulualDraw()的顶部,并将myMovie.loop作为ulualsetup()的最后一行。我尝试了这个(我下面的代码反映了这个变化),但我仍然在处理中读取'0.0'作为串行输入,但在Arduino中获得了正确的数据。

以下是我的处理代码:

import processing.video.*; 
import processing.serial.*; 


Serial port; 
Movie myMovie; 

//try as a float?
double val = 0; 

void setup() 
{  
 //create screen
 size(320, 240); 
 background(0); 
 //load movie
 myMovie = new Movie(this, "countdown.mov"); 


 // print a list of all available ports 
 println(Serial.list()); 

 // choose the port to which the Arduino is connected 
 // on the PC this is usually COM1, on the Macintosh 
 // this is usually tty.usbserial-XXX 
 port = new Serial(this, "/dev/tty.usbmodem1411", 9600); 


 ///(1) if this line used, no information is read
// port.bufferUntil('\n');  

 myMovie.loop(); 
}    




 void draw() { 
 if (0 < port.available()) { 

 ///(2) If this line is used, '0.0' is read once and displayed in serial output
 String strData = port.readStringUntil('\n'); // string representation of value

 //TEST
 print(val);

 val = Double.parseDouble(strData); // double from string data
}

 image(myMovie, 0, 0); 
}




void movieEvent(Movie m) {
 m.read();
if (val >= 3600) {
   myMovie.speed(1); 
}
else { 
   myMovie.speed(0); 
  }
}  

下面是我的Arduino代码:

 //// This example shows one way of creating an optoswitch
    //// using an IR LED as emitter and an IR LED receiver as
    //// light sensor.
    ////
    ////           + GROUND                                 +GROUND          
    ////           |                                        |  
    ////           <                                        < 
    ////           > 220 ohm resistor                       > 220 ohm resistor
    ////           <                                        <      
    ////           |                                        |  
    ////           |                                        |
    ////         -----                                    -----
    ////          / \    >>IR LED emitter >>>>>>>>>>>>>>>>  / \   IR LED receiver
    ////         -----                                    -----
    ////           |                                        |
    ////           |                                        |
    ////           + +5VCD                                  +  ANALOG INPUT 0
    ////
    ////
    ////
    ////<a href="http://playground.arduino.cc/Learning/Tachometer" target="_blank" rel="nofollow">http://playground.arduino.cc/Learning/Tachometer</a>


    int val;
    long last=0;
    int currentStatus=LOW;
    int previousStatus=LOW;
    int count=0;

    int sens=85;  // this value indicates the limit reading between dark and light,
                  // it has to be tested as it may change acording on the 
                  // distance the leds are placed.
    int nSpokes=7; // the number of blades of the wheel

    int milliseconds=500; // the time it takes each reading



    void setup()  
    {
      Serial.begin(9600);
      pinMode(13,OUTPUT);
    }

    void loop()
    {
      val=analogRead(0);
      if(val<sens)
        currentStatus=LOW;
       else
        currentStatus=HIGH;
       digitalWrite(13,currentStatus); //as iR light is invisible for us, the led on pin 13 
                              //indicate the state of the circuit.

       if(previousStatus!=currentStatus){  //counts when the state changes from (dark to light) or 
                         //from (light to dark), remmember that IR light is invisible for us.
         count++;
         previousStatus=currentStatus;
       }
       if(millis()-last>=milliseconds){
         double rps=((double)count/nSpokes)/2.0*1000.0/milliseconds;
         double rpm=((double)count/nSpokes)/2.0*60000.0/(milliseconds);
    //     Serial.print((count/2.0));Serial.print("  RPS ");Serial.print(rps);
    //     Serial.print(" RPM");
    //     Serial.print(rpm);
    //     Serial.print("  VAL ");Serial.println(val); 
         Serial.println(rpm);
         count=0;
         last=millis();
       }
    }

基本上,我用Arduino Uno计算电脑风扇的速度。如果风扇转速保持在3600转,那么我想要一部电影。如果低于这个值,我希望电影停止播放。我的Arduino草图正在工作(我能够在串行端口上很好地读取数据),但由于某些原因,我无法通过处理来实现这一点;似乎没有收到任何数据。我是根据Arduino附带的一系列示例编写的,但似乎什么都不管用。

共有2个答案

闾丘玮
2023-03-14

尝试打印(val)

另外,我认为你不应该同时使用port.buffer直到('\n');port.read字符串直到('\n');

一次只能尝试一个。我不确定这是否有区别,但在文档中,他们一次只使用一个,我可以看到。

我也会改变

 if (val == 0) { 
   myMovie.speed(0); 
 } 
 else if (val >= 3600) 
   myMovie.speed(1); 
 else { 
   myMovie.speed(0); 
 }

if (val >= 3600) {
   myMovie.speed(1); 
}
else { 
   myMovie.speed(0); 
}

希望这有帮助。

戚良弼
2023-03-14

我认为你这里有很多问题,需要稍微分开。我要做的第一件事是暂时将arduino从等式中移除,并首先验证事物的处理端是否正常工作。让处理草图简单地假装它现在正在获取正确的数据,然后您就可以更容易地找出是否存在任何阻塞问题。接下来要做的是整理光电二极管电路。根据我收集的信息,在接地和光电二极管上的“阴极”之间有一个电阻器,然后将阳极连接到模拟输入端。我敢肯定这行不通。

它应该工作的方式(我认为)是将阳极连接到地,将阴极连接到模拟输入引脚。然后通过相当高的电阻将相同的模拟输入引脚连接到电源电压。(大约在兆欧量级)。通过这样做,当光电二极管被反向偏置并且不产生电压时,您可以在电源电压处获得模拟输入。当有光的时候,会有少量的电流允许通过二极管,有足够大的电阻,这个电流到地会导致二极管上出现一个小的伏特降,所以你会在输入端测量一个稍微低一点的值。我认为这应该可以工作。光电二极管和光电晶体管之间也有区别,确保你知道你有哪一个,光电二极管也应该在所描述的集电极取代阴极和发射器取代阳极的电路中工作。这可能需要一个较小的电阻器在集电极侧,但是,1MOhm及更高将太高,大约1k。

但这些都只是我的猜测。我很少使用光电二极管或光电晶体管。

一旦你确定你从arduino/光电二极管方面得到了很好的值,并且你知道你有一个工作的处理草图,那么你可以尝试将两者连接起来。

 类似资料:
  • 我正试图通过(伪)串行连接使用处理从Arduino读取100个传感器数据条目。我使用的加工草图如下: 不幸的是,通常我的data.txt文件中存储的条目不到100个,其中一些条目(大约3-5个)在其中显示换行符。我做错了什么?Arduino IDE的串行监视器未打开!

  • 我对Arduino和Processing都比较陌生,我一直在开发一种利用两者之间串行通信的代码。我的Arduino代码从压电传感器读取并打印数值,然后将数值发送给Processing,Processing根据数值绘制特定形状。该代码以前已经工作过,但由于某种原因,它不再工作。一切都会编译,但当我运行处理代码时,草图窗口是空的,并且仍然是空的。有几次“错误,禁用serialEvent()”出现了,但

  • 我已经用java编写了一段代码来与我的Arduino板通信。它工作得很好。我还可以使用串行监视器与Arduino板通信。 但是,当我试图打开串行监视器时,java程序正在运行(监听连接到电子板的端口,端口32),它没有说, 串行端口“COM 32”已在使用中。尝试退出任何可能正在使用它的程序 这是完整的信息(为了完整起见) 是的,我知道,这是我的java程序,它正在使用端口。但这是否意味着我不能同

  • 我试图在一些python代码和arduino代码之间来回“乒乓”信息。我想定期向arduino代码发送两个设定点(例如,在分钟内),在arduino上读取它们 现在,我无法获得可靠的信息来来回跳转。我在搜索中没有找到任何与此类似的内容,我试图修改的所有内容都不起作用。最接近我的是这个(实际上它并没有在发送和接收之间来回切换): python 阿杜伊诺: 我最终得到的只是重复的相同值(不是实际发送的

  • 我四处寻找,但找不到解决这个问题的办法。我正在用我能想到的最简单的例子来测试这个。这是处理代码: 如果我在串行监视器上查看输出,它会正确打印“012012012012012012012”等,没有任何问题。我写了一个简单的程序在处理中查看数据: 大多数情况下,它会打印垃圾: 偶尔它会输出正确的值: 看起来每个字节都向左移动了3位,尽管我不明白为什么每次运行程序时它的行为都不一样。有趣的是,如果我让a

  • 问题内容: 我有一个Java程序,必须读取Arduino发送的信息。我从这里获取了Java代码。现在,我不太了解它是如何工作的,但是我尝试对其进行修改,并且得到了以下信息: 我创建一个对象串行COM口,我需要在主程序,然后我使用和当我需要它。 效果很好,Arduino获取数据并将其显示在LCD显示屏中。问题是。程序运行时,它会不断从串行端口读取数据(大约每40毫秒一次),但这并不意味着Arduin