Мои два ультразвуковых датчика дают неточные показания

У меня возникли проблемы с получением двух моих ультразвуковых датчиков для считывания точных результатов в сантиметрах. В настоящее время я использую HC-SR04.

Я получаю случайные числа на разных расстояниях с объектом впереди (книга с гладкой обложкой).

Тест 1: Реальное расстояние: 10 см Датчик 1: 0,00 см Датчик 2: 82,42

Тест 2: Реальное расстояние: 10 см Датчик 1: 92,11 см Датчик 2: 95.03

У стены без книги:

Тест 1: Реальное расстояние: 10 см Датчик 1: 0,00 см Датчик 2: 13.20

Тест 2: Реальное расстояние: 10 см Датчик 1: 24,37 см Датчик 2:26,75

Цифры постоянно колеблются. Я пытаюсь получить точные результаты.

Я не уверен, что датчики сломаны или мой код неверен.Я ценю любую помощь.

Вот моя настройка: [My setup[1]

#define trigPin1 13
#define echoPin1 12
#define trigPin2 11
#define echoPin2 10

float duration, distance, duration1, distance1, duration2, distance2;

void setup() {
  Serial.begin (9600);
  pinMode (trigPin1, OUTPUT);
  pinMode (echoPin1, INPUT);
  pinMode (trigPin2, OUTPUT);
  pinMode (echoPin2, INPUT);

}

void loop() { 

  FindRange(trigPin1, echoPin1);
  duration1 = duration;
  distance1 = distance;
  FindRange(trigPin2, echoPin2);
  duration2 = duration;
  distance2 = distance;
  Serial.print(distance1);
  Serial.print(" cm  ");
  Serial.print(distance2);
  Serial.println(" cm");
  delay(100);

}

void FindRange(int trigPin, int echoPin) {

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) * 0.0345;
  delay(100);

}

, 👍1

Обсуждение

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен на chat](https://chat.stackexchange.com/rooms/100727/discussion-on-question-by-emme-s-my-two-ultrasonic-sensors-are-reading-inaccurat)., @VE7JRO


6 ответов


1

В цикле вы запускаете trgPin1, затем triggpin2, но в первом диапазоне обнаруживается, что вы читаете echoPin2 вместо echoPin1.

void loop() { 

  FindRange(trigPin1, echoPin2);
  duration1 = duration;
  distance1 = distance;
  FindRange(trigPin2, echoPin2);
  duration2 = duration;
  distance2 = distance;
  Serial.print(distance1);
  Serial.print(" cm  ");
  Serial.print(distance2);
  Serial.println(" cm");
  delay(100);

}

должно быть

void loop() 
{ 
  FindRange(trigPin1, echoPin1);
  duration1 = duration;
  distance1 = distance;

  FindRange(trigPin2, echoPin2);
  duration2 = duration;
  distance2 = distance;

  Serial.print(distance1);
  Serial.print(" cm  ");
  Serial.print(distance2);
  Serial.println(" cm");

  delay(100);
}
,

Спасибо, я просто изменил и скомпилировал его, но, когда я использую smooth book, реальное расстояние: 15 см, датчик 1: 0,00 см и датчик 2: 0,00 см., @Emme S

Что произойдет, если вы запустите программу в цикле и будете перемещать книгу к датчику и обратно? Плавно ли меняются значения в последовательном терминале при перемещении книги или они случайно переворачиваются? В последнем случае, я бы сказал, что с вашей настройкой что-то не так. (оборванные провода, неправильное подключение, отсутствие заземления или vcc. Не могли бы вы, пожалуйста, добавить фотографию вашей установки? (Я надеюсь, у вас есть доступ к смартфону с камерой или цифровой камере) Не видя настройки, я не могу сказать намного больше., @Peter Paul Kiefer

Когда я перемещаю книгу к датчику и от датчика к последовательному терминалу, он дает мне 0 см для обоих датчиков, затем он считывает только датчик 1 в случайных числах, в то время как датчик 2 все еще равен 0 см., @Emme S

Посмотрите на свою фотографию, на которой вы подключили Vcc и GND к шине Vcc вашей макетной платы. Датчик номер один не заземлен. Таким образом, его поведение при передаче не указано. Возможно, триггер или вывод эхо-сигнала действуют как заземление, когда они выключены, и динамик передатчика посылает какие-то странные сигналы, которые неправильно интерпретирует второй датчик., @Peter Paul Kiefer

@EmmeS Я забыл предварить свой последний комментарий вашим именем. Так что вы можете не получить информацию. Еще раз: посмотрите на свою фотографию, на которой вы подключили Vcc и GND к шине Vcc вашей макетной платы. Датчик номер один не заземлен. Таким образом, его поведение при передаче не указано. Возможно, вывод триггера или эхо-сигнала действует как заземление, когда он выключен, а динамик отправителя посылает какие-то странные сигналы, которые второй датчик неверно интерпретирует, @Peter Paul Kiefer


0

Принцип работы HC-SR04 основан на отражении ультразвуковой волны. Следовательно, он неточно измеряет расстояние в следующем случае:

  • Препятствие - это то, что может поглощать ультразвуковую волну. Например, вата.
  • Препятствие расположено не под углом 90 градусов. В этом случае препятствие может отражать ультразвуковую волну в другом направлении
  • Поверхность препятствия может рассеивать ультразвуковую волну

Вы можете ознакомиться с принципом работы HC-SR04 здесь.

И еще одно: два ультразвуковых датчика могут создавать помехи друг другу, если они работают одновременно. Попробуйте задать задержку (100); между двумя чтениями

void loop() 
{ 
  FindRange(trigPin1, echoPin1);
  duration1 = duration;
  distance1 = distance;

  delay(100);

  FindRange(trigPin2, echoPin2);
  duration2 = duration;
  distance2 = distance;

  Serial.print(distance1);
  Serial.print(" cm  ");
  Serial.print(distance2);
  Serial.println(" cm");

  delay(100);
}
,

Задержка в 100 мс включена в функцию FindRange, @Dorian


2

Я не уверен, но, может быть, это помогает, просто проверяя принцип работы этих датчиков, как это показано на малом расстоянии, вы должны быть осторожны с отражением от другого источника ультразвука. Я думаю, было бы хорошей идеей установить задержку между этими двумя модулями, чтобы убедиться, что они получают меньше шума друг от друга

  FindRange(trigPin1, echoPin1);
  duration1 = duration;
  distance1 = distance;
  delay(1000);//add delay
  FindRange(trigPin2, echoPin2);
  duration2 = duration;
  distance2 = distance;
  delay(1000);//add delay

другой причиной получения нуля может быть то, что ваш контроллер не смог измерить отражение от стены из-за низкой скорости выборки (если вы проводите опрос) или времени считывания с низкой точностью, поэтому у меня есть для вас предложение, если вы знакомы с STM32, есть встроенная аппаратная реализация для измерения времени импульса с использованием таймеров называемый одноимпульсным режимом, он может помочь вам получить необходимую точность

,

0

Я протестировал ваш код в том виде, в каком он есть в настоящее время, с помощью моего собственного HC-SR04s и клона Arduino Nano (поскольку это то, что у меня есть здесь в настоящее время). Это работает как заклинание. Значения довольно хорошие, возможно, с точностью до +-1 см. Я проверил изменение между 10 и 70 см с помощью моей настольной тарелки и стены в качестве препятствия. (Я просто посмотрел, правдоподобны ли значения. Я не исследовал тщательно, насколько точны эти значения).

Так что я предполагаю, что ваши датчики сломаны.

,

1

Там, где они подключены, они не будут работать, так как ряды (как и другая сторона) соединены. Пример: http://wiring.org.co/learning/tutorials/breadboard/imgs/breadboard-02.jpg

Они не подключены к другим контактам, а подключены сами по себе.

Look at the connection

,

1

измените MCU, чтобы arduino был китайской версией. Используйте оригинальную или другую оригинальную плату.

У меня была одна и та же проблема с двумя разными проектами, и со мной случилось то же самое. Один с ультразвуковым, а другой с модулем RF24. В обоих проектах происходят действительно необычные вещи. Но когда я меняю один оригинальный arduino, все работает идеально.

,