HC-SR04 ultraheli vahemaa andur arduinoga

Arduino ja HC-SR04 ultraheli mooduliga vahemaa mõõtmine

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.

HC-SR04 Arduino connection

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.

HC-SR04 serial results