Icke-blockerande Ultrasonic Sensor för Arduino
HC-SR04 ultraljud sträcker sig modulen är ett fantastiskt tillägg till alla robot projekt. Dess ett mycket enkelt och billigt sätt att spåra en robotar framsteg (förutsatt att vi har fasta referenspunkter) rapporterade olika 2-400 cm med exaktheter av 3mm möjligt. Det är också ett bra sätt att lägga till objektet undvikande för att stoppa din dyrbara skapande krascha in i landskapet.
Moduler är mycket enkel. När utlöste med skickar en 10us puls på trigger stift modulen ut åtta 40kHz ultraljud pulser. Modulen sedan tar echo pin hög och håller den där tills den får ett eko tillbaka till modulen. Längden av tid echo PIN-koden är hög är direkt proportionell mot avståndet till ett objekt. I själva verket, detta är den tid det tar pulserna att resa till objekt och tillbaka och eftersom vi känner till som rusas av solitt vid 20° C torr luft vid havsnivå i 343.2 m/s, kan vi använda följande formel för att räkna ut avståndet från modulen till objektet:
avstånd (m) = (gånger * hastighet (m/s)) / 2
Som vi kommer att mäta tid i mikrosekunder det lätt för oss att arbeta ut hur långt ljud färdas per mikrosekund och helt enkelt multiplicera våra uppmätt tid av detta nummer.
343.2 m/s = 0.0343.2cm/us
Så nu kan vi säga:
avstånd (cm) = (time(us) * speed(cm/us)) / 2 = (tid * 0.0343.2)/2
Som att multiplicera och dividera är dyra steg (tidsmässigt) på en mikrokontroller får vi också dela upp vår hastighet konstant genom 2 nu och spara upprepa försöket senare, alltså:
avstånd (cm) = time(us) * 0.01716
Nu ska vi mäta ett heltal (hela) antal mikrosekunder och vi vet att floating point matematik är mindre effektiv på en mikrokontroller än motsvarande heltalet. Så, snarare än multiplicerande våra uppmätta mängden tid av en flytande punkt nummer vi kunde dela det med ett heltal eftersom 0.01716 är ungefär samma som 1/58, alltså:
avstånd (cm) = time(us) / 58(cm/us)
Med hjälp av samma metod kan vi fastställa att avståndet till ett objekt i inches är som följer:
avstånd (i) = time(us) / 148(in/us)
Så, nu vet vi hur sensorn fungerar, hur man använder det och hur man får ett användbart värde från sin produktion. Det sista problemet, för mig iaf, är att väntan för echo stift att gå lågt blockerar våra program utförande. Detta innebär att väntan på modulen för att ta en behandling vi inte kan göra något annat. Med tanke på vilka moduler 400cm kunde vi bli väntan för så mycket som 23ms. Nu, detta kanske inte verkar så mycket, men för en robot som har en iterativ kontrollerar kretsar och har massor av andra saker att göra (kontrollerande motorer, samla andra sensordata) är detta en betydande försening.
Tack och lov, det finns ett sätt som mikrokontroller kan berätta när echo PIN-koden ändras i stället för oss att titta på och vänta. Denna mekanism kallas ett "avbrott" eftersom mikrokontroller bokstavligen avbryter körningen av programmet när ett avbrott villkor uppstår och anropa en funktion av vår val. Och detta är den metod jag har använt för detta exempel. När echo stift går höga i början av den, allt vårt avbrott rutin (ISR, ut funktion som handlar om avbrottet) kallas och vi sparar den aktuella tiden som vår starttid. När echo stift går låg i slutet av den sträcker sig våra ISR kallas igen och vi sparar den aktuella tiden som våra sluttid. Skillnaden mellan start- och sluttider är tiden för den allt. Enkelt! Det finns massor av resurser ute som beskriver hur avbryter långt bättre än jag kunde och jag har redan skrivit alldeles för mycket här! Också, jag har insvept koden i ett litet bibliotek, så om du vill använda det och bryr mig inte hur avbryter arbete, du inte behöver.