1

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

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

  • 時刻Aが信号を送信する場合はTSA
  • B信号を受信する時間はTRB
  • Bへの返信時間はTSB
  • A信号を受信する時間はTRA
  • そのようにTSA < TRB <TSB < TRA
  • それからA測定TA = TRA -TSAし、
  • B対策TB = 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

送信機出力

私の式でわかるように、受信時間はもっと大きくなるはずです。

送信機出力

受信機出力

受信機出力

私のプログラムの問題点を教えていただければ幸いです。

4

1 に答える 1