Qual é o trabalho do pulseIn?

9

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?

shajib0o
fonte
O atraso de 100us para o pino do gatilho parece um pouco longo para mim. Depende da marca do seu sensor, mas um valor típico (eu o uso com o HC-SR04) é de cerca de 10us .
jfpoilpret
Como posso fazer esse código no assembly languaje ???? Por favor ajude.
11
How can i do this code in assembly languaje- o que isso tem a ver com esta questão?
Nick Gammon

Respostas:

8

Dos documentos:

Lê um pulso (ALTO ou BAIXO) em um pino. Por exemplo, se o valor for ALTO, pulseIn()aguarda o pino ALTO, inicia a cronometragem, aguarda o pino BAIXO e interrompe a cronometragem. Retorna a duração do pulso em microssegundos. pulsação

Portanto, neste caso, pulseIn(echoPin, HIGH)começa a contar o número de microssegundos até echoPinALTO e armazena isso em duration.

Começa e termina nessa linha, é o que é conhecido como função de bloqueio. Ele realmente fica lá até echoPinficar 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 pulseInligação não a afetará de forma alguma.

A maneira como você se distancia desse tempo é pela seguinte equação:

distance = (duration/2) / 29.1;

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.

sachleen
fonte
11
Eu fui Skeeted! Na verdade, o 29.1 é a velocidade do som. Além disso, apenas uma adição rápida: IIRC, a razão pela qual há um pulso para ler é o módulo ultrassônico produz um sinal ALTO até que o som retorne ao módulo.
Pinguim Anônimo
11
Não entendi o quarto parágrafo. Porque se eu enviar um pulso sonoro no ar e esperar 2 segundos, ele percorrerá uma grande distância. Então, quando eu começar a contar, chegarei 2 segundos atrasado. Então, por que não há nenhum problema se eu apresentar atrasos antes do pulseIn? @ sachleen. E graças Annonomus Pinguim e sachlee
shajib0o
@ shajib0o "pulseIn () espera que o pino fique ALTO, começa a cronometrar, depois espera que o pino fique LOW e interrompe o cronometrar."
sachleen
3
@ shajib0o Tanto quanto posso dizer, é que o sensor ultrassônico faz o pino ALTO quando o sinal é enviado e depois BAIXO quando o sinal volta.
Pinguim Anônimo
11
Na verdade, isso está errado. pulseIn(echoPin, HIGH)mede o tempo até o pino do ECHO ficar BAIXO.
Dmitry Grigoryev
2

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:

insira a descrição da imagem aqui

  • o sensor é acionado pela borda descendente do TRIG, emdigitalWrite(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.

Dmitry Grigoryev
fonte
0

É 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.

ANK55
fonte
11
Não sei ao certo quanto isso adiciona ou difere da resposta aceita.
Greenonline 24/01
0

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.

JoshFMX
fonte