Один метод для 2 ультразвуковых датчиков не работает должным образом
Поэтому я создал метод для чтения и возврата данных ультразвукового датчика. У меня есть 2 ультразвуковых датчика.
Ниже мой код.
// Ультразвуковые штифты #define T1 2 #define E2 4 #define E1 3 #define T2 5 // Контакты двигателя #define M1 7 #define M2 8 #define M3 9 #define M4 10 // Определение двигательных движений enum МОТОР { ВПЕРЕД, НАЗАД, СЛЕВА, ПРАВО, СТОП }; большая продолжительность1, расстояние1, продолжительность2, расстояние2; аннулировать установку() { Serial.begin(9600); pinMode(E1, INPUT); pinMode(E2, INPUT); pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(M1, OUTPUT); pinMode(M2, OUTPUT); pinMode(M3, OUTPUT); pinMode(M4, OUTPUT); Двигатель(СТОП); } void loop() { // Если оба датчика обнаруживают объект, двигайтесь в обратном направлении. пока (ОбнаружитьОбъект(T1,E1,1) < 10 && ОбнаружитьОбъект(T2,E2,2) < 10) { Serial.println("Назад"); Мотор (НАЗАД); delay(200); Двигатель(СТОП); delay(50); } // Если левый датчик обнаруживает объект, двигайтесь в правом направлении. пока (ОбнаружитьОбъект(T1,E1,1) < 10 && ОбнаружитьОбъект(T2,E2,2) > 10) { Serial.println("Right"); Мотор (ПРАВЫЙ); delay(200); Двигатель(СТОП); delay(50); } // Если правый датчик обнаруживает объект, двигайтесь в левом направлении. пока (ОбнаружитьОбъект(T1,E1,1) > 10 && ОбнаружитьОбъект(T2,E2,2) < 10) { Serial.println("Left"); Мотор(СЛЕВА); delay(200); Двигатель(СТОП); delay(50); } // Если оба датчика не обнаруживают объект, двигайтесь вперед. пока (ОбнаружитьОбъект(T1,E1,1) > 10 && ОбнаружитьОбъект(T2,E2,2) > 10) { Serial.println("Forward"); Мотор (ВПЕРЕД); delay(200); Двигатель(СТОП); delay(50); } } двигатель пустоты(ДВИГАТЕЛЬ) { переключатель (двигатель) { Дело СТОП: DigitalWrite(M1, LOW); DigitalWrite(M2, LOW); DigitalWrite(M3, LOW); DigitalWrite(M4, LOW); перерыв; Дело ВПЕРЕД: DigitalWrite(M1, HIGH); DigitalWrite(M2, LOW); DigitalWrite(M3, HIGH); DigitalWrite(M4, LOW); перерыв; case НАЗАД: DigitalWrite(M1, LOW); DigitalWrite(M2, HIGH); DigitalWrite(M3, LOW); DigitalWrite(M4, HIGH); перерыв; Корпус СЛЕВА: DigitalWrite(M1, HIGH); DigitalWrite(M2, LOW); DigitalWrite(M3, LOW); DigitalWrite(M4, HIGH); перерыв; Случай ПРАВЫЙ: DigitalWrite(M1, LOW); DigitalWrite(M2, HIGH); DigitalWrite(M3, HIGH); DigitalWrite(M4, LOW); перерыв; по умолчанию: перерыв; } delay(100); } long DetectObject(uint8_t trigPin, uint8_t echoPin, int sensorNo) { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); Serial.print("Датчик расстояния"); Serial.print(sensorNo); Serial.print(": "); Serial.print(pulseIn(echoPin, HIGH) * 0,034 / 2); Serial.println(" см"); возвратный импульсIn(echoPin, HIGH) * 0,034 / 2; }
Я постоянно получаю Назад
в последовательном мониторе.
Вывод последовательного монитора —
Distance Sensor1: 20 cm
Distance Sensor2: 15 cm
Backward
Distance Sensor1: 17 cm
Distance Sensor2: 21 cm
Backward
Distance Sensor1: 24 cm
Distance Sensor2: 9 cm
Backward
Но когда я создал 2 разных метода для каждого ультразвукового датчика. Он работает нормально.
Мне нужен один метод для N ультразвуковых датчиков.
Заранее спасибо!
@Ansari Aquib, 👍0
Обсуждение1 ответ
Лучший ответ:
Проблема заключается в функции, выполняющей ультразвуковое обнаружение. Во-первых, я бы посоветовал не выполнять последовательную печать между триггерным импульсом и pulseIn()
, поскольку последовательная передача может занять больше времени (например, когда буфер заполнен), и тогда ваше чтение будет мусором. Выполните pulseIn()
непосредственно после части импульса триггера и сохраните результат в локальной переменной, которую вы можете позже распечатать и вернуть. Если вы это сделаете, ваша проблема также будет решена.
Чтобы понять, что на самом деле происходит с вашим кодом, я добавил к функции несколько комментариев:
long DetectObject(uint8_t trigPin, uint8_t echoPin, int sensorNo)
{
// Создать триггерный импульс
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Выполняем печать
Serial.print("Distance Sensor");
Serial.print(sensorNo);
Serial.print(": ");
// Считать импульс и вывести его прямо в Serial
Serial.print(pulseIn(echoPin, HIGH) * 0.034 / 2);
Serial.println(" cm");
// Читаем ДРУГОЙ импульс и возвращаем его
return pulseIn(echoPin, HIGH) * 0.034 / 2;
}
Как видите, вы пытаетесь прочитать 2 импульса. Но есть только один эхо-импульс. Этот один импульс считывается при первом выполнении pulseIn()
, и вы печатаете результат в Serial, поэтому в Serial Monitor вы видите правильное значение.
После этого вы снова выполняете pulseIn()
и возвращаете результат. pulseIn()
будет ожидать начала импульса (чтобы начать отсчет времени). Но на эхо-линии нет второго импульса, поэтому pulseIn()
завершится после тайм-аута (по умолчанию 1 с). По тайм-ауту эта функция возвращает ноль. Таким образом, каждый раз, когда вы выполняете эту функцию, она возвращает ноль.
Если вы затем посмотрите на логику в loop()
, вы легко поймете, почему вы возвращаетесь только назад. Код застревает в первом цикле while, потому что значение, возвращаемое функцией, всегда равно нулю, то есть меньше 10.
Вот версия псевдокода того, как на самом деле должна работать ваша функция:
execute trigger pulse
execute pulseIn function and save result in local variable
print whatever you want to Serial
return the value of the local variable
Большое спасибо. Теперь работает. Узнал что-то новое., @Ansari Aquib
- Сервопривод продолжает сбрасывать положение, когда нет разницы в полученном значении?
- Мой код кнопки не работает должным образом
- Бот не активируется после нажатия кнопки
- avrdude ser_open() can't set com-state
- Не могу загрузить скетч в Arduino Nano
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Две батареи делят землю?
@jsotola Я добавил вывод Serial Monitor., @Ansari Aquib
Я думаю, вам следует попробовать реструктурировать ваш loop(). В начале цикла() получите значение для DetectObject(T1,E1,1) и DetectObject(T2,E2,2), называемое, скажем, Det1 и Det2 соответственно. Затем измените свои операторы while на операторы if, скажем,
if (Det1 < 10 && Det2 < 10 ) . . .
, @6v6gt@ 6v6gt Уже пробовал, не работает., @Ansari Aquib