Проблемы с дальномером URM37

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Vasiliy, 18 июн 2011.

  1. Vasiliy

    Vasiliy Нуб

    Здравствуйте.

    Я подключил дальномер URM37 к Arduino ATMega8. Взял программку, заставляющую дальномер делать замеры каждые полсекунды. После каждого запроса, дальномер выдаёт два байта (High Byte и Low Byte), которыми кодирует расстояние.
    Все работает замечательно, пока расстояние до замеряемого объекта меньше метра с небольшим. Когда же расстояние становится больше, дальномер начинает вести себя странно. Сначала он выдаёт все единички (т.е. High Byte = 255 и Low Byte = 255). После, даже когда расстояние снова становится меньше метра, он не выдаёт адекватные цифры: он выдаёт одни нули (т.е. High Byte = 0 и Low Byte = 0) при расстонянии меньше метра и одни единицы при расстоянии больше метра.

    Подскажите, пожалуйста, в чём может быть дело.
    Заранее благодарю.

    Вот код, записанный на Arduino:
    Код (Text):
    /* Ultrasound Sensor
    * URM V3.2 ultrasonic sensor TTL connection with Arduino
    * Reads values (0-300) from an ultrasound sensor (3m sensor)
    * and writes the values to the serialport.
    * Pin12 (Arduino)-> Pin 1 VCC (URM V3.2)
    * GND (Arduino) -> Pin 2 GND (URM V3.2)
    * Pin11 (Arduino) -> Pin 7 (URM V3.2)
    * Pin 0 (Arduino) -> Pin 9 (URM V3.2)
    * Pin 1 (Arduino) -> Pin 8 (URM V3.2)
    * www.yerobot.com
    * Last modified 20/04/2009
    */

    int UREnable = 13; // Ultrasound enable pin
    int URPower = 12; // Ultrasound power pin
    int val = 0;
    int USValue = 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
       pinMode(UREnable, OUTPUT);
       digitalWrite(UREnable, HIGH); // Set to High
        pinMode(URPower, OUTPUT);
       digitalWrite(URPower, 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++)
      {
        Serial.print(DMcmd[i],BYTE);
      }

      delay(75); //delay for 75 ms

    while(flag)
    {
        if(Serial.available()>0)
        {
            int header=Serial.read(); //0x22
            int highbyte=Serial.read();
            int lowbyte=Serial.read();
            int sum=Serial.read();//sum

            if(highbyte==255)
            {
              USValue=240;  //if highbyte =255 , the reading is invalid.
            }
            else
            {
              USValue = (highbyte*255+lowbyte)/270;
            }

           Serial.print("Distance=");
           Serial.print(USValue);
           Serial.print("\n");

           flag=false;
         }
    }
      delay(500);
    }
     
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Василий, здравствуйте!

    Ох начебурахался я с этим сенсором. В нём много нюансов, но он работает как надо если разобраться. Итак, step-by-step:
    1. Убедитесь, что он настроен на работу в TTL режиме. Т.е. 2 джампера, которые рядышком должны быть ближе к центру платы, а одинокий джампер нужно снять и выкинуть. По умолчанию, на заводе, джамперами установлен режим RS232, т.е. ожидается работа на диапазоне -15/+15 В. Arduino нужен TTL, т.е. от 0/5 В.
    2. Соедините всё следующим образом (URM — Arduino):
    • +5V — +5V
    • GND — GND
    • nRST, PMW, Moto, Comp/Trig — никуда
    • NC — +5V
    • RXD — pin 7
    • TXD — pin 6
    1. Используйте готовую библиотеку от Майлса Бёртона. Она позволяет коммуницировать с дальномером, не занимая аппаратный Serial-port на ногах 0 и 1, и сводит к минимуму синхронные блокировки на чтении показаний. В описанном мной случае комуникация пойдёт через ноги 6 и 7, можете выбрать любые другие. В вашем примере мне, если честно, вообще не понятно как вы получили хоть какие-то показания: ведь вы используете Serial и для общения с компом, и для командования дальномером, они не могут разобраться кому что предназначается. В архиве с библиотекой есть пример MeasurementBySoftwareSerial. Это то, что нужно! Я проверял его собственноручно с нашими сенсорами — работает как часы.
    Если останутся вопросы — пишите, решим :cool:
     
  3. Vasiliy

    Vasiliy Нуб

    Дело в том, что библиотека Майлса Бёртона использует билиотечку NewSoftSerial, которая не поддерживает ATMega 8. Однако в примерах в этой библиотеке как раз содержится код, который и был здесь мною показан (DistanceByHardwareSerial). Этот код, как видно, не использует саму библиотеку URM37 Майлса Бёртона.

    Сейчас у нас появилась ATMega 168, и мы смогли подключить данную библиотеку (запусить пример MeasurementBySoftwareSerial). Всё заработало.
    С ATMega 8 я так и не разобрался. Возможно, дело действительно в том, что Serial используется и для общения с дальномером и для вывода информации.

    Спасибо за помощь :)


     
  4. elefant

    elefant Нуб

    Тут тоже возникла проблема, при подключении, как описано выше, я все время получаю сообщение "Timeout". Это в примере MeasurementBySoftwareSerial (немного модифицированном), на плате mega 25560.
    Код (Text):
    #include <LiquidCrystal.h>
    #include "URMSerial.h"

    // The measurement we're taking
    #define DISTANCE 1
    #define TEMPERATURE 2
    #define ERROR 3
    #define NOTREADY 4
    #define TIMEOUT 5

    URMSerial urm;

    LiquidCrystal lcd(15, 16, 14, 20, 19, 18);

    int sensorValue = 0;

    void setup() {
      // set up the LCD's number of columns and rows:
      lcd.begin(20, 4);
      urm.begin(6,7,9600);
    }

    void loop() {
      lcd.setCursor(0, 0);
      lcd.print(getMeasurement());
      delay(500);
    }

    int value; // This value will be populated
    int getMeasurement()
    {
      // Request a distance reading from the URM37
      switch(urm.requestMeasurementOrTimeout(DISTANCE, value)) // Find out the type of request
      {
      case DISTANCE: // Double check the reading we recieve is of DISTANCE type
        //    Serial.println(value); // Fetch the distance in centimeters from the URM37
        return value;
        break;
      case TEMPERATURE:
        return value;
        break;
      case ERROR:
        lcd.print("Error");
        break;
      case NOTREADY:
        lcd.print("Not Ready");
        break;
      case TIMEOUT:
        lcd.print("Timeout");
        break;
      }

      return -1;
    }
     
    Может кто-нибудь подскажет, в чем может быть проблема?
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    Я тоже долго получал timeout'ы, уже опускались руки, но в последний момент обнаружил, что были перепутаны местами RX и TX контакты. Уверены на 100%, что всё абсолютно правильно подключили? В особенности: RX к TX, и TX к RX
     
  6. elefant

    elefant Нуб

    Даже если поменять местами, результат не меняется :(
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Джамперы на задней стороне, точно настроены в режим TTL? Не RS-232.

    Очень помогло бы фото вашего соединения и код программы.
     
  8. elefant

    elefant Нуб

  9. aysheka

    aysheka Нерд

    Очень долго возился с сенсором URM37, но так и не смог разобраться, может кто нибудь сможет помочь.

    Подключил сенсор из этого примера выше постом, вроде все работает (температура отдается), но при отправке сообщения на получение дальности получаю Error. Расковыряв библиотечку Бертона и собственно сам протокол нашел что на получении дальности отдается пакет, где data0 и data1 = 0xFF т.е. ошибка.
     
  10. Dmitriy Kunin

    Dmitriy Kunin Гик

    У меня завелось всё и сразу, никак не дойдут руки до написания второй половины статьи, но всё, что написано в первой, вполне жизнеспособно...
    Неоконченая статья для wiki
     
  11. aysheka

    aysheka Нерд

    Возможно часть сенсора отвечающего за определении дальности вышла из строя.
    Странно, в вашей статье вы используете всего 4 контакта URM37, NC(как в примере) нигде не задействован и все работает.
     
  12. Dmitriy Kunin

    Dmitriy Kunin Гик

    Ну, а чего тут странного?
    У кошки четые ноги: вход, выход, земля и питание :)
     
  13. AlkoFighter

    AlkoFighter Нуб

    Добрый день, Уважаемые комрады.
    Кто-нибудь пробовал подключить URM37 V3.2 к Arduino Mega 2560?
    Перечитал все что возможно, вожусь с ним уже 4 дня.
    В программе MeasurementBySoftwareSerial получаю Time Out -1.
    В DistanceByHardwareSerial выводит очень большие значения как положительные, так и отрицательные - динамики не улавливаю.
    В редакции программы DistanceByHardwareSerial Vasiliy выдает адекватные значения, но при дистанции больше метра начинает выдавать отрицательные значения, а позже вообще скидывается на ноль.
    Джамперы переставлены, все подключено верно, совершенно точно. Все варианты подключения испробованы.
    Может кто поделится опытом?
     
  14. Dmitriy Kunin

    Dmitriy Kunin Гик

    С софтовой библиотекой 2560 действительно не работает, кто-бы объяснил почему...
    С хардверной у меня работало абсолютно как с софтовой на Уно, показания были одинаковые.
     
  15. AlkoFighter

    AlkoFighter Нуб

    А к каким выходам на меге подключали?
     
  16. Dmitriy Kunin

    Dmitriy Kunin Гик

  17. AlkoFighter

    AlkoFighter Нуб

    Странно. Вобщем я забил на программу MeasurementBySoftwareSerial потому что кроме timeout -1 получить ничего не выходит.
    Начал ковырять программу DistanceByHardwareSerial by Vasiliy.
    Может пояснит кто вот эту строчку USValue = (highbyte*255+lowbyte)/270;?
    Причем непонятно почему, но lowbyte в этой формуле не учитывается. Программа выводит USValue=highbyte*0.944.
    И что самое интересное highbyte это и есть точное расстояние (весь вечер сегодня измерял), не понятно зачем вводится переменная USValue с поправкой непонятно на что.
    Проблемы о которых писал Vasiliy остались так же.

    Вобщем одни вопросы.
     
  18. AlkoFighter

    AlkoFighter Нуб

    На Mega 2560 не работает СофтСириал, потому что на этой плате он не поддерживается. На ней Хардовых 4 штуки. Сейчас на пиндосовском сайте вычитал.
     
  19. А где найти эту Ultrasonic?
     
  20. Уже удалил тот пост...Это сказано было не про urm датчик,а HC-SR04!