Подключил два датчика URM37 подключил к Arduino Mega к Serial1 и Serial2. Использую такой скетч адаптированный из примера DistanceByHardwareSerial: Код (Text): // # Product name: URM V3.2 ultrasonic sensor TTL connection with Arduino // # Description: // # The sketch for using the URM37 from DFRobot to read values (0-300) from an ultrasound sensor (3m sensor) // # and writes the values to the serialport // # Connection Sensor 1: // # Pin A0 (Arduino MEGA 54) -> Pin 1 VCC (URM V3.2) // # GND (Arduino MEGA) -> Pin 2 GND (URM V3.2) // # Pin 18 (Arduino MEGA) -> Pin 9 TXD (URM V3.2) // # Pin 19 (Arduino MEGA) -> Pin 8 RXD (URM V3.2) // # Connection Sensor 2: // # Pin A1 (Arduino MEGA 55) -> Pin 1 VCC (URM V3.2) // # GND (Arduino MEGA) -> Pin 2 GND (URM V3.2) // # Pin 16 (Arduino MEGA) -> Pin 9 TXD (URM V3.2) // # Pin 17 (Arduino MEGA) -> Pin 8 RXD (URM V3.2) // # int URPower = 54; // Ultrasound sensor 1 power pin int URPower2 = 55; // Ultrasound sensor 2 power pin int val = 0; int val2 = 0; int USValue = 0; int USValue2 = 0; int timecount = 0; // Echo counter boolean flag=true; uint8_t DMcmd[4] = { 0x22, 0x00, 0x00, 0x22}; //distance measure command void setup() { Serial.begin(9600); // Sets the baud rate to 9600 Serial1.begin(9600); // Sets the baud rate sensor 1 to 9600 Serial2.begin(9600); // Sets the baud rate sensor 2 to 9600 Serial.println("Init the sensor"); pinMode(URPower, OUTPUT); pinMode(URPower2, OUTPUT); digitalWrite(URPower, HIGH); // Set to High digitalWrite(URPower2, HIGH); // Set to High delay(200); //Give sensor some time to start up --Added By crystal from Singapo, Thanks Crystal. } void loop() { flag = true; //Sending distance measure command : 0x22, 0x00, 0x00, 0x22 ; for(int i=0;i<4;i++) { Serial1.write(DMcmd[i]); } for(int i=0;i<4;i++) { Serial2.write(DMcmd[i]); } delay(40); //delay for 75 ms unsigned long timer = millis(); while(millis() - timer < 30) { if(Serial1.available()>0) { int header=Serial1.read(); //0x22 int highbyte=Serial1.read(); int lowbyte=Serial1.read(); int sum=Serial1.read();//sum if(header == 0x22){ if(highbyte==255) { USValue=65525; //if highbyte =255 , the reading is invalid. } else { USValue = highbyte*255+lowbyte; } Serial.print("Distance="); Serial.println(USValue); delay(50); flag=false; } else{ while(Serial.available()) byte bufferClear = Serial.read(); break; } if(Serial2.available()>0) { int header=Serial2.read(); //0x22 int highbyte=Serial2.read(); int lowbyte=Serial2.read(); int sum=Serial2.read();//sum if(header == 0x22){ if(highbyte==255) { USValue2=65525; //if highbyte =255 , the reading is invalid. } else { USValue2 = highbyte*255+lowbyte; } Serial.print("Distance 2="); Serial.println(USValue2); delay(50); flag=false; } else{ while(Serial.available()) byte bufferClear = Serial.read(); break; } } } delay(20); } } Датчики работают нормально, достаточно точно определяют расстояние в пределах 20 см. По умолчанию датчики всегда выдают 21 см расстояния. В чем может быть проблема?
Увеличил последний delay в loop'е. При delay(500) датчики видят на 4,5 метра. При delay(250) датчики видят на 3 метра. При delay(100) датчики видят на 2,5 метра. Иногда возвращает -11 при больших расстояниях, но как правило даже дистанции выше максимальной выдаёт просто максимальное значение вместо ошибки.
Вы неправильно работаете с Serial. Сначала проверяете наличие всего одного байта "if(Serial1.available()>0)", а потом делаете подряд несколько Serial.read(), уже никак не пытаясь убедиться в доступности данных. Либо проверяйте условие "if(Serial1.available()>=4)" (сколько байт должно быть принято), либо делайте проверку-ожидание перед каждым чтением. Проблема может быть и в другом, но это - ошибка.
Тоесть просто заменить if(Serial1.available()>0) на if(Serial1.available()>=4) и соответственно для Serial2? Пока с добавлением delay работает вроде достаточно точно без ошибок.