نظام تحديد المواقع بالموجات فوق الصوتية

GPS بالموجات فوق الصوتية. نموذج مفاهيمي


قبل الانطلاق في هذه الرحلة الطويلة ، يجدر التحقق مما إذا كان كل شيء قد تم فعلاً على الركبة.

ما تدور حوله هذه المقالة: كيفية إنشاء نظام تحديد المواقع بالموجات فوق الصوتية بشكل سريع وغير مكلف.

قائمة الأجهزة المطلوبة


  • HC-SR04 3 قطع.
  • اردوينو 1 قطعة.
  • لفائف من الأسلاك.

مفهوم


صورة
التين. 1 - الفكرة العامة للجهاز

في الزوايا العليا للغرفة يتم تثبيت HC-SR04 ، والتي تلعب دور بواعث ، على الأرض مع المتلقي يصل ، والثالث ، فإنه يلعب دور جهاز الاستقبال.

كل هذا مرتبط وفقًا للمخطط:

صورة
التين. 2 - مخطط اتصال الجهاز

وبالطبع يمكنك توصيل Arduino عبر USB بجهاز كمبيوتر.

كيف يعمل كل شيء:

  1. قياس المسافة من المتلقي إلى باعث 1
  2. إرسال إشارة حول بداية قياس المسافة إلى المتلقي والباعث 1 (سحب الساقين علم حساب المثلثات معها).
  3. انتظر حتى يعطينا المتلقي الطول.
  4. كرر نفس الشيء عن باعث 2.
  5. حساب إحداثيات المتلقي.

أذكر الهندسة المدرسية


صورة
التين. 3 - التمثيل الهندسي للمشكلة

بناءً على هذا الشكل ، نقوم بتكوين الصيغ لحساب الإحداثيات:

صورة

A ، F هو ارتفاع البواعث بالنسبة إلى المستقبل ؛
C ، E هي الأطوال التي تم الحصول عليها عن طريق قياس المسافة من المرسلات إلى المستقبِل ؛
G هي المسافة بين البواعث.

ممارسة


قم بتثبيت مشععين تحت السقف ، على مسافة لائقة من بعضهما البعض (3 أمتار) ، وقم بتوجيههما باستخدام مشعات عند نقطة واحدة ، سيتم تشكيل منطقة عملك حولها.

قم بتركيب جهاز الاستقبال على شيء مسطح (على سبيل المثال ، قطعة من السبورة) ولفه بشريط بشريط حتى لا نخلق ضوضاء فوق صوتية غير ضرورية في الغرفة.
ربط كل شيء وفقا للمخطط المذكور أعلاه.

هذا هو ما قد تبدو عليه المشابك للبعثات والركيزة للمستقبل:

صورة
التين. 4 - نوع الوحدات

البرنامج


النظر في الأجزاء الرئيسية من التعليمات البرمجية في مزيد من التفاصيل.

نحن نجبر المرسل 1 والمتلقي على البدء في قياس المسافة عن طريق تحريك مدخلات Trig من هذه الأجهزة من الأقل إلى الأعلى ، و 10 مايكروثانية والعودة إلى الأقل.

digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); delayMicroseconds(5); digitalWrite(trigPinRessiv, HIGH); digitalWrite(trigPinTransmit1, HIGH); delayMicroseconds(10); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); 

عادة ، تنبعث هذه الأجهزة نفسها إشارة الموجات فوق الصوتية والانتظار حتى تنعكس من شيء ، ويعود إليها. لكننا نخدعهم ، في حالتنا ، يرسل أحدهم والآخر يستقبله ، يعتقد الشخص الذي تلقاه أنها إشارة له ، على الرغم من أنها إشارة من جهاز آخر ، ويمنحنا المسافة إلى هذا الجهاز الآخر.

ننتظر حتى يبدأ المستشعر في إخبارنا بمدة رحلة الإشارة فوق الصوتية:

 while (digitalRead(echoPinRessiv) == LOW); 

سجل وقت بدء الإشارة:

 timeStartSignal = micros(); 

ننتظر حتى يتوقف المستشعر عن إخبارنا بوقت طيران الإشارة فوق الصوتية:

 while (digitalRead(echoPinRessiv) == HIGH); 

نكتب وقت النهاية:

  timeEndSignal = micros(); 

باستخدام صيغة بسيطة ، نحسب المسافة من باعث إلى المتلقي:

  lenC = ((timeEndSignal-timeStartSignal)/58.00)*10.00; 

ننتظر حتى تهدأ الضوضاء بالموجات فوق الصوتية في الغرفة:

 delay(100); 

تجدر الإشارة إلى أن المستشعر يخبرنا المسافة عن طريق خفض إخراج الصدى إلى منخفض لفترة زمنية تتناسب مباشرة مع المسافة المقاسة.

يتكرر نفس الشيء بالنسبة للباعث الثاني.

باستخدام القواعد الموجودة على مثلث قائم الزاوية ، قم بعرض المسافة الناتجة على مستوى الأرض (الشكل 3).

ننفذ البرنامج للانتقال من الإحداثيات ثلاثية الأبعاد إلى المستوى ، يتم تقديم الصيغة أعلاه:

 lenB = sqrt((lenC*2.00)*(lenC*2.00) - lenA*lenA); 

لسوء الحظ ، لدينا أخطاء ، ولإزالتها توصلت إلى مثل هذه الصيغة ذات الخبرة ، وحذفها وانظر ما تحصل عليه.

  measurementError = 26.437 - 0.08*lenC/10; lenB = (lenB + measurementError*10)/10.00; 

كرر نفس الشيء للمستشعر 2.

نحسب الإحداثيات على متن الطائرة

أوجد الزاوية Alpha:

  alfa = acos(((lenG*lenG + lenD*lenD - lenB*lenB)*1.00) / ((2*lenE*lenG)*1.00)); 

العثور على الإحداثيات أنفسهم:

  koord_X = lenE*cos(1.57-alfa); koord_Y = lenE*cos(alfa); 

إذا تجاوزت قيمة الإحداثيات ما هو ممكن ، فاستبدلها بالقيمة السابقة:

  if((koord_X > 0) && (koord_X < 500) && (koord_Y > 0) && (koord_Y < 500)) { oldKoord_X = koord_X; oldKoord_Y = koord_Y; }else{ koord_X = oldKoord_X; koord_Y = oldKoord_Y; } 

نقوم بعمل مخزن مؤقت لـ 6 قيم إحداثية ونحوله باستمرار:

  koord_X5 = koord_X4; koord_X4 = koord_X3; koord_X3 = koord_X2; koord_X2 = koord_X1; koord_X1 = koord_X; koord_Y5 = koord_Y4; koord_Y4 = koord_Y3; koord_Y3 = koord_Y2; koord_Y2 = koord_Y1; koord_Y1 = koord_Y; 

نحصل على متوسط ​​القيمة لآخر 6 قياسات:

  averageKoord_X = (koord_X + koord_X1 + koord_X2 + koord_X3 + koord_X4 + koord_X5)/6; averageKoord_Y = (koord_Y + koord_Y1 + koord_Y2 + koord_Y3 + koord_Y4 + koord_Y5)/6; 

إرسال الإحداثيات إلى جهاز الكمبيوتر:

  Serial.println(averageKoord_X); Serial.println(averageKoord_Y); 

وظائف:

 float asin(float c) float acos(float c) float atan(float c) 

فقط خذ واستخدم =)

رمز كامل:

 int trigPinRessiv = 8; int echoPinRessiv = 9; int trigPinTransmit1 = 2; int trigPinTransmit2 = 3; int i; long lenA = 2700; //sensor height in mm long lenG = 305; // distance between sensors in cm long koord_X, koord_Y; long koord_X1, koord_Y1; long koord_X2, koord_Y2; long koord_X3, koord_Y3; long koord_X4, koord_Y4; long koord_X5, koord_Y5; long oldKoord_X = 0, oldKoord_Y = 0; long averageKoord_X, averageKoord_Y; long measurementError; float alfa; long timeStartSignal, timeEndSignal; long lenC, lenE, lenB, lenD; void setup() { Serial.begin (115200); pinMode(trigPinRessiv, OUTPUT); pinMode(echoPinRessiv, INPUT); pinMode(trigPinTransmit1, OUTPUT); pinMode(trigPinTransmit2, OUTPUT); } void loop() { averageKoord_X = 0; averageKoord_Y = 0; digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); delayMicroseconds(5); digitalWrite(trigPinRessiv, HIGH); digitalWrite(trigPinTransmit1, HIGH); delayMicroseconds(10); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit1, LOW); while (digitalRead(echoPinRessiv) == LOW); timeStartSignal = micros(); while (digitalRead(echoPinRessiv) == HIGH); timeEndSignal = micros(); lenC = ((timeEndSignal-timeStartSignal)/58.00)*10.00; delay(100); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit2, LOW); delayMicroseconds(5); digitalWrite(trigPinRessiv, HIGH); digitalWrite(trigPinTransmit2, HIGH); delayMicroseconds(10); digitalWrite(trigPinRessiv, LOW); digitalWrite(trigPinTransmit2, LOW); while (digitalRead(echoPinRessiv) == LOW); timeStartSignal = micros(); while (digitalRead(echoPinRessiv) == HIGH); timeEndSignal = micros(); lenE = ((timeEndSignal-timeStartSignal)/58.00)*10.00; delay(100); lenB = sqrt((lenC*2.00)*(lenC*2.00) - lenA*lenA); measurementError = 26.437 - 0.08*lenC/10; lenB = (lenB + measurementError*10)/10.00; lenD = sqrt((lenE*2.00)*(lenE*2.00) - lenA*lenA); measurementError = 26.437 - 0.08*lenD/10; lenD = (lenD + measurementError*10)/10.00; alfa = acos(((lenG*lenG + lenD*lenD - lenB*lenB)*1.00)/((2*lenE*lenG)*1.00)); koord_X = lenE*cos(1.57-alfa); koord_Y = lenE*cos(alfa); if((koord_X > 0) && (koord_X < 500) && (koord_Y > 0) && (koord_Y < 500)) { oldKoord_X = koord_X; oldKoord_Y = koord_Y; }else{ koord_X = oldKoord_X; koord_Y = oldKoord_Y; } koord_X5 = koord_X4; koord_X4 = koord_X3; koord_X3 = koord_X2; koord_X2 = koord_X1; koord_X1 = koord_X; koord_Y5 = koord_Y4; koord_Y4 = koord_Y3; koord_Y3 = koord_Y2; koord_Y2 = koord_Y1; koord_Y1 = koord_Y; averageKoord_X = (koord_X + koord_X1 + koord_X2 + koord_X3 + koord_X4 + koord_X5)/6; averageKoord_Y = (koord_Y + koord_Y1 + koord_Y2 + koord_Y3 + koord_Y4 + koord_Y5)/6; } float asin(float c) { float out; out = ((c+(pow(c,3))/6+(3*pow(c,5))/40+(5*pow(c,7))/112 +(35*pow(c,9))/1152 +(0.022*pow(c,11))+(0.0173*pow(c,13))+(0.0139*pow(c,15)) + (0.0115*pow(c,17))+(0.01*pow(c,19)))); if(c >= .96 && c < .97) { out=1.287+(3.82*(c-.96)); } if(c>=.97 && c<.98) { out=(1.325+4.5*(c-.97)); } if(c>=.98 && c<.99) { out=(1.37+6*(c-.98)); } if(c>=.99 && c<=1) { out=(1.43+14*(c-.99)); } return out; } float acos(float c) { float out; out=asin(sqrt(1-c*c)); return out; } float atan(float c) { float out; out=asin(c/(sqrt(1+c*c))); return out; } 

لذلك لدينا أبسط نظام GPS بالموجات فوق الصوتية مع مجموعة متر لكل متر ، ويظهر الفيديو كيف يعمل كل شيء.


يتم التصور من المسار في ماتلاب ، سأكتب كيفية القيام بنفس التصور في المقالة التالية.

في المقالات المستقبلية ، سأنظر بتعمق في الأجزاء المختلفة من هذا النظام وسأحاول تحسينها.

سأكون سعيدًا لسماع آرائك وملاحظاتك حول هذا الموضوع ، ما زال المشروع حياً =)

صفحة المشروع

مستوحاة من المصادر التالية:

ويكيبيديا
منشور على نظام تحديد المواقع "Habr" GPS "داخلي بدقة +2 سم"

Source: https://habr.com/ru/post/ar451408/


All Articles