Здравствуйте , хочу сделать робота объезжающего препятствия с дальномером : HC-SR04 . И для более точных показаний ищу средне арифметическое с помощью оператора For . Но дальномер показывает какую-то фигню(( Код (Text): #define Trig 9 #define Echo 8 #define LED_PIN 12 #define LED_PIN_TWO 13 void setup () { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT ); pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN_TWO, OUTPUT); Serial.begin(9600); // задаём скорость общения } unsigned int impulseTime = 0; unsigned int distance_sm = 0; unsigned int distance_sm_sr = 0; unsigned int distance = 0; void loop () { for( int i=0; i<=100; i++) { digitalWrite(Trig, HIGH); // подаём импульс на выход trig delayMicroseconds(10); // равный 10 микросекунд digitalWrite(Trig, LOW); // отключае impulseTime=pulseIn(Echo, HIGH); delay(100); distance_sm = (distance_sm + impulseTime); } distance_sm_sr = ( distance_sm / 100); distance = (distance_sm_sr / 58); Serial.println(distance); if (distance < 100) { digitalWrite(LED_PIN, HIGH); digitalWrite(LED_PIN_TWO, LOW); } else { digitalWrite(LED_PIN, LOW); digitalWrite(LED_PIN_TWO, HIGH); } } [/SIZE]
При увеличении расстояния больше чем 400 мм, дальномер показывает ноль и всё. "Возвращение" его к меньшим расстояниям ничего не даёт, постоянно пишется ноль в мониторе порта. Что это может быть? intechoPin=9; inttrigPin=8; voidsetup(){ Serial.begin(9600); pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); } voidloop(){ intduration,cm; digitalWrite(trigPin,LOW); delayMicroseconds(2); digitalWrite(trigPin,HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW); duration=pulseIn(echoPin,HIGH); cm=duration/58; Serial.print(cm); Serial.println(" cm"); delay(100); }
Проверял на разных платах. Эффект один и тот же - датчик зависает при увеличении дистанции более 400-500 см и показывает всё время ноль. Помагает только перезаливка скетча. Кто-нибудь сталкивался с такой проблемой? И вообще что должен показывать датчик при увеличении допустимой дистанции? Может это зависание нормальный рабочий процесс и мне не надо париться?
Вот две аналогичные темы: HC SR04 глючит и показывает нули HC-SR04: на больших дистанциях показывает нуль, и больше не замеряет расстояние, выводя нули((
В каком смысле?Если вспомнить лабораторные работы по физике с первого курса -- там мы всё, вплоть до длины и массы, меряли по 5-10 раз, потом считали среднее арифметическое, "чтобы найти точное значение". С точностью до попутно найденной погрешности разброса, конечно. Ну а аппаратную погрешность таким образом не победить.
Kopilov, ни в одной из этих тем, кроме описания проблемы, нет решения. Поэтому вопрос, что должен показывать нормально работающий датчик при увеличении допустимой дистанции? Может они все зависают в этом случаи и тогда никакой проблемы нет?
Очевидно, датчик ждёт эха и при большой дистанции не может дождаться (затухание сигнала). Расстояние "бесконечно", вместо бесконечности выводится ноль. Можно воспринимать его, как null/undefined: эха нет -- замер не произведён. А какая-то возможность сбросить датчик программно из скетча (альтернативы были: reset/перезаливка скетча, щелчок пальцами -- эмуляция эха), наверно, должна быть. Но у меня сейчас нет ни времени, ни аппаратуры, чтобы проэкспериментировать.
Так должно быть, если алгоритм: "не посылать новый сигнал, пока не дождались эха от старого" -- надеюсь, понятно, почему. Где этот алгоритм заложен: в Вашем скетче, в библиотеке, в прошивке датчика -- не знаю. Попробуйте добавить условие "отправить новый сигнал, если ответ от старого не пришёл через n миллисекунд".