Один метод для 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 ультразвуковых датчиков.

Заранее спасибо!

, 👍0

Обсуждение

@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


1 ответ


Лучший ответ:

0

Проблема заключается в функции, выполняющей ультразвуковое обнаружение. Во-первых, я бы посоветовал не выполнять последовательную печать между триггерным импульсом и 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