Qual è il lavoro di pulseIn?


9

Ho un codice per un sensore a ultrasuoni che ho trovato da un sito. Ecco il codice:

#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);
}

Tuttavia, non capisco il lavoro della pulseIn()funzione. Voglio dire, voglio sapere quando inizia il conteggio del tempo e quando termina. Ad esempio, in questo codice, l'ora inizia alle digitalWrite(trigPin, HIGH);o inizia l'ora alla pulseIn()funzione?

Se è il secondo, quando si ferma, allora in che modo il tempo ci dà la distanza di un ostacolo quando sto già ritardando 1000 microsecondi dopo aver inviato un ping in aria?


Il ritardo di 100us per il pin del trigger mi sembra un po 'lungo. Dipende dalla marca del sensore, ma un valore tipico (lo uso con HC-SR04) è di circa 10us .
jfpoilpret,

Come posso fare questo codice in assembly languaje ???? Per favore aiuto.


1
How can i do this code in assembly languaje- che cosa ha a che fare con questa domanda?
Nick Gammon

Risposte:


8

Dai documenti:

Legge un impulso (ALTO o BASSO) su un pin. Ad esempio, se il valore è ALTO, pulseIn()attende che il pin diventi ALTO, avvia il cronometraggio, quindi attende che il pin diventi BASSO e arresta il cronometraggio. Restituisce la lunghezza dell'impulso in microsecondi. pulsein

Quindi, in questo caso, pulseIn(echoPin, HIGH)inizia a contare il numero di microsecondi fino a quando echoPinALTO e lo memorizza duration.

Inizia e finisce su quella linea, è ciò che è noto come una funzione di blocco. Rimarrà davvero lì fino a quando non si echoPinalza e ti dice quanto tempo ci è voluto (a meno che non specifichi un timeout).

Ciò significa anche che eventuali ritardi che hai prima o dopo la pulseInchiamata non influiscono in alcun modo.

Il modo in cui ti allontani da questo momento è la seguente equazione:

distance = (duration/2) / 29.1;

Ti dividi per due perché esce e torna così il tempo sarebbe doppio rispetto a quello di un viaggio di sola andata. 29.1 è la velocità del suono (che è 343,5 m / s => 1 / 0,03435 = 29,1). Quindi nota che il risultato è in CM, non in pollici. Probabilmente potresti capirlo guardando la scheda tecnica del sensore o semplicemente ottenere molti campioni relativi alla durata della distanza (misureresti manualmente la distanza) e ottenere un'equazione molto simile.


1
Sono stato scettico! In realtà, il 29.1 è la velocità del suono. Inoltre, solo una rapida aggiunta: IIRC il motivo per cui c'è un impulso da leggere è che il modulo ultrasonico produce un segnale ALTO fino a quando il suono non ritorna al modulo.
Pinguino anonimo

1
Non ho capito il quarto paragrafo. Perché se invio un impulso sonoro in aria e aspetto 2 secondi viaggerà molto. Quindi, quando inizio a contare, con 2 secondi di ritardo. Quindi perché non ci sono problemi se do ritardo prima di pulseIn? @ sachleen. E grazie Annonomus Penguin e sachlee
shajib0o

@ shajib0o "pulseIn () attende che il pin diventi ALTO, avvia il cronometraggio, quindi attende che il pin diventi BASSO e arresta il cronometraggio."
sachleen,

3
@ shajib0o Per quanto ne so, è che il sensore a ultrasuoni fa andare il pin ALTO quando viene inviato il segnale e quindi BASSO quando il segnale ritorna.
Pinguino anonimo

1
In realtà, questo è sbagliato. pulseIn(echoPin, HIGH)misura il tempo fino a quando il pin ECHO diventa BASSO.
Dmitry Grigoryev,

2

In effetti sarebbe un problema se iniziassi a misurare la lunghezza dell'impulso 1000 microsecondi dopo l'avvio. Tuttavia, non è così che funziona il sensore HC-SR04:

inserisci qui la descrizione dell'immagine

  • il sensore è attivato dal fronte di discesa di TRIG, adigitalWrite(trigPin, LOW);

  • l'impulso ECHO inizia circa 0,3 ms dopo il trigger

Ecco perché un ritardo di 1 ms non influisce sul risultato della misurazione. pulseIn(echoPin, HIGH)attenderà effettivamente che il pin ECHO diventi ALTO, quindi inizierà a misurare la lunghezza dell'impulso fino a quando non si abbassa di nuovo. Pertanto, la durata dell'impulso TRIG può essere ridotta a 10 microsecondi (durata minima del TRIG per HC-SR04), per rendere più veloci le misurazioni.


0

È importante sapere che non si misura il tempo dall'inizio del trigger - impostando il pin del trigger HIGH - fino al segnale Echo.

Il sensore HC-SR04 avvia la misurazione ricevendo un HIGH sull'ingresso Trigger e quindi invia, poco tempo dopo, il tempo codificato come lunghezza del livello HIGH sul pin Echo.

Se si utilizzano pulseIn()2 ms, ovvero 2000μs, dopo l'attivazione, dovrebbe funzionare correttamente.


1
Non sono sicuro di quanto ciò aggiunga o differisca dalla risposta accettata.
Greenonline,

0

Non confonderti, poiché il modulo ad ultrasuoni ha un modo particolare di lavorare. Per prima cosa imposti un impulso nel trigpin. Quando termina, il modulo invia 8 raffiche di impulsi a 40 kHz (ed è proprio quello che viene utilizzato per misurare la distanza, non il tuo impulso nel trigpin, che non va da nessuna parte). Proprio nel momento in cui viene inviato il primo burst, il pin dell'eco si posiziona su HIGH. Quando ciò accade, il programma è nella linea di pulseIn e poiché echopin è in ALTO, inizia il cronometraggio (poiché pulseIN (echopin, ALTO) attende che echopin sia ALTO per il cronometro di avvio). Quando il primo impulso di 40 kHz rimbalza sull'oggetto e torna al ricevitore, l'echopin si imposta su BASSO. Quindi la funzione pulseIn interrompe il tempo e lo restituisce. Quindi il programma continua a funzionare. Questo modulo è un po 'complicato per imparare il modo di lavorare di pulseIn.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.