Скочи на садржај

Матурски задатак 4ЕТР-Б8 – Мерење раздаљине

Мерење раздаљине између два објекта је важно када се говори о организацији и планирању простора. Овај пројекат омогућује да се на једноставан, лак и релативно јефтин начин то уради применом Ардуина и ултразвучног сензора HC-SR04. Једино ограничење које намеће примена овог сензора је максимални домет од 4m. За потребе неког хоби пројекта у домаћинству може да заврши посао, и то јако добро.

Задатак

Електрично коло и програм требају да реше следеће проблеме (постављање стубова за ограду на одређеном растојању):

  • Мерење раздаљине и приказ раздаљине у Серијском монитору.
  • Раздаљина предмета од сензора треба да буде изражена у центиметрима.
  • Мерење вршити на сваких 300 ms.
  • Поред исписа раздаљине потребно је контролисати рад светлећих диода
    • Уколико је раздаљина мања од 20 центиметара потребно је укључити црвену светлећу диоду,
    • Уколико је раздаљина мања од задатог прага за 2 cm или више потребно је укључити жуту светлећу диоду која је лево од зелене
    • Уколико је раздаљина већа од задатог прага за 2 cm или више потребно је укључити жуту светлећу диоду која је десно од зелене
    • Уколико је раздаљина једнака задатом прагу +/- 2 cm, треба да светли зелена диода
  • У једном тренутку треба да буде укључена само једна диода.

Анализа и препоруке за решавање задатка

Почетни и посебни услови задатка:

  • Резултати мерењa морају бити изражени у центиметрима и шаљу се на серијски монитор
  • Мерење се врши на сваких 300ms
  • У сваком тренутку светли само једна диода

Решавање овог проблема се може поделити на три једноставнија подзадатка. Подзадаци су чине самосталну целину и издвојени су у посебне функције што код чини читкијим, боље организованим и краћим. Подзадаци су:

  • Мерење раздаљине
  • Приказ података у серијском монитору и
  • Контрола рада диода

Ултразвучни сензор HC-SR04

HC-SR04 ултразвучни сензор
#ПинНаменаУ/И
1VccНапајање +5V
2TrigИницирање мерењаУ
3EchoИмпулс чије трајање представља раздаљинуИ
4GNDМаса

Принцип рада сензора

Електрична шема и повезивање кола

Потребне компоненте за реализацију кола

Електрично коло се састоји од:

  • микроконтролера,
  • ултразвучног сензора HC-SR04,
  • тастера,
  • 4 ЛЕД-а (1 црвена, 2 жуте и 1 зелене) и
  • осталих потребних компонената за реализацију кола

Видео туторијал

Програм – скица

const int triggPin = 5;
const int echoPin = 4;
const int diode[4] = {8, 9, 10, 11};
const int taster = 2;

float razdaljina;
int daljinaDoSusednogStuba = 40; // жељени размак између 2 суседна стуба је 150цм
int prag; // праг или толеранција код постављање стубова

void setup() {
  for (int i = 0; i < 4; i++) pinMode(diode[i], OUTPUT);
  pinMode(triggPin, OUTPUT);
  pinMode(taster, INPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // врши се мерење даљине и резултат се смешта у променљиву "razdaljina"
  razdaljina = izvrsiMerenje();
  // приказ резултата мерења у Серијском монитору
  prikaziRezultateMerenja();                   
  // рачунање одступања приликом постављања суседног стуба у односу на дефинисани 
  // размак између 2 стуба
  prag = razdaljina - daljinaDoSusednogStuba;
  // уколико је међусобно растојање два стуба мање од 20цм - светли црвена диода
  if(razdaljina < 20) ukljuciDiodu(0);
  // уколико је праг(толеранција) за 2 или више центиметара мањи од
  // жељеног размака између 2 стуба - светли жута диода (лево од зелене)
  else if(prag <= -2) ukljuciDiodu(1);
  // уколико је праг(толеранција) за 2 или више центиметара већи од
  // жељеног размака између 2 стуба - светли жута диода (десно од зелене)
  else if(prag >= 2) ukljuciDiodu(3);
  // уколико је вредност прага ±2цм стуб је на жељеној удаљености
  // светли зелена диода
  else if(prag > -2 && prag < 2) ukljuciDiodu(2);
  // мерење се врши на сваких 300мс
  delay(300);
}

float izvrsiMerenje() {
  // активирање ултразвучног сензора довођењем одговарајућег сигнала на тригер пин
  digitalWrite(triggPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggPin, LOW);
  delayMicroseconds(2);
  // време трајања импулса на ехо пину се смешта у променљиву "trajanjeSignala"
  // која је потребна за израчунавање даљине до стуба
  unsigned long trajanjeSignala = pulseIn(echoPin, HIGH);
  // образац за израчунавање даљине (добијени резултат је изражен у цм)
  float daljina = trajanjeSignala * 0.034 / 2;
  // повратна вредност функције је измерена даљина између два стуба
  return daljina;
}

void ukljuciDiodu(int led) {
  // услов у задатку каже да у сваком тренутку светли само једна диода
  // зато се у овој функцији најпре искључују све диоде и
  // укључује само она чији је индекс прослеђен функцији
  for(int i = 0; i < 4; i++) {
    digitalWrite(diode[i], LOW);
  }
  digitalWrite(diode[led], HIGH);
}


void prikaziRezultateMerenja() {
  Serial.print("Izmerena daljina je: ");
  Serial.print(razdaljina);
  Serial.println(" cm");
  Serial.println("-------------------------------");
}
const int triggPin = 5;
const int echoPin = 4;
const int diode[4] = {8, 9, 10, 11};
const int taster = 2;
float razdaljina;
volatile bool stanjeTastera = false;

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(diode[i], OUTPUT);
  }
  pinMode(triggPin, OUTPUT);
  pinMode(taster, INPUT);
  pinMode(echoPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(taster), pritisnutTaster, RISING);
  Serial.begin(9600);
}

void loop() {
  if(stanjeTastera) {
    razdaljina = izvrsiMerenje();
    prikaziRezultateMerenja();
    ukljuciDiode();
    stanjeTastera = false;
  }
}

void pritisnutTaster() {
  stanjeTastera = true;
}

float izvrsiMerenje() {
  digitalWrite(triggPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggPin, LOW);
  delayMicroseconds(2);
  unsigned long trajanjeSignala = pulseIn(echoPin, HIGH);
  float daljina = trajanjeSignala * 0.034 / 2;
  return daljina;
}

void ukljuciDiode() {
  for(int i = 0; i < 4; i++) {
    digitalWrite(diode[i], HIGH);
  }
}

void prikaziRezultateMerenja() {
  Serial.print("Izmerena daljina je: ");
  Serial.print(razdaljina);
  Serial.println(" cm");
  Serial.println("-------------------------------");
}

Објашњење програма (скице)

Одељак дефиниција

Ултразвучни сензор је повезан на Ардуино плочу на пинове 4 (Echo пин сензора) и 5 (Trigg пин сензора).

Диоде су повезане на дигиталне пинове Ардуина, и то 8, 9, 10 и 11. Ове вредности су смештене у низ. Оваква дефиниција је згодна из два разлога. Мање писања код дефинисања режима рада пинова на које су повезане диоде и функцију за укључивање диода је једноставније извести ако се користе низови.

Тастер је повезан на дигитални пин број 2 (има могућност рада са прекидима).

Променљива razdaljina је реална променљива у којој се смешта податак о даљини објекта у који усмеримо сензор.

Променљива daljinaDoSusednogStuba чува информацију о жељеној даљини на коју се постављају стубови.

И за крај дела дефиниција постоји променљива prag која се користи у делу одлучивања коју диоду укључити, а рачуна се у односу на измерену раздљину и жељене даљине на коју се постављају стубови.

Одељак конфигурације

У једној for петљи се пинови на које су повезане диоде подешавају да раде у излазном режиму. Потом се triggPin такође подешава као излазни. Пинови на које су повезани тастер и echoPin раде у улазном режиму, јер на овим се пиновима очекују одређене инфромације из спољног света које утичу на рад програма. За крај је иницирана комуникација са рачунаром брзине 9600 бауда.

Одељак петље

У одељку петље на почетку се у променљиву razdaljina смешта резултат фунцкије izvrsiMerenje(). Ова функција је први подзадатак који програм извршава и њен резултат је раздаљина до објекта.

Следи позив функције prikaziRezultateMerenja која на серијски монитор приказује резултат претходног мерења.

У променљиву prag се чува информација о одступању од жељене даљине на коју се врши постављање следећег стуба. На основу тог одступања (толеранције) се укључује одређена диода. Уколико је раздаљина мања од 20 центиметара укључиће се црвена диода, чији је индекс у низу 0. Укључивање се у овом случају врши позивом функције ukljuciDiodu и прослеђивањем индекса 0. Уколико је раздаљина већа од 20 центиметара, а праг за 2 или више центиметара мањи од жељене раздаљине укључује се жута диода (лево од зелене) чији је индекс у низу 1, или уколико је праг за 2 или више центиметара већи од жељене раздаљине укључује се жута диода (десно од зелене) чији је индекс 3. Уколико је праг 2 центиметара или мањи, светлеће зелена диода (индекс зелене диоде је 2).

Функција – izvrsiMerenje

Ова функција има повратну вредност реалног типа. Намена јој је управљање радом ултразвучног сензора. Управљање радом се врши у три корака. Први је генерисање пулса и његово слање на Trigg пин како би се започело мерење раздаљине сензором. Други корак је читање трајање пулса на Echo пину које је потребно за израчунавање раздаљине помоћу следеће формуле:

daljina = trajanjeSignala * 0.034 / 2;,

Функција – prikaziRezultateMerenja

Описно име јако добро илуструје која је намена ове функције. Приказује резултат мерења у одређеном формату. Ова функција представља други подзадатак.

Функција – ukljuciDiodu

Преостало је да се након логичке контроле дефинисаном у одељку петље укључи одређена диода. Зато ова фунцкија има један аргумент (параметар) целобројног типа који представља индекс диоде која се укључује. Црвена има индекс 0 (први елемент низа), жута има индекс 1, зелена 2 и друга жута има индекс 3. У једној for петљи се најпре све диоде искључују како би се осигурало да диоде буду искључене, пре него што се укључи 1 са прослеђеним индексом. Функција нема повратну вредност.