0

私がやろうとしているのは、Arudino で作成したタコメーター回路からデータの連続ストリームを読み取り、それを Processing にフィードすることです。以下のコードを使用して成功しました:

どのようにすればよいかわからないのは、データを処理して、特定の値が検出されるたびに Processing でイベントが発生するようにすることです。

編集:私の問題は、への呼び出しmyMovie.loop()がブロッキング呼び出しであるということでした。これは、の命令ポインターがvoid setup()on のままであることを意味しmyMovie.loop()ます。ポインターは と を呼び出しますvoid Draw()movieEvent、シリアル ポートが開始された回線には決して到達しません。

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

提案された解決策は、これらの行を の先頭に移動void Draw()myMovie.loop、 の最後の行にすることでしvoid setup()た。私はこれを試しました(以下のコードはこの変更を反映しています)が、処理中のシリアル入力として「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 rpm にとどまっている場合は、映画を再生したいと考えています。それを下回ったら、映画の再生を止めてほしい。私のArduinoスケッチは機能しています(シリアルポートでデータをうまく読み取ることができます)が、何らかの理由でProcessingでそれを行うことができません。データが入ってきていないようです。これは Arduino に含まれている一連のサンプルに基づいていますが、まだ何も機能していないようです。

4

2 に答える 2

1

ここには複数の問題があり、それらを少し分離する必要があると思います。私が最初に行うことは、今のところ方程式から arduino を削除し、最初に処理側が適切に機能することを確認することです。処理スケッチに、今のところ適切なデータを取得しているように見せるだけで、ブロッキングの問題があるかどうかをより簡単に把握できます。次に行うことは、フォトダイオード回路を整理することです。私が収集したものから、グランドとフォトダイオードの「カソード」の間に抵抗があり、アナログ入力にアノードが接続されています。これはうまくいかないと確信しています。

それが機能する方法は(私が思うに)、アノードをグランドに接続し、カソードをアナログ入力ピンに接続することです。次に、同じアナログ入力ピンをかなり高い抵抗を介して電源電圧に接続します。(メガオームのオーダーのどこか)。これを行うことにより、フォトダイオードが逆バイアスされて電圧を生成していないため、暗いときにアナログ入力が供給電圧になります。光があると、ダイオードに少量の電流が流れ、十分な大きさの抵抗があり、このグランドへの電流によってダイオードに小さな電圧降下が発生するため、デバイスでわずかに低い値を測定します。入力。私はそれがうまくいくと思います。フォトダイオードとフォトトランジスタにも違いがあります。どちらを持っているかを確認してください。フォトダイオードは、コレクタがカソードに置き換わり、エミッタがアノードに置き換わる回路でも機能するはずです。これにはコレクタ側に小さい抵抗が必要になる場合がありますが、1MOhm 以上では高すぎて、約 1k になります。もちろん、フォトダイオードがあることが確実であれば、これは問題ではありません。

しかし、これはすべて私の推測です(っぽい)。私はフォトダイオードやフォトトランジスタをあまり使っていません。

arduino/フォトダイオード側から適切な値が得られていることを確認し、作業中の処理スケッチがあることを確認したら、2 つを接続してみてください。

于 2014-09-25T18:19:30.567 に答える
0

void draw() 関数を試しprint(val);て、値がコンソールに送信されるかどうかを確認してください。val が 0 から変化することはないと思います。

port.bufferUntil('\n');また、両方を使用するべきではないと思いますport.readStringUntil('\n');

一度に 1 つだけ試してください。それが違いを生むかどうかはわかりませんが、ドキュメントでは、私が見ることができる一度に1つしか使用していません。

私も変わるだろう

 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); 
}

お役に立てれば。

于 2014-09-16T17:40:47.010 に答える