De HC-SR04 ultrasone opgezette module is een fantastische aanvulling op elk project van de robot. Zijn een zeer eenvoudige en goedkope manier om track een robots progress (ervan uitgaande dat we hebben vaste referentiepunten) over een gerapporteerde bereik van 2-400cm met nauwkeurigheden van 3mm mogelijk. Het is ook een geweldige manier om toe te voegen object vermijden om te stoppen met uw kostbare creatie crashen in het landschap.
De modules-bediening is zeer eenvoudig. Wanneer geactiveerd met stuurt een puls van de 10us aan de trigger pin de module acht 40kHz ultrasone pulsen. De module vervolgens neemt de hoge echo-pin en houdt het er tot de ontvangst van een echo terug naar de module. De geldigheidsduur van de echo-pin hoge is recht evenredig met de afstand tot een object. In feite, dit is de tijd duurt de pulsen om te reizen naar de object en terug en omdat we de snelheid van het geluid bij 20° C in droge lucht op zeeniveau in 343.2 m/s weten, we de volgende formule kunnen gebruiken om het uitwerken van de afstand van de module tot het object:
afstand (m) = (tijd(en) * toerental (m/s)) / 2
Aangezien we gaan meten van tijd in microseconden zijn gemakkelijk voor ons om uit te werken hoe ver reizen per microseconde klinken en gewoon onze gemeten tijd door dit getal te vermenigvuldigen.
343.2 m/s = 0.0343.2cm/us
Dus nu kunnen we zeggen:
afstand (cm) = (time(us) * speed(cm/us)) / 2 = (tijd * 0.0343.2)/2
Als te vermenigvuldigen en delen zijn dure stappen (in termen van tijd) op een microcontroller we ook kunnen verdelen onze constante snelheid door 2 nu en sla het herhalen van de inspanning later, dus:
afstand (cm) = time(us) * 0.01716
Nu, we gaan tot het meten van een geheel (hele) aantal microseconden en we weten dat zwevend punt wiskunde op een microcontroller minder efficiënt zijn dan het gehele getal dat gelijk is. Zo, in plaats van vermenigvuldigend onze gemeten hoeveelheid tijd door een drijvende komma we konden het indelen door integer omdat 0.01716 ongeveer hetzelfde als 1/58, dus is:
afstand (cm) = time(us) / 58(cm/us)
We kunnen met behulp van dezelfde methode bepalen dat de afstand tot een object in inches als volgt is:
afstand (in) = time(us) / 148(in/us)
Dus, nu we hoe de sensor werkt weten, hoe het te gebruiken en hoe je een nuttige waarde van haar uitvoer. Het laatste probleem, voor mij is hoe dan ook, dat wachten op de echo-pin te laag gaan de uitvoering van onze programma's blokkeert. Dit betekent dat terwijl de module om een lezing te wachten we niet iets anders. Gezien de modules bereik van 400cm kon worden wachten wij maar liefst 23ms. Nu dit niet lijkt misschien veel, maar voor een robot die heeft een iteratieve controle lus en veel andere dingen te doen (controlerende motors, verzamelen van andere sensorgegevens) is dit een aanzienlijke vertraging.
Gelukkig is er een manier die de microcontroller ons wanneer de echo-pin verandert in plaats van ons hoeft vertellen kan te kijken en wachten. Dit mechanisme wordt een 'onderbreken' genoemd omdat de microcontroller letterlijk de uitvoering van het programma wordt onderbroken wanneer de voorwaarde van een interrupt optreedt en roept u een functie van onze keuze. En dit is de methode die ik voor dit voorbeeld gebruikt heb. Wanneer de echo-pin hoog aan het begin gaat van de variërend van onze interrupt service routine (ISR, functie die zich met de interrupt bezighoudt) wordt genoemd en we de huidige tijd besparen als onze begintijd. Opnieuw wanneer de echo-pin gaat laag aan het einde van de variërend van onze ISR heet en we de huidige tijd besparen als onze eindtijd. Het verschil tussen de begin- en einddatum tijden is de tijd die nodig is voor de variërend. Eenvoudig! Er zijn tal van middelen die er die hoe interrupts veel beter beschrijven dan ik kon en ik heb al veel te veel hier geschreven! Ook ik heb verpakt de code in een kleine bibliotheek, dus als je wilt om het te gebruiken en niet schelen hoe interrupts werken, hoeft niet.