Ультразвуковой дальномер HC-SR04 плохо работает
- Войдите на сайт для отправки комментариев
Имеется датчик
.
Подключил. Использую стандартный скетч для него
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 выводилось на светодиод, так вот когда зависает он горит. Причем отключение датчика от ардуины не помогает , светодиод все равно горит. Помогает только постукивание по одному из динамиков датчика, после этого "отвисает" и дальше бомбит показаниями.
Что делаю. не так? Или оба датчика пришли бракованные?
Тема уже есть с решением, ищите. Датчики с глючной прошивкой у вас.
Это такой глюк. Не лечиться ничем, ибо глюк прошивки датчика, а он непрошиваемый.
Я когда вижу сбой, отключаю питание на 3-5 -милисекунды. Отключаю через Mosfet транзистор.
Поищите продавца с нормальными датчиками (такие тоже бывают, на вид такие же)
+1 Да - кривой датчик. А самое в этом неприятное, что наверняка на али, ебэе или где вы их там покупали, наверняка уже оставлен отзыв, что товар получен, все хорошо, все замечательно...
Спасибо ответившим. Я, так как начинающий, естесственно думал, что что-то не так делаю.
Есть и другая уловка, нашёл на просторах интернета, проверил- работает. При зависании надо на короткое время Эхо посадить на землю. Зависание можно отслеживать программно.
#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); } }При зависании надо на короткое время Эхо посадить на землю. Зависание можно отслеживать программно.
а если перед каждым измерением echo кратковременно сажать на землю?
Та зачем? Онож время тратит, да и вообще сажать выход на землю- считай КЗ, то есть нештатный режим.
а шоб не глюкало. КЗ можно убрать введением 100 Ом резистора.
Ту Тарас Петрович. Спасибо, попробую эту фичу
Подключил датчик со скетчем с защитой от зависаний, работает более менее хорошо. Но вот ведь когда все собрал - подключение датчика у меня через телефонный 4 жильный кабель 5м. Через этот кабель показания датчика 0. Какой кабель взять, чтоб работало? Коаксиальный чтоли?
Я использовал экранированый кабель, типа микрофонного. Причин этому интерфейсу бояться длины кабеля я не вижу. Жилы потолще и питание чтоб строго 5 В было, не хочет он на пониженом работать.