1

斜辺が特定の範囲に入ったときに LED を点滅させようとしています。しかし、斜辺範囲の値を必要以上に通過しているようです。正常に戻る前に、LED が約 30 ~ 40 回点滅します。この問題を解決する方法がわかりません。

これは私の処理コードです:

import processing.serial.*;

float r_height; // rise of the slope
float r_width; // run of the slope
float hypotnuse; // hypotenuse of the right angle
int d = 20; // diameter of the chocolate
float x ; // x of the chocolate destination
float y ; // y of the chocolate destination
int ledGlow; // how much the LED will glow

Serial myPort;  // serial port object

void setup () {

  size (510, 510); // size of the canvas
  String portName = Serial.list()[8]; // my arduino port
  myPort = new Serial(this, portName, 9600); 
  background (0); // color of the background
  fill(204); // fill of the ellipse
  ellipseMode (CORNER); //Ellipse mode
  x = 0; //The placement on initial X for chocolate
  y = 0; // the placement on initial Y for chocolate
  ellipse (x, y, d, d); // ellipse
  frameRate (30);

}

void draw () {

  r_height = mouseY - y; // rise
  r_width =  mouseX - x; //run
  hypotnuse = sqrt (( (sq(r_height)) + (sq (r_width)))); //A^2 +B^2 = C^2
  ledGlow = 255 - (round (hypotnuse/2.84)); // flipping the values
   myPort.write(ledGlow); // The value being sent to the Arduino
  println (ledGlow);


  } 

これはarduinoのコードです:

float val; // Data received from the serial port
int ledPin = 9; 


void setup() {
  pinMode(ledPin, OUTPUT); // Set pin as OUTPUT
  Serial.begin(9600); // Start serial communication at 9600 bps
}

void loop() {
  if (Serial.available()) 
  { // If data is available to read,
    val = Serial.read(); // read it and store it in val

    // long steps2move = val.toInt();
  }

  if (val > 230) {

    analogWrite (ledPin, 255) ; // I have already tried digitalWrite
    delay (100);
    analogWrite (ledPin, 1) ;
    delay (100);

  } 

  else if  (val < 230) {
    analogWrite(ledPin, val);
  }
}

更新された ARDUINO:

float val; // Data received from the serial port
int ledPin = 9; // Set the pin to digital I/O 13
unsigned long currentTime  = 0; 
unsigned long pastTime     = 0; 
int currentState = 0; 
int wait         = 0; 

void setup() {
  pinMode(ledPin, OUTPUT); // Set pin as OUTPUT
  Serial.begin(9600); // Start serial communication at 9600 bps
}

void loop() {
  if (Serial.available()) 
  { // If data is available to read,
    val = Serial.read(); // read it and store it in val

    // long steps2move = val.toInt();
  }



  if (val > 230) {

  pastTime = currentTime; 
  currentTime = millis();   

  unsigned long timePassed = currentTime - pastTime;
  if(timePassed >= wait) 
  {
    switch(currentState ) 
    {
      case 0:                  
        digitalWrite(9, HIGH); 
        wait  = 500;   
        currentState = 1;     
        break;            

      case 1:
        digitalWrite(9, LOW); 
        wait  = 500;  
        currentState = 0;
       break;
    }
  }

  } 

  else if  (val < 230) {
    analogWrite(ledPin, val/2);
  }
}
4

1 に答える 1

2

処理コードは、おそらくシリアルに絶えず書き込んでいます。ただし、斜辺が設定した範囲に入ると、Arduino はそれらのdelay()呼び出しを行います。それが遅延の原因になると思うので、遅延中に入ったシリアルデータのバックログをクリアしている間、点滅し続けます。

より良いアプローチは、まったく使用しないことだと思いますdelay()。そうすれば、Arduino はシリアル データをできるだけ速く処理できます。各ループでは、最初に最新のシリアル データを取得する必要があります (存在する場合)。これに基づいて、LED が現在何をすべきか (つまり、点滅すべきかどうか、あるいはどのような明るさであるべきか) を把握して保存する必要があります。

その後、(実際にシリアル データを受信したかどうかに関係なく)、LED は保存された状態から更新できます。delay()ただし、点滅には使用しないでください。代わりに、最後に点滅した時間を追跡し、それから 100 ミリ秒が経過したかどうかを調べることができます (を使用millis())。その場合は、オフにします。さらに 100 ミリ秒経過したら、スイッチを入れ直します。

このアプローチは、フラッシュのタイミングをシリアル データから分離するため、うまく機能するはずです。

于 2013-10-22T15:14:55.627 に答える