1

私はプロジェクトのために Arduino をプログラムする必要があり、LED の色を変えるものを追加したいと思いました。LED には、色が変化する一種の循環があり、約 40 秒かかります。ただし、LED を点灯させるバット センサーは、全体の時間を記録し、1 秒間に数回 LED に点灯するように指示します。LED は色を変える時間がなく、最初の色だけを維持します。

これを修正する方法がわかりません。LEDに遅延か何かを与えようとしていましたが、どうやらそれは間違っていました。これまでのコードは次のとおりです。

//Pin which triggers ultrasonic sound.
const int pingPin = 13;

//Pin which delivers time to receive echo using pulseIn().
int inPin = 12;

//Range in cm which is considered safe to enter, anything
//coming within less than 5 cm triggers the red LED.
int safeZone = 10;

//LED pin numbers
int redLed = 3, greenLed = 5;

void setup() {
    //Initialize serial communication
    Serial.begin(9600);

    //Initializing the pin states
    pinMode(pingPin, OUTPUT);
    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
}

void loop()
{
    //Raw duration in milliseconds, cm is the
    //converted amount into a distance.
    long duration, cm;

    //Sending the signal, starting with LOW for a clean signal 2 staat voor reactie.
    digitalWrite(pingPin, LOW);
    delayMicroseconds(2);
    digitalWrite(pingPin, HIGH);

    //Setting up the input pin, and receiving the duration in
    //microseconds for the sound to bounce off the object in front.
    pinMode(inPin, INPUT);
    duration = pulseIn(inPin, HIGH); //Documentation for pulseIn(): 
                                     //http://www.arduino.cc/en/Reference/PulseIn

    //Convert the time into a distance
    cm = microsecondsToCentimeters(duration);

    //Printing the current readings to the serial display
    Serial.print(cm);
    Serial.print("cm");
    Serial.println();

    //If het is groter dan 10 dan gaat het lichtje uit
    //else het is binnen bepaalde cm dan gaat het aan van 0 naar 255.
    if(cm>10)
    {
        analogWrite(redLed, 0);
    }
    else{
        analogWrite(redLed, map(cm,0,10,255,0));
        dela
    }

    if(cm>5)
    {
        analogWrite(greenLed, 0);
    }
    else{
        analogWrite(greenLed, map(cm,0,5,255,0));
    }

    delay(100);
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

しかし、それにはまだある種の遅延が必要だと思います。私が使用しているセンサーが何と呼ばれているかはわかりませんが、センサーを備えた2つのラウンドがあり、1つは送信し、もう1つは受信し、音を受信するのにかかる時間を測定し、私のコードではそれをcmに変換します.

私はこの言語の知識が非常に乏しいので、私の問題が何であるかを理解して助けてくれることを願っています.

4

2 に答える 2

0

delay(ms)必要に応じて 40 ミリ秒遅らせるために使用します。これにより、超音波センサーからのデータを処理する前に、Arduino が 40 ミリ秒シャットダウンされます。

于 2012-11-06T03:07:53.057 に答える
0

pulseInのタイムアウト値を設定します。duration = pulseIn(inPin, HIGH);そうしないと、前の超音波パルスでエコーが発生しなかった場合に別の超音波パルスを送信する機会が得られないため、プログラムがスタックしてしまいます。

この場合、最大範囲は 10 cm (音響パルスの移動距離は 20 cm) であるため、それに応じてタイムアウト値を設定できます (s は距離、v は速度、t は時間)。

s = v * t  => t = s / v = 2 * 0.1 m / 343.2 m/s = 582.8 µs

音速は、20 °C の乾燥空気中と仮定されます。

発信パルス幅 2 µs を考慮すると、合計時間は 584.8 µs になります。

それ以外の

duration = pulseIn(inPin, HIGH);

使用する

duration = pulseIn(inPin, HIGH, 585);

その他の注意事項:

  1. 発信パルスは非常に短く、2 µs を想定しています。

  2. digitalWrite() は非常に遅く、約 5 µs であるため、実際のパルスは 2 µs より長くなる場合があります。それでも、超音波トランスデューサーはそのような短時間で起動できない場合があります。

  3. 送信パルスが思ったよりも長くても、1 周期程度です (超音波トランスデューサが 100 kHz で動作する場合、周期は 10 μs です)。

これが問題ではないことを確認するために、より長い範囲とより長い発信パルスを試してみてください。

于 2012-11-06T03:50:30.060 に答える