Siin artiklis teeme lühi ülevaate HC-SR04 ultraheli mooduliga vahemaa mõõtmisest kasutades Arduino mikrokontrollerit.
HC-SR04 andurist
Andur ise ei anna otseselt vahemaa kohta infot. See tuleb ise välja arvutada kasutades heli levimise kiirust. Lisaks tuleks silmas pidada, et see andur ei kompenseeri atmosfäärirõhust ja temperatuurist tulenevaid muutusi heli liikumisel, seega tulemus pole 100% täpne. Ühesõnaga ei sobi see täppis mõõtmiseks küll aga sobib ideaalselt roboti või mõne automaatika jaoks mis ligilähedase vahemaa põhjal otsuseid tegema peaks.
Ühendamine Arduinoga
Ühendamine on ülimalt lihtne. Toite klemmidele tuleb anda 0V (Gnd) ja 5 volti (Vcc) – ning trigger ja echo klemmid ühendage näiteks 9 ja 8 klemmile arduinol. Järgnevas näidis programmis on just kasutatud 8 ja 9 klemmi.
Koodinäide ülemise ühenduse põhjal
Kood mis mõõdab vahemaad ning tulemusi saab lugeda Arduino arenduskeskkonna (IDE) terminali kasutades.
/*
HC-SR04 näidisprogramm vahemaa mõõtmiseks
http://isetegija.ee/et/arduino-ja-hc-sr04-ultraheli-mooduliga-vahemaa-mootmine/
*/
// Määrame klemmid Arduinol kuhu peab ühendama anduri Trig ja Echo klemmid
const int pingPin = 9; //Trigger pin
const int readPin = 8; //Echo pin
long cm, aeg;
void setup() {
// See on selleks, et saaks serial pordist arvuti abil lugeda infot vahemaa kohta
Serial.begin(9600);
// Ütleme, et trigger pin oleks väljund ja echo oleks sisend pin
// mille kaudu saame aja mis kulus vahemaa läbimiseks
pinMode(pingPin, OUTPUT);
pinMode(readPin, INPUT);
// Kindlustame, et algne trigger pin oleks kindlasti LOW väärtuses (0V)
digitalWrite(pingPin, LOW);
}
void loop() {
//saame uusima info vahemaa kohta
cm = vahemaaSentimeetrites();
//kirjutame saadud info serial porti
Serial.print(cm);
Serial.print("cm");
Serial.println();
//ja ootame ühe sekundi
delay(1000);
}
int vahemaaSentimeetrites() {
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
// Anname andurile 5 mikrosekundi pikkuse impulsi. Sellest piisab, et andur
// annaks helisignaali mille tagasi põrkumist hakkame ootama
//
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
// Ootame kuni andur annab signaali, et heli on jõudnud objektis tagasi andurisse
aeg = pulseIn(readPin, HIGH);
// konverdime kulunud aja sentimeetriteks
return microsecondsToCentimeters(aeg);
}
long microsecondsToCentimeters(long microseconds) {
// Heli kiirus on 340 meetrit sekundis ehk näiteks ka 34cm mikrosekundis.
// Leiame mitu cm heli liikus jagades mõõdunud aja 34ga
// Kuna heli liigub edasi ja tagasi tuleb saadud tulemus
// omakorda jagada kahega, et saada lõppväärtus
return microseconds / 34 / 2;
}
Siin ka näide mis terminalis näha on kui see programm käib ning sensorit liigutada seinapoole ja tagasi.