Дальномер URM37 не видит дальше 21 см

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Bumbr, 10 окт 2014.

  1. Bumbr

    Bumbr Нуб

    Подключил два датчика 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 см расстояния.
    В чем может быть проблема?
     
  2. Bumbr

    Bumbr Нуб

    Увеличил последний delay в loop'е.
    При delay(500) датчики видят на 4,5 метра.
    При delay(250) датчики видят на 3 метра.
    При delay(100) датчики видят на 2,5 метра.
    Иногда возвращает -11 при больших расстояниях, но как правило даже дистанции выше максимальной выдаёт просто максимальное значение вместо ошибки.
     
    Последнее редактирование: 11 окт 2014
  3. Unixon

    Unixon Оракул Модератор

    Вы неправильно работаете с Serial. Сначала проверяете наличие всего одного байта "if(Serial1.available()>0)", а потом делаете подряд несколько Serial.read(), уже никак не пытаясь убедиться в доступности данных. Либо проверяйте условие "if(Serial1.available()>=4)" (сколько байт должно быть принято), либо делайте проверку-ожидание перед каждым чтением. Проблема может быть и в другом, но это - ошибка.
     
  4. Bumbr

    Bumbr Нуб

    Тоесть просто заменить if(Serial1.available()>0) на if(Serial1.available()>=4) и соответственно для Serial2?
    Пока с добавлением delay работает вроде достаточно точно без ошибок.
     
  5. Unixon

    Unixon Оракул Модератор

    В угадайку играете (примет - не примет, успеет - не успеет) ?