Ультразвуковой датчик измерения расстояния HC-SR04

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

  1. punksasha

    punksasha Нуб

    Здравствуйте, недавно купил ардуино мега 2560, а так же несколько датчиков к нему, возникла проблема с ультразвуковым датчиком, а именно:
    загрузил скетч

    #include "Ultrasonic.h"

    // sensor connected to:
    // Trig - 22, Echo - 24
    Ultrasonic ultrasonic(22, 24);

    void setup()
    {
    Serial.begin(9600); // start the serial port
    }

    void loop()
    {
    float dist_cm = ultrasonic.Ranging(CM); // get distance
    Serial.println(dist_cm); // print the distance

    delay(100); // arbitary wait time.
    }
    При прослушивании всё работает достаточно стабильно, НО иногда при изменении расстояния проскакивает необъяснимо большое число (так же заметно небольшое подвисание):
    12.00
    28.00
    139.00
    16.00
    140.00
    3644.00
    6.00
    10.00
    9.00
    8.00
    То же самое и у друга на другой ардуине и другом ультразвуковом датчике. Подскажите что я делаю не так?=)
     
  2. Megakoteyka

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

    Я тоже с таким датчиком бодался, наблюдал примерно ту же самую картину.
    Выход - фильтровать показания датчика, выбрасывать аномально большие (или маленькие) значения.
    Но тогда результирующая частота опроса датчика становится совсем печальной.
    Я надеялся получить 10 измерений в секунду и в итоге пришел к выводу, что данный датчик такого обеспечить просто не в состоянии.
     
    punksasha нравится это.
  3. Sergey991

    Sergey991 Нерд

    привет всем. Вот рабочий скетч для этого датчика, у меня все с ним норм))) 10 из 10 значений верны.
    Код (Text):
    int inputPin=9; // Echo1
    int outputPin=8; // Trig1
    int distance;

    void setup() {
      Serial.begin(9600);
      pinMode(inputPin, INPUT);
      pinMode(outputPin, OUTPUT);
    }
    void loop() {
      digitalWrite(outputPin, LOW);
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);
      int distance = pulseIn(inputPin, HIGH);
      distance= distance/58;
      Serial.print(distance);
      Serial.print("cm");
      Serial.println("  ");
      delay(50);
    }
    И измерения проводятся примерно 20 раз в секунду, так что Megakoteyka немного ошибся.
     
  4. Megakoteyka

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

    Количество измерений в секунду имеет прямую зависимость от растояния до препятствия.
    При расстоянии 20 см будет одна частота, при 2 м - совсем другая. Это непосредственно следует из скорости распространения звука.
    Такой код я тоже пробовал и наблюдал ту же картину, что описал выше. У датчика, который я пробовал, одна из металлических "банок" имела небольшой люфт. Возможно, ошибки измерений происходили из-за этого, но физику данного явления (ошибочного измерения) мне понять не удалось.
    Дальномер, с которым я экспериментировал, приобретался знакомым в Китае. Возможно, попался брак либо дальномер долбанули при транспортировке либо что-то еще. Других таких же дальномеров для сравнения у меня не было, так что сложно делать выводы.
     
  5. ZaikaBlogs

    ZaikaBlogs Нерд

    Это лаги.