Tenho código para um sensor ultrassônico que encontrei em um site. Aqui está o código:
#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);
}
No entanto, eu não entendo o trabalho da pulseIn()
função. Quero dizer, quero saber quando a contagem de tempo começa e quando termina. Por exemplo, nesse código, a hora começa às digitalWrite(trigPin, HIGH);
ou começa com a pulseIn()
função?
Se for o segundo, quando ele pára, como o tempo nos dá a distância de um obstáculo quando já estou atrasando 1000 microssegundos depois de enviar um ping no ar?
arduino-uno
sensors
pulsein
shajib0o
fonte
fonte
How can i do this code in assembly languaje
- o que isso tem a ver com esta questão?Respostas:
Dos documentos:
Portanto, neste caso,
pulseIn(echoPin, HIGH)
começa a contar o número de microssegundos atéechoPin
ALTO e armazena isso emduration
.Começa e termina nessa linha, é o que é conhecido como função de bloqueio. Ele realmente fica lá até
echoPin
ficar alto e informa quanto tempo levou (a menos que você especifique um tempo limite).Isso também significa que qualquer atraso que você tenha antes ou depois da
pulseIn
ligação não a afetará de forma alguma.A maneira como você se distancia desse tempo é pela seguinte equação:
Você divide por dois porque sai e volta para que o tempo seja o dobro de uma viagem só de ida. O 29.1 é a velocidade do som (que é 343,5 m / s => 1 / 0,03435 = 29,1). Portanto, observe que o resultado está em CMs, não em polegadas. Você provavelmente poderia descobrir isso examinando a folha de dados do sensor ou apenas obter muitas amostras relacionadas à duração da distância (você mediria a distância manualmente) e obteria uma equação muito semelhante.
fonte
pulseIn(echoPin, HIGH)
mede o tempo até o pino do ECHO ficar BAIXO.Na verdade, seria um problema se você começasse a medir o comprimento do pulso 1000 microssegundos após o início. No entanto, não é assim que o sensor HC-SR04 funciona:
o sensor é acionado pela borda descendente do TRIG, em
digitalWrite(trigPin, LOW);
o pulso do ECHO inicia cerca de 0,3 ms após o gatilho
É por isso que um atraso de 1 ms não afeta o resultado da medição.
pulseIn(echoPin, HIGH)
realmente esperará que o pino do ECHO fique ALTO e comece a medir o comprimento do pulso até que fique LOW novamente. Assim, a duração do pulso TRIG pode ser reduzida para 10 microssegundos (duração mínima do TRIG para HC-SR04), para agilizar as medições.fonte
É importante saber que você não mede o tempo desde o início do gatilho - ajustando o pino de gatilho HIGH - até o sinal de eco.
O sensor HC-SR04 inicia a medição recebendo HIGH na entrada Trigger e envia, pouco tempo depois, o tempo codificado como a duração do nível HIGH no pino de eco.
Se você usar
pulseIn()
2 ms, ou seja, 2000μs, após o disparo, deve funcionar bem.fonte
Não fique confuso, pois o módulo ultrassônico possui uma maneira específica de trabalhar. Primeiro você define um pulso no gatilho. Quando termina, o módulo envia 8 rajadas de pulsos de 40 kHz (e isso é realmente o que é usado para medir a distância, não o pulso no gatilho, que não leva a lugar nenhum). No exato momento em que a primeira sequência é enviada, o pino de eco se define em ALTO. Quando isso está acontecendo, o programa está na linha de pulseIn e, como echopin está em HIGH, ele inicia o tempo (porque pulseIN (echopin, HIGH) espera que echopin seja HIGH para o tempo de início). Quando o primeiro pulso dos 40 kHz salta no objeto e volta ao receptor, o echopin se estabelece em LOW. Em seguida, a função pulseIn interrompe o tempo e o retorna. Em seguida, o programa continua em execução. Este módulo é um pouco complicado para aprender o modo de trabalhar do pulseIn.
fonte