Мои два ультразвуковых датчика дают неточные показания
У меня возникли проблемы с получением двух моих ультразвуковых датчиков для считывания точных результатов в сантиметрах. В настоящее время я использую 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
Цифры постоянно колеблются. Я пытаюсь получить точные результаты.
Я не уверен, что датчики сломаны или мой код неверен.Я ценю любую помощь.
Вот моя настройка: [
#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);
}
@Emme S, 👍1
Обсуждение6 ответов
В цикле вы запускаете 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
Принцип работы 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
Я не уверен, но, может быть, это помогает, просто проверяя принцип работы этих датчиков, как это показано на малом расстоянии, вы должны быть осторожны с отражением от другого источника ультразвука. Я думаю, было бы хорошей идеей установить задержку между этими двумя модулями, чтобы убедиться, что они получают меньше шума друг от друга
FindRange(trigPin1, echoPin1);
duration1 = duration;
distance1 = distance;
delay(1000);//add delay
FindRange(trigPin2, echoPin2);
duration2 = duration;
distance2 = distance;
delay(1000);//add delay
другой причиной получения нуля может быть то, что ваш контроллер не смог измерить отражение от стены из-за низкой скорости выборки (если вы проводите опрос) или времени считывания с низкой точностью, поэтому у меня есть для вас предложение, если вы знакомы с STM32, есть встроенная аппаратная реализация для измерения времени импульса с использованием таймеров называемый одноимпульсным режимом, он может помочь вам получить необходимую точность
Я протестировал ваш код в том виде, в каком он есть в настоящее время, с помощью моего собственного HC-SR04s и клона Arduino Nano (поскольку это то, что у меня есть здесь в настоящее время). Это работает как заклинание. Значения довольно хорошие, возможно, с точностью до +-1 см. Я проверил изменение между 10 и 70 см с помощью моей настольной тарелки и стены в качестве препятствия. (Я просто посмотрел, правдоподобны ли значения. Я не исследовал тщательно, насколько точны эти значения).
Так что я предполагаю, что ваши датчики сломаны.
Там, где они подключены, они не будут работать, так как ряды (как и другая сторона) соединены. Пример: http://wiring.org.co/learning/tutorials/breadboard/imgs/breadboard-02.jpg
Они не подключены к другим контактам, а подключены сами по себе.
измените MCU, чтобы arduino был китайской версией. Используйте оригинальную или другую оригинальную плату.
У меня была одна и та же проблема с двумя разными проектами, и со мной случилось то же самое. Один с ультразвуковым, а другой с модулем RF24. В обоих проектах происходят действительно необычные вещи. Но когда я меняю один оригинальный arduino, все работает идеально.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен на chat](https://chat.stackexchange.com/rooms/100727/discussion-on-question-by-emme-s-my-two-ultrasonic-sensors-are-reading-inaccurat)., @VE7JRO