rx/tx モジュールを使用して、2 つのarduino間の経過時間をマイクロ秒単位で測定したいと考えています。コードを作成しましたが、出力に何か問題があることに気付きました。あなたが私を助けてくれることを願っています。
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
送信機出力
私の式でわかるように、受信時間はもっと大きくなるはずです。
受信機出力
私のプログラムの問題点を教えていただければ幸いです。