Ультразвуковой дальномер HC-SR04 плохо работает

MaksVV
Offline
Зарегистрирован: 06.08.2015

Имеется датчик .

Подключил. Использую стандартный скетч для него 

const int Trig = 8; 
const int Echo = 9; 

unsigned int time_us=0;
unsigned int distance_sm=0;

void setup() 
{ 
pinMode(Trig, OUTPUT); 
pinMode(Echo, INPUT); 
  
Serial.begin(9600); 
}

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

В сериале показывает всё норм, бомбит показаниями. Но если направить датчик более чем на 1,5 метра, показания датчика становятся равным 0. При этом (когда 0) уже показания идут не через 100 миллисекунд. а примерно раз в секунду. Как будто скетч зависает. Пробовал также скетч Ranging,  другой датчик,  другую ардуину, другой комп, внешнее питание ардуины от бп, ничего не помогает. Залил скетч чтоб значение Trig выводилось  на светодиод, так вот когда зависает он горит. Причем  отключение датчика от ардуины не помогает , светодиод все равно горит.  Помогает только постукивание по одному из динамиков датчика, после этого "отвисает" и дальше бомбит показаниями. 

Что делаю. не так? Или оба датчика пришли бракованные? 

nevkon
Offline
Зарегистрирован: 20.01.2015

Тема уже есть с решением, ищите. Датчики с глючной прошивкой у вас.

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Это такой глюк. Не лечиться ничем, ибо глюк прошивки датчика, а он непрошиваемый.

Я когда вижу сбой, отключаю питание на 3-5 -милисекунды. Отключаю через Mosfet транзистор.

Поищите продавца с нормальными датчиками (такие тоже бывают, на вид такие же)

okta
Offline
Зарегистрирован: 10.01.2015

+1 Да - кривой датчик. А самое в этом неприятное, что наверняка на али, ебэе или где вы их там покупали, наверняка уже оставлен отзыв, что товар получен, все хорошо, все замечательно...

MaksVV
Offline
Зарегистрирован: 06.08.2015

Спасибо ответившим.  Я, так как начинающий, естесственно думал,  что что-то не так делаю. 

Тарас Петрович
Offline
Зарегистрирован: 21.11.2015

Есть и другая уловка, нашёл на просторах интернета, проверил- работает. При зависании надо на короткое время Эхо посадить на землю. Зависание можно отслеживать программно.

#define echoPin 7 // Echo Pin
#define trigPin 8
long duration, distance, lasdistance; // Duration used to calculate distance


void setup() {
  // put your setup code here, to run once:

Serial.begin (9600);
}

void loop() {
  // put your main code here, to run repeatedly:
int tries=0;
do{
   digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
   digitalWrite(trigPin, LOW);
 
 duration = pulseIn(echoPin, HIGH, 50000);

 //Calculate the distance (in cm) based on the speed of sound.

 distance = (duration/58.2);


   if (duration == 0 ) {
            delay(100);
            pinMode(echoPin, OUTPUT);
            digitalWrite(echoPin, LOW);
            delay(100);
            pinMode(echoPin, INPUT);
        }
    } while (duration == 0 && ++tries < 3);
    if (duration == 0){
      // Out of range
      Serial.print(" ");
      Serial.print("OSHIBKA :(");
      Serial.println(" ");
      delay(500);
      }
    else{
      // Read ok!
 /* Send the distance to the computer using Serial protocol  */
      // if(distance>10){digitalWrite(LEDPin, HIGH);        
      // }
       // else{digitalWrite(LEDPin, LOW);}

        
       
      Serial.print("Rasstoyanie  ");
      Serial.print(distance);
      Serial.println("  Cm");
      
         



      
 

 delay(500); 
}





}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

При зависании надо на короткое время Эхо посадить на землю. Зависание можно отслеживать программно.

а если перед каждым измерением echo кратковременно сажать на землю?

Тарас Петрович
Offline
Зарегистрирован: 21.11.2015

Та зачем? Онож время тратит, да и вообще сажать выход на землю- считай КЗ, то есть нештатный режим.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а шоб не глюкало. КЗ можно убрать введением 100 Ом резистора.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Ту Тарас Петрович. Спасибо, попробую эту фичу

MaksVV
Offline
Зарегистрирован: 06.08.2015

Подключил датчик со скетчем с защитой от зависаний, работает более менее хорошо. Но вот ведь когда все собрал - подключение датчика у меня через  телефонный 4 жильный кабель 5м.  Через этот кабель показания датчика 0. Какой кабель взять, чтоб работало? Коаксиальный чтоли? 

Тарас Петрович
Offline
Зарегистрирован: 21.11.2015

Я использовал экранированый кабель, типа микрофонного. Причин этому интерфейсу бояться длины кабеля я не вижу. Жилы потолще и питание чтоб строго 5 В было, не хочет он на пониженом работать.