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

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

  1. wellgold

    wellgold Нуб

    Здравствуйте!
    Вчера стал счастливым обладателем меги 2560 и URM37.
    Скачал библиотеку от Бартона, выполнил всё по инструкции в вашей статье. Пытаюсь работать с примером "DistanceByHardwareSerial". Но при попытки свалидировать код (и при аплоаде) выдаёт следующий эксепшн:

    DistanceByHardwareSerial.cpp: In function 'void loop()':
    DistanceByHardwareSerial.pde:-1: error: 'BYTE' was not declared in this scope

    As of Arduino 1.0, the 'BYTE' keyword is no longer supported.
    Please use Serial.write() instead.

    Я заменил данный параметр сначала на DEC, а потом вообще убрал. Он скомпилировался, но постоянно выдаёт значение "340034"
    Код:
    /* 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 = 11; // Ultrasound enable pin
    int URPower = 12; // Ultrasound power pin
    int val = 0;
    int USValue = 0;
    int timecount = 0; // Echo counter
    int ledPin = 13; // LED connected to digital pin 13
    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(ledPin, OUTPUT); // Sets the digital pin as output
    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);
    }

    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=65525; //if highbyte =255 , the reading is invalid.
    }
    else
    {
    USValue = highbyte*255+lowbyte;
    }

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

    flag=false;
    }
    }
    delay(50);
    }


    Буду вам признателен за помощь!
     
  2. Витя

    Витя Гик

    Код (Text):
    for(int i=0;i<4;i++)
    {
      Serial.print(DMcmd);
    }
    Тут не правильно. Задумано посылать было 4 байта а вы посылаете сразу строкой целой 4 раза причем если в памяти там нет нуля после 4 байта то вообше неизвестно что посылается. Нужно если BYTE почему-то не работает вот так хотя бы
    Код (Text):
    Serial.write(DMcmd[i])
     
    wellgold нравится это.
  3. wellgold

    wellgold Нуб

    Спасибо!
    Дальнейший разбор полёта привёл к пинам. Похоже контроллер который держит связь с компом (USB), сидит на той же шине что и датчик (TX0, RX0). Не подскажите как использовать другую шину (пару RX TX) в коде? Например (TX1, RX1).
    Заранее, спасибо!
     
  4. Артем

    Артем Нуб

    Здравствуйте уважаемые покорители URM37 ;-)
    На сколько я понял в последней версии (Arduino 1.0) эту команду следует записывать в следующем виде:

    for(int i=0;i<4;i++)
    {
    Serial.print((byte)DMcmd);
    }

    С вашим кодом и моей поправкой, Serial monitor мне выдает значения расстояния не соответствующие действительности: Distance=29441340034Distance=29441340034Distance=29441340034

    Когда я работаю с DistanceByHardwareSerial - Serial monitor выдаёт значение "340034"

    Когда пробую MeasurementBySoftwareSerial компилятор выдает: 'class URMSerial' has no member named 'requestMeasurementOrTimeout'
    И далее с вытекающими.

    Какие есть мнения по этому поводу?
    Хотелось бы всё же осилить сей девайс.
    Заранее спасибо.
     
  5. Артем

    Артем Нуб

    http://quadmotor.org/doku.php - думаю вам сюда.
     
  6. Витя

    Витя Гик

    Не, приведение к байту не имеет смысла так как массив сам состоит из байт. uint8_t - это бесзнаковое целое число из 8 бит. Тут главное квадратные скобки как я выше написал иначе вот так будет послано 4 раза первое число - 0x22. А нужно послать 0x22, 0, 0, 0x22. Только после этого заработает датчик иначе без этой команды он получается не работает. У меня его нет, проверить не могу но по примеру программы это понятно.
     
    wellgold нравится это.
  7. wellgold

    wellgold Нуб

    Таки с этой статьи и начал :)
    Попробую сформулировать задачу по другому:
    У меня есть 3 датчика (вперёд, вправо и влево) нужно считывать с них показания и выбрасывать их в СOM порт на компьютер. При опросе этих датчиков, их надо как-то идентифицировать на Меге что бы понимать какой именно датчик показывает то или иное расстояние. На Меге, 4 шины RX TX, собственно вопрос: как считывать с конкретной шины данные и как понять по какой шине идёт обмен данных с компьютером.
    Почему я на это обратил внимание: При попытке прошить ардуино с подключенной шиной (TX0, RX0), ничего не получалось. Всё зависало. Да и получаемые данные (34, 0, 0, 34), о которых я писал в первом своём посте похоже отправляются не на девайс а на комп. А может и туда и туда. Но наврядли, т.к. больше ничего не происходило, а значит до дейвайса информация "не дошла".
    Заранее, спасибо за ответ!

    P.S. Нормально скомпилировался следующий вариант:
    Код (Text):
    Serial.write(DMcmd[i])


    Хотя работоспособность пока проверить не могу из-за проблем с шиной.
     
  8. wellgold

    wellgold Нуб

    Нашёл, спасибо! Буду пробовать.

    Код (Text):
    The Arduino Mega has three additional serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX). To use these pins to communicate with your personal computer, you will need an additional USB-to-serial adaptor, as they are not connected to the Mega's USB-to-serial adaptor. To use them to communicate with an external TTL serial device, connect the TX pin to your device's RX pin, the RX to your device's TX pin, and the ground of your Mega to your device's ground. (Don't connect these pins directly to an RS232 serial port; they operate at +/- 12V and can damage your Arduino board.)
     
  9. wellgold

    wellgold Нуб

    После долгих мучений датчики заработали.
    Ключевые моменты (из примера) следующие: вместо Serial1.print(бла-бла-бла) надо использовать Serial1.write(бла-бла-бла).
    Ну и шины надо разделять.
    Следующий пример считывает расстояние с датчика по шине (RX1,TX1) и отправляет их на комп (RX0,TX0). Светодиод прикрутил просто для виуализации активности. В реальности он не нужен.


    Код (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.
    * 5V (Arduino)-> Pin 1 VCC (URM V3.2)
    * GND (Arduino) -> Pin 2 GND (URM V3.2)
    * Pin 19 (RX1) (Arduino MEGA) -> Pin 9 (URM V3.2)
    * Pin 18 (TX1) (Arduino  MEGA) -> Pin 8 (URM V3.2)
    * LED connected to PWM pin 13 (Arduino  MEGA) And GND (Arduino  MEGA)
    * Last modified 20/04/2012 wellgold
    */


    int USValue = 0;
    int ledPin = 13; // LED connected to digital pin 13
    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);
      pinMode(ledPin, OUTPUT);            // Sets the digital pin as output
      digitalWrite(ledPin, 0);

      delay(75); //Give sensor some time to start up --Added By crystal  from Singapo, Thanks Crystal.
    }

    void loop()
    {
      analogWrite(ledPin, 0);
      flag=true;

     for(int i=0;i<4;i++)
    {
      Serial1.write(DMcmd[i]);
      }

    while(flag)
    {
      analogWrite(ledPin, 255);
         if(Serial1.available()>0)
        {
            int header=Serial1.read(); //0x22
            int highbyte=Serial1.read();
            int lowbyte=Serial1.read();
            int sum=Serial1.read();//sum

            if(highbyte==255)
            {
              USValue=65525;  //if highbyte =255 , the reading is invalid.
            }
            else
            {
              USValue = highbyte*255+lowbyte;
            }
           Serial.println("Distance=");
           Serial.println(USValue);
           flag=false;
        }
    }
    analogWrite(ledPin, 0);
      delay(200);
    }
     
    Может кому пригодится :)
     
  10. teddyfox

    teddyfox Нерд

    Вожусь с URM37 вторые сутки без видимых успехов. Воспроизвел подключение и код уважаемого wellgold'a (без светодиода) - на мониторе постоянно бежит "Distance=-11" (!!!???). Невольно закрадывается мысль - а не прокис ли мой URM37? Братцы, у них есть встроенный тест?
     
  11. nailxx

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

    -11 -- это отображение волшебного числа 65525 (хм, и откуда оно взялось) на 16-битный int со знаком.

    То есть, вы всегда получаете "the reading is invalid". С URM всегда нужно очень внимательно проверять подключение. Очень много тонкостей:
    1. Джамперы стоят в положении TTL?
    2. Не перепутаны ли RX/TX? Rx должен идти в Tx, Tx -- в RX
    3. Подключен ли контакт NC (да, No Connection нужно включать в 5В)?
     
  12. teddyfox

    teddyfox Нерд

    "the reading is invalid" - это код URM, который он посылает в Serial, и который говорит, что с URM'ом что-то не так, или это код неисправного обмена по Serial'у?

    По подключению:
    1. Все три джампера - в TTL.
    2. RX-TX не перепутаны.
    3. Пробовал как без NC (не подключал), так и NC->5В - все то же.
    [/quote]
     
  13. nailxx

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

  14. teddyfox

    teddyfox Нерд

    Да. HardwareSerial дала те же результаты (код уважаемого wellgold'a и есть упрощенный вариант HardwareSerial), SoftwareSerial на моей Mega 2560 не пошел.
     
  15. wellgold

    wellgold Нуб

    Здравствуйте!
    Актуально ещё? Если актуально, могу попробовать помочь.
     
  16. Makhonin

    Makhonin Гик

    Очень нужна ваша помощь. Вожусь с URM37. У меня есть gprs shield и URM37. И вместе они отказываются работать( URM37 работает через URMSerial.h и Библиотеку URM37, грешу на них. URM37 возвращает Timeout. Мне нужен код, реализующий простое считывание с этого датчика безо всяких библиотек, типа того, что вы здесь уже писали, но у меня не мега, а обычная плата (не нано)
     
  17. stekolnik

    stekolnik Нуб

    подключил URM 37 согласно http://quadmotor.org/doku.php
    написал, точнее списал, только слегка переделал:

    const int TXD = 8;
    const int RXD = 7;
    const int ledPin = 12; // 13 – если будете использовать встроенный в Arduino светодиод

    void setup()
    {
    pinMode(TXD, OUTPUT);
    pinMode(RXD, INPUT);
    pinMode(ledPin, OUTPUT);

    Serial.begin(9600);
    }

    unsigned int time_us=0;

    unsigned int distance_sm=0;

    void loop()
    {
    digitalWrite(TXD, HIGH); // Подаем сигнал на выход микроконтроллера
    delayMicroseconds(10); // Удерживаем 10 микросекунд
    digitalWrite(TXD, LOW); // Затем убираем
    time_us=pulseIn(RXD, HIGH); // Замеряем длину импульса
    distance_sm=time_us/58; // Пересчитываем в сантиметры
    Serial.println(distance_sm); // Выводим на порт

    if (distance_sm<50) // Если расстояние менее 50 сантиметром
    {
    digitalWrite(ledPin, HIGH); // Зажигаем светодиод
    }
    else
    {
    digitalWrite(ledPin, LOW); // иначе тушим
    }

    delay(100);
    }

    По идее светодиод должен загораться, только если что-н. помещать ближе 50 см, но он горит всё время, почему?
    Ещё забыл добавить, что Serial Monitor всё время выдает ноль, т.е. он вообще не меряет расстояние
     
  18. Makhonin

    Makhonin Гик

    Сам тоже мучаюсь сейчас с этим дальномером. Мне кажется, что замерять длину импульса нужно на выходе PWM, нет? По крайней мере так описано на http://quadmotor.org/doku.php
     
  19. Knorin

    Knorin Нуб

    У меня также была проблема с URM37 , но удалось найти на arduino forum
    http://arduino.cc/forum/index.php?topic=53142.msg379537#msg379537
    работает датчик
     
  20. semenko

    semenko Нерд

    как я подключу 2 провода на 1 контакт? Как подключать к Arduino uno?