Как измерить ультразвуковой датчик без импульсного метода?

Я фронтенд-разработчик, поэтому не особо разбираюсь в Arduino. Так или иначе, мой учитель дал мне проект.

Короче говоря, мне нужно измерить расстояние с помощью HC-SR04. Но проблема в том, что учитель хочет, чтобы я использовал таймер. Но я не понимаю, как я могу это сделать.

Спасибо за помощь.

, 👍0

Обсуждение

Похоже, вам поручили прочитать лист данных ATmega или руководство программиста и напрямую использовать периферийное устройство таймера, то есть делать то, что делает код pulseIn, но делать это самостоятельно. Если вы попросите кого-то другого дать вам ответ, чем это может быть более полезным, чем просто посмотреть на реализацию функции pulseIn?, @Chris Stratton


2 ответа


3

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

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

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

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

,

Одной из особенностей широко используемого модуля является то, что вскоре после падения TRIG-контакта модуль поднимает свой ECHO-контакт и удерживает его в состоянии HIGH, пока не обнаружит конец эха. Импульс на ECHO-контакте не является фактическим эхом импульса, это импульс, созданный модулем, который измеряет от конца переданного импульса до конца отраженного импульса., @Dave X


0

Решение состоит в том, что вам нужно реализовать функцию пульсации

unsigned long rdPulseIn(int pin, int value, int timeout) { // следующие комментарии предполагают, что мы передаем HIGH в качестве значения. время ожидания в миллисекундах

    unsigned long now = micros();
    while(digitalRead(pin) == value) { // ожидание, если вывод уже ВЫСОКИЙ, когда вызывается функция, но тайм-аут, если он никогда не становится НИЗКИМ
        if (micros() - now > (timeout*1000)) {
            return 0;
        }
    }

    now = micros(); // можно удалить эту строку, если вам нужен только один период тайм-аута от начала до начала фактического времени ширины импульса
    while (digitalRead(pin) != value) { // вывод НИЗКИЙ, подождите, пока он станет ВЫСОКИМ, прежде чем мы начнем отсчет времени, но тайм-аут, если он никогда не станет ВЫСОКИМ в течение периода ожидания
        if (micros() - now > (timeout*1000)) { 
            return 0;
        }
    }

    now = micros();
    while (digitalRead(pin) == value) { // начинаем отсчитывать ширину импульса HIGH, но тайм-аут, если тайм-аут превышает миллисекунды
        if (micros() - now > (timeout*1000)) {
            return 0;
        }
    }
    return micros() - now;
}

Вы можете прочитать расстояние

long mm = rdPulseIn(echoPin, HIGH, 37)/5.82; // расстояние в мм
,