2つのArduino間の経過時間をマイクロ秒で取得する

2015-03-08 arduino distance measurement elapsedtime time-measurement

マイクロ秒 rx / txモジュールを使用して、2つの間の経過時間を測定したいと思います。コードを作成したところ、出力に問題があることに気付きました。あなたが助けてくれるといいのですが。

A (デバイス1)とB (デバイス2)の両方が、ローカルクロックを使用して時間遅延を正確に測定します。

  • Aが信号を送信する時間がTSA場合、
  • Bが信号を受信する時間はTRB
  • Bが応答する時間はTSB
  • Aが信号を受信する時間はTRA
  • TSA < TRB <TSB < TRAであるような
  • 次に、 ATA = TRA -TSA
  • BTB = TSB - TRB測定します。

TOFは、次の2つの測定値を組み合わせることで推定できます。

  • Total time elapsed = (TA-TB)/2

トランスミッターコード

#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

const int transmit_pin = 12;
const int receive_pin = 11;
char *c;

unsigned long received, sends, elapsed;

void setup() { 
    Serial.println();
    Serial.begin(9600); // Debugging only

    //transmitter settings
    pinMode(13, OUTPUT)
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_set_tx_pin(12);
    vw_setup(1000); // speed of data transfer Kbps

    //receiver settings
    Serial.println();
    Serial.begin(9600); // Debugging only
    vw_set_rx_pin(11);
    vw_rx_start(); 
}

void loop() {
    //Transmitter
    digitalWrite(13, 1);
    c = "1";
    vw_send((uint8_t *)c, strlen(c));
    vw_wait_tx(); //Wait until the whole message is go
    delay(1000); // for debounce
    sends=micros();

    //Receiver
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    if (vw_get_message(buf, &buflen)) { // Non-blocking
        for(int i = 0;i < buflen;i++) {
            if(buf[i] == '2') { 
                digitalWrite(13, 0);
                delay(1000); // for debounce
                received=micros();
                elapsed=(received-sends);

                Serial.print(sends);
                Serial.println(" TRANSMITTED TIME");
                Serial.print(received);
                Serial.println(" RECEIVED TIME");
                Serial.print(elapsed);
                Serial.println(" microseconds elapsed");
            }
        }  
    }
}

受信者コード

#include <VirtualWire.h>
const int receive_pin = 11;
const int transmit_pin = 12;

char *chars;

unsigned long received, sends;


void setup() {
    Serial.println();
    Serial.begin(9600); // Debugging only
    //transmitter settings

    vw_set_ptt_inverted(true); // Required for DR3100
    vw_set_tx_pin(12);
    vw_setup(1000); // speed of data transfer Kbps

    //receiver settings
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_set_rx_pin(11);
    vw_setup(1000); // Bits per sec
    pinMode(13, OUTPUT);
    vw_rx_start(); // Start the receiver PLL running
}

void loop() {
    //Receiver
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    digitalWrite(13, 1);
    if (vw_get_message(buf, &buflen)) { // Non-blocking
        for(int i = 0;i < buflen;i++) {
            if(buf[i] == '1') { 
                received=micros();

                //Transmitter
                chars = "2";
                vw_send((uint8_t *)chars, strlen(chars));
                vw_wait_tx(); // Wait until the whole message is gone
                digitalWrite(13, 0);
                delay(1000);
                sends=micros();

                Serial.print(received);
                Serial.println(" RECEIVED TIME");
                Serial.print(sends);
                Serial.println(" TRANSMTTED TIME");   
            }
        }
    }
}//End for Loop

送信機出力

受け取った時間は、私の公式でわかるように、もっと長くなるはずです。

送信機出力

レシーバー出力

レシーバー出力

私のプログラムの何が問題なのか、私を助けてくれるといいのですが。

Answers

あなたのコードを読む:

delay(1000);
sends=micros();                        // timestamp <SEND>

uint8_t buf[VW_MAX_MESSAGE_LEN];       // time to process is ε
uint8_t buflen = VW_MAX_MESSAGE_LEN;   // time to process is ε
if (vw_get_message(buf, &buflen)) {    // time to process is ε
    for(int i = 0;i < buflen;i++) {    // time to process is ε
        if(buf[i] == '2') {            // time to process is ε
            digitalWrite(13, 0);       // time to process is ε
            delay(1000);               // time to process is 1000000µs
            received=micros();         // timestamp <RECV>
            elapsed=(received-sends);

/* That means that in the following statements, all you'll see is
   that the difference between received and sends is 1000000µs + a few ε µs
   which is totally in line with your shown results */

            Serial.print(sends);       
            Serial.println(" TRANSMITTED TIME");
            Serial.print(received);
            Serial.println(" RECEIVED TIME");
            Serial.print(elapsed);
            Serial.println(" microseconds elapsed");
        }
    }  
}

結論として、あなたはあなたの式のいくつかの要素を忘れていると思います:

  1. また、処理時間(すべてのεの合計)も測定します
  2. sleep時間を測定しています(1000000µsの遅延)

これは実際のrx / txを実際に表しているのではなく、コードで何をしているのかを示しています。だからあなたは式が本当に間違っているわけではありません、それはあなたのコードがそれを実装していないというだけです。

つまり、メッセージのpingエコー時間は1000032µsよりもはるかに速いため、 <SEND>タイムスタンプと<RECV>タイムスタンプの間のプログラムのループ速度だけが測定されます。これは、1000000µsの待機であり、 32µsの処理。

Related