Программное обеспечение UART Serial - Синхронизация двух разных датчиков с байтами запуска и остановки

Я использую 2 датчика SRF02 на одной плате Arduino, чтобы попытаться передать передатчик только импульс 40 кГц, в то время как приемник будет принимать только поддельный диапазон, то есть собирать показания на основе другой передачи.

Я использую SoftwareSerial и должен знать, как синхронизировать время, которое получатель узнает, когда передатчик отправил данные. Я обнаружил, что мне нужно будет сделать это, используя баны start и stop, чтобы установить их в одном цикле.

Как я могу это сделать?

Это мой текущий код:

#include <SoftwareSerial.h>  
SoftwareSerial mySerial(10,11); // RX, TX 

void SendCmd(unsigned char address,unsigned char cmd) {
  mySerial.write(address);
  //set the address of SRF02(factory default is 0)
  delayMicroseconds(100);
  //serial data is fixed at 9600,N,8,2,so we need some time to create the second stop bit
  mySerial.write(cmd);
  //send the command to SRF02
  delayMicroseconds(100);
  //serial data is fixed at 9600,N,8,2,so we need some time to create the second stop bit
}
void setup(void) {
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("SRF02 TEST!");
}

void loop(void) {
  unsigned int reading;
  SendCmd(0x00,0x5C);
  //Transmit 8 cycle 40khz pulse from address 0x00 - transmitter
  delay(70);
  //time for SRF02 to measure the range
  SendCmd(0x02,0x57);
  //Get Fake Range at Address 0x02 - receiver
  delay(10);
  //wait for some time,let the Arduino receive 2 bytes data from the TX pin of SRF02
  if(mySerial.available()>=2) {
    //if two bytes were received
    reading = mySerial.read()<<8;
    //receive high byte (overwrites previous reading) and shift high byte to be high 8 bits
    reading |= mySerial.read();
    // receive low byte as lower 8 bits
    Serial.print(reading);
    // print the reading
    Serial.println("cm");
    //Serial.println("Time Sent: "); 
    //Serial.print(T_sent);
  }
  delay(250);
  // wait a bit since people have to read the output :)
}
3 голоса | спросил Umbus 25 32015vEurope/Moscow11bEurope/MoscowWed, 25 Nov 2015 05:37:02 +0300 2015, 05:37:02

2 ответа


0

Кодовый бит

SendCmd(0x00,0x5C);//Transmit 8 cycle 40khz pulse from address 0x00 - transmitter
delay(70);//time for SRF02 to measure the range
SendCmd(0x02,0x57); //Get Fake Range at Address 0x02 - receiver

отправит звуковой пакет, задержит 70 мс, а затем начнет прослушивать пакет, который к тому времени пройдет около 24 метров и, вероятно, уже не будет слышен.

Вместо этого вы должны начать прослушивание поддельного диапазона сразу же после отправки пакета. Общая идея для одного подхода заключается в следующем:

  • Время записи (например, t1=micros();)
  • Отправить пакет (например, SendCmd(0,0x5C);)
  • Время записи (например, t2=micros();)
  • Слушайте пакет (например, SendCmd(2,0x58); // Get microseconds)
  • Подождите 70 мс, затем прочитайте результат микросекунд t3
  • Вычислить скорректированные общие микросекунды, tm=t3+t2-t1
  • Преобразование микросекунд в cm

Обратите внимание на использование команды 0x58 вместо 0x57 для получения микросекунд вместо cm. Если вы использовали 0x57 вместо добавления t2-t1 в t3, вы добавили бы t2-t1 microseconds-convert-to-cm к показанию см.

Причиной вычисления tm=t3+t2-t1 является то, что вторая команда выдается около t2-t1 на микросекундах позже первой команды, как объясняется в следующем параграфе.

Существует неизвестная задержка d1 между t1 записывается и когда действует первый SRF02; и существует неизвестная задержка d2 между t2, и когда второй SRF02 начинает прослушиваться. Правильная сумма для добавления в t3 является t2+d2-(t1+d1), который является t2-t1, если d1 равно d2, более или менее правдоподобное предположение. Если ваши эксперименты обнаруживают постоянную ошибку, добавьте небольшое постоянное смещение для компенсации.

Я сомневаюсь, что вы должны иметь инструкции delayMicroseconds(100); в SendCmd(), и рекомендовал бы, чтобы код работал нормально, а затем посмотрите, все ли работает, когда вы их вынимаете. delay(10); не требуется, если вы правильно переписываете свой 2-символьный-ожиданий (т. Е. Как while, а не if), а delay(70); не требуется, если вы начинаете преобразование с помощью команды 0x5A, "Fake Ranging Mode - Результат в сантиметры, автоматически Tx возвращаются к контроллеру, как только ранжирование завершено », а затем должным образом ожидайте прибытия двух символов вместо слепого ожидания, после чего следует тест, если они были получены.

ответил James Waldby - jwpat7 25 32015vEurope/Moscow11bEurope/MoscowWed, 25 Nov 2015 09:19:55 +0300 2015, 09:19:55
0
 unsigned int reading;
  unsigned long t1=micros();
  SendCmd(0, 0x5C);//send pulse with transmitter
  unsigned long t2=micros();
  SendCmd(2, 0x58);//return value in microseconds

  delay(70);//time for SRF02 to measure the range
  //SendCmd(0x02,0x5E);
  unsigned long t3 = SendCmd(2,0x5E);
  unsigned long tm = t3+t2-t1;

Привет, спасибо за ввод. Когда я создал t3, я получаю сообщение об ошибке, в котором значение void не игнорируется, как должно быть.

ответил Umbus 25 32015vEurope/Moscow11bEurope/MoscowWed, 25 Nov 2015 10:48:05 +0300 2015, 10:48:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132