У меня есть код для ультразвукового датчика, который я нашел с сайта. Вот код:
#define trigPin 12
#define echoPin 13
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance >= 200 || distance <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distance);
Serial.println(" cm");
}
delay(500);
}
Однако я не понимаю работу pulseIn()
функции. Я хочу знать, когда отсчет времени начинается и когда он заканчивается. Например, в этом коде время начинается с digitalWrite(trigPin, HIGH);
или время начинается с pulseIn()
функции?
Если это второй, когда он останавливается, то как время дает нам расстояние препятствия, когда я уже откладываю 1000 микросекунд после того, как посылаю пинг в воздух?
arduino-uno
sensors
pulsein
shajib0o
источник
источник
How can i do this code in assembly languaje
- какое это имеет отношение к этому вопросу?Ответы:
Из документов:
Таким образом, в этом случае
pulseIn(echoPin, HIGH)
начинается подсчет количества микросекунд, пока онechoPin
не станет ВЫСОКИМ и не сохранит его вduration
.Он начинается и заканчивается в этой строке, это так называемая функция блокировки. Он действительно будет сидеть до тех пор, пока
echoPin
не достигнет высокого уровня и не сообщит вам, сколько времени прошло (если вы не укажете время ожидания).Это также означает, что любые задержки, которые у вас есть до или после
pulseIn
разговора, никак не влияют на это.То, как вы получите расстояние от этого времени, по следующему уравнению:
Вы делите на два, потому что он уходит и обратно, так что время будет вдвое больше, чем в одну сторону. 29,1 - это скорость звука (которая составляет 343,5 м / с => 1 / 0,03435 = 29,1). Обратите внимание, что результат в КМ, а не в дюймах. Вы могли бы, вероятно, выяснить это, взглянув на таблицу данных датчика или просто получить множество образцов, относящихся к длительности к расстоянию (вы бы измеряли расстояние вручную), и получить уравнение, которое очень похоже.
источник
pulseIn(echoPin, HIGH)
измеряет время, пока вывод ECHO не станет НИЗКИМ.Действительно, было бы проблемой, если бы вы начали измерять длительность импульса через 1000 микросекунд после его запуска. Однако это не то, как работает датчик HC-SR04:
датчик срабатывает по падающему фронту TRIG, при
digitalWrite(trigPin, LOW);
импульс ECHO начинается примерно через 0,3 мс после запуска
Поэтому задержка в 1 мс не влияет на результат измерения.
pulseIn(echoPin, HIGH)
будет фактически ждать, пока вывод ECHO станет ВЫСОКИМ, затем начнет измерять длину импульса, пока он снова не станет НИЗКИМ. Таким образом, длительность импульса TRIG может быть уменьшена до 10 микросекунд (минимальная длительность TRIG для HC-SR04), чтобы ускорить измерения.источник
Важно знать, что вы не измеряете время с момента запуска триггера - для этого установите триггерный вывод ВЫСОКИЙ - до сигнала эха.
Датчик HC-SR04 начинает измерение, получая HIGH на входе Trigger, а затем через некоторое время отправляет время, закодированное как длину уровня HIGH на выводе Echo.
Если вы используете
pulseIn()
2 мс, т.е. 2000 мкс, после запуска, он должен работать нормально.источник
Не запутайтесь, так как ультразвуковой модуль имеет особый способ работы. Сначала вы устанавливаете импульс в тригпине. Когда он заканчивается, модуль отправляет 8 импульсов по 40 кГц (и это фактически то, что используется для измерения расстояния, а не ваш импульс в тригпине, который никуда не идет). В тот момент, когда посылается первый пакет, вывод эхо-сигнала устанавливается в HIGH. Когда это происходит, программа находится в строке pulseIn, и, так как echopin находится в HIGH, начинается отсчет времени (поскольку pulseIN (echopin, HIGH) ожидает, когда echopin будет HIGH для начала отсчета). Когда первый импульс с частотой 40 кГц отскакивает от объекта и возвращается к приемнику, эхопин устанавливает себя в НИЗКИЙ. Затем функция pulseIn останавливает время и возвращает его. Затем программа продолжает работать. Этот модуль немного сложнее, чтобы научиться работать с pulseIn.
источник