- Необходими материали:
- Електрическа схема:
- Как всъщност работи модулът HC-SR04:
- Измерване на разстояние между два ултразвукови сензора (HC-SR04):
- Програма за датчик на предавателя:
- Програма за приемник сензор:
- Работа:
- Импровизирана идея - калибриране на сензора с помощта на известно разстояние:
Ултразвуковият сензор (HC-SR04) обикновено се използва за намиране на разстоянието на даден обект от една конкретна точка. Беше доста лесно да се направи това с Arduino и кодът също е доста прост. Но в тази статия ще опитаме нещо различно с тези популярни сензори HC-SR04. Ще се опитаме да изчислим разстоянието между два ултразвукови сензора, т.е. ще направим единия сензор да действа като предавател, а другият сензор да действа като приемник. По този начин можем да проследим местоположението на един предавател, като използваме много ултразвукови приемници, това проследяване се нарича триангулация и може да се използва за автоматични докинг роботи на багажни последователи и други подобни приложения. Намиране на разстоянието между два американски сензора може да звучи доста проста задача, но се сблъсках с няколко предизвикателства, които са обсъдени в този проект.
Техниката, обсъдена в тази статия, не е доста точна и може да не е полезна в реални системи без модификации. По време на тази документация не открих, че някой получава резултати толкова близки, колкото моите, така че току-що споделих моите възгледи за това как го накарах да работи, така че хората, които се опитват това, да не трябва да изобретяват колелото отново.
Необходими материали:
- Arduino (2Nos) - Всеки модел
- Модул HCSR04 (2Nos)
Електрическа схема:
Въпреки че ще направим един американски (ултразвуков) сензор, който да работи като предавател, а другият като приемник, е задължително да свържете всичките четири щифта на сензорите с Arduino. Защо трябва? Повече от това ще бъде обсъдено по-късно, но засега електрическата схема ще бъде следната
Както можете да видите схемата на схемата както на предавателя, така и на приемника са еднакви. Също така проверете: Arduino Ultrasonic Sensor Interfacing
Как всъщност работи модулът HC-SR04:
Преди да продължим, нека разберем как работи сензорът HC-SR04. Диаграмата за синхронизация по-долу ще ни помогне да разберем работата.
Сензорът има два щифта Trigger и Echo, които се използват за измерване на разстоянието, както е показано на времевата диаграма. Първо, за да започнем измерването, трябва да изпратим ултразвукова вълна от предавателя, това може да се направи, като се постави щифтът на спусъка високо за 10uS. Веднага щом това стане, щифтът на предавателя ще изпрати 8 звукови изблика на американски вълни. Тази американска вълна ще удари обект отскочи и ще бъде получена от приемника.
Тук времевата диаграма показва, че след като приемникът приеме вълната, той ще накара Echo щифта да се повиши за период от време, който е равен на времето, необходимо на вълната да премине от US сензор и да достигне обратно до сензора. Тази времева диаграма изглежда не е вярна.
Покрих частта на Tx (предавателя) на моя сензор и проверих дали импулсът на Echo се повиши и да, той наистина се повишава. Това означава, че импулсът на ехото не изчаква да бъде приета от него (ултразвукова) вълна. След като предаде американската вълна, тя отива високо и остава висока, докато вълната се върне обратно. Така че правилната времева диаграма трябва да бъде нещо подобно, показано по-долу (Извинете за лошите ми умения за писане)
Направете вашия HC-SR04 да работи само като предавател:
Почти е направо да се направи HC-SR04 да работи само като предавател. Както е показано на времевата диаграма, трябва да декларирате задействащия щифт като изходен щифт и да го накарате да остане висок за 10 микросекунди. Това ще инициира взрив на ултразвукова вълна. Така че, когато искаме да предадем вълната, просто трябва да контролираме спусъка на сензора на трансмитера, за който кодът е даден по-долу.
Направете вашия HC-SR04 да работи само като приемник:
Както е показано на времевата диаграма, ние не можем да контролираме покачването на пина на ехото, тъй като той е свързан с щифта на спусъка. Така че няма начин да направим HC-SR04 да работи само като приемник. Но можем да използваме хак, като просто покрием предавателната част на сензора с лента (както е показано на снимката по-долу) или капачка, американската вълна не може да излезе извън корпуса на предавателя и Echo щифтът няма да бъде засегнат от тази американска вълна.
Сега, за да накараме ехо-пина да се издигне високо, просто трябва да дръпнем този фиктивен щифт на спусъка високо за 10 микросекунди. След като този приемник сензор получи американската вълна, предавана от сензора на предавателя, ехото ще се понижи.
Измерване на разстояние между два ултразвукови сензора (HC-SR04):
Досега разбрахме как да накараме единия сензор да работи като предавател, а другият да работи като приемник. Сега трябва да предадем ултразвуковата вълна от сензора на предавателя и да я получим със сензора на приемника и да проверим времето, необходимо на вълната да премине от предавател към приемник, звучи лесно, нали ?? Но за съжаление! Тук имаме проблем и това няма да работи.
Модулът на предавателя и модула на приемника са отдалечени един от друг и когато приемният модул получи американската вълна от предавателния модул, той няма да знае кога предавателят е изпратил тази конкретна вълна. Без да знаем началния час, ние не можем да изчислим необходимото време и по този начин разстоянието. За да се реши този проблем, ехо импулсът на модула на приемника трябва да бъде направен така, че да достигне висок точно, когато модулът на предавателя е предал вълната на САЩ. С други думи, модулът на предавателя и модулът на приемника трябва да се задействат едновременно. Това може да се постигне по следния метод.
В горната диаграма Tx представлява сензор на предавателя, а Rx представлява сензор на приемника. Както е показано, сензорът на предавателя ще бъде направен да предава американски вълни с периодично известно закъснение, това е всичко, което трябва да направи.
В сензора на приемника трябва по някакъв начин да накараме щифта на спусъка да отиде високо точно по време, когато щифтът на предавателя се издигне високо. Така че първоначално ние накараме приемниците да задействат високо, което ще остане високо, докато ехото не се понижи. Този ехо-щифт ще се понижи само когато получи американска вълна от предавателя. Така че веднага щом се понижи, можем да предположим, че сензорът на предавателя току-що се е задействал. Сега, с това предположение, веднага щом ехото се понижи, можем да изчакаме известно закъснение и след това да задействаме задействането на приемниците. Това би частично синхронизирало спусъка както на предавателя, така и на приемника и по този начин можете да прочетете продължителността на незабавния ехо импулс с помощта на pulseIn () и да изчислите разстоянието.
Програма за датчик на предавателя:
Пълната програма за модула на предавателя може да бъде намерена в долната част на страницата. Той не прави нищо, освен да задейства сензора на предавателя на периодичен интервал.
digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
За да задействаме сензор, трябва да направим щифта на спусъка да остане висок за 10uS. Кодът, който прави същото, е показан по-горе
Програма за приемник сензор:
В сензора на приемника имаме капак на предавателя на сензора, за да го направим фиктивен, както беше обсъдено по-рано. Сега можем да използваме гореспоменатата техника за измерване на разстоянието между два сензора. Пълната програма е дадена в долната част на тази страница. По-долу са обяснени няколко важни реда
Trigger_US (); докато (digitalRead (echoPin) == HIGH); delayMicroseconds (10); Trigger_US (); продължителност = pulseIn (echoPin, HIGH);
Първоначално задействаме американския сензор с помощта на функцията Trigger_US () и след това изчакваме, докато ехо-пинът остане висок, използвайки цикъл while. След като се понижи, изчакваме предварително определена продължителност, тази продължителност трябва да бъде някъде между 10 и 30 микросекунди, което може да се определи чрез проби и грешки (или можете да използвате импровизирана идея, дадена по-долу). След това забавяне отново задействайте САЩ, използвайки същата функция и след това използвайте функцията pulseIn (), за да изчислите продължителността на вълната.
Сега използвайки същите стари формули, можем да изчислим разстоянието, както по-долу
разстояние = продължителност * 0,034;
Работа:
Направете връзките, както е обяснено в програмата. Покрийте Tx частта на сензора на приемника, както е показано на снимката. След това качете кода на предавателя и кода на приемника, които са дадени по-долу, съответно на предавателя и приемника Arduino. Отворете серийния монитор на модула на приемника и трябва да забележите разстоянието между два модула, което се показва, както е показано на видеото по-долу.
Забележка: Този метод е просто идеология и може да не е точен или удовлетворяващ. Можете обаче да опитате импровизираната идея по-долу, за да получите по-добри резултати.
Импровизирана идея - калибриране на сензора с помощта на известно разстояние:
Методът, който беше обяснен досега, странно изглежда задоволителен, но все пак беше достатъчен за моя проект. Бих искал обаче да споделя и недостатъците на този метод и начин за тяхното преодоляване. Един основен недостатък на този метод е, че приемаме, че Echo щифтът на приемника пада ниско веднага след като сензорът на предавателя е предал американската вълна, което не е вярно, тъй като вълната ще отнеме известно време, за да премине от предавател към приемник. Следователно задействането на предавателя и задействането на приемника няма да са в перфектна синхронизация.
За да преодолеем това, първоначално можем да калибрираме сензора, като използваме известно разстояние. Ако разстоянието е известно, ще знаем времето, необходимо на вълната на САЩ да достигне приемника от предавателя. Нека запазим това време като Del (D), както е показано по-долу.
Сега ще знаем точно след колко време трябва да направим задействащия щифт на приемника до висок, за да се синхронизираме със спусъка на предавателя. Тази продължителност може да се изчисли чрез Известно закъснение (t) - Del (D). Не успях да тествам тази идея поради ограничения във времето, така че не съм сигурен колко точно щеше да работи. Така че, ако случайно го опитате, уведомете ме за резултатите чрез раздела за коментари.