جدول المحتويات:

نظام GPS: 7 خطوات
نظام GPS: 7 خطوات

فيديو: نظام GPS: 7 خطوات

فيديو: نظام GPS: 7 خطوات
فيديو: طريقه تشغيل جهاز متابعه جي بي اس GPS GF-07 و كيفيه عمل الأكواد 2024, اكتوبر
Anonim
نظام GPS
نظام GPS
نظام GPS
نظام GPS
نظام GPS
نظام GPS

منشئ المشروع: كارلوس جوميز

يعد وجود نظام ملاحة موثوق به أمرًا بالغ الأهمية لأي شخص يحاول السفر واستكشاف العالم.

أهم جانب يسمح لنظام الملاحة بالعمل هو قدرة GPS المدمجة داخل النظام. يسمح نظام GPS لأي شخص بتتبع موقعه وسرعته من أجل عرض معلومات دقيقة عن المستخدم ومنح المستخدم تمثيلًا دقيقًا لمكان وجوده ومدى بُعده عن موقعه.

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

سيكون نظام GPS الذي سننشئه قادرًا على تتبع مواقع المستخدم من خلال الحصول على إحداثيات المستخدم على الأرض وإجراء بعض الحسابات لإرجاع سرعة المستخدم وموقعه والمسافة المقطوعة.

الخطوة الأولى: البدء

ابدء
ابدء
ابدء
ابدء
ابدء
ابدء
ابدء
ابدء

لبدء هذا المشروع ، سنحتاج أولاً إلى جمع كل المواد الصحيحة

1: Raspberry Pi Zero W

2: جهاز استقبال GPS

3: 1.8 TFT 128 x 160 LCD SPI Screen

4: ~ 11 سلكًا

5: 2 أزرار

مقاومات 6: 2x 1k و 2x 10k لأزرار السحب

7: لوح الخبز

سيستخدم هذا المشروع دبابيس GPIO الخاصة بـ Raspberry Pi وعلى هذا النحو سنحتاج إلى توصيل كل شيء بلوح الخبز من أجل تطوير مشروعنا. يُفترض أيضًا أن اللحام على جميع المسامير قد تم وإنهائه قبل الانتقال وتوصيل جميع أجزائنا.

الخطوة 2: قم بتوصيل وحدة GPS بـ Raspberry Pi

قم بتوصيل وحدة GPS بـ Raspberry Pi
قم بتوصيل وحدة GPS بـ Raspberry Pi
قم بتوصيل وحدة GPS بـ Raspberry Pi
قم بتوصيل وحدة GPS بـ Raspberry Pi

لاستخدام نظام GPS الخاص بنا ، ستحتاج إلى توصيل دبابيس Tx و Rx من وحدة GPS إلى GPIO pin 14 و 15 على Raspberry Pi. ينتقل دبوس Tx الخاص بمستقبل GPS إلى دبوس Rx الخاص بـ Pi وينتقل دبوس Rx الخاص بمستقبل GPS إلى دبوس Tx الخاص بـ Raspberry pi.

يتطلب مستقبل GPS الموضح في الصور استخدام 3.3 فولت ويمكنك توصيل دبابيس 3.3 فولت بالجهد الصحيح ، أثناء توصيل الدبوس الأرضي بالأرض.

الخطوة 3: استلام البيانات من وحدة استقبال GPS

تلقي البيانات من وحدة استقبال GPS
تلقي البيانات من وحدة استقبال GPS

لتلقي البيانات من مستقبل GPS إلى Raspberry Pi ، نحتاج إلى السماح للمآخذ الصحيحة بالقراءة من منافذ UART. تتطلب قراءة البيانات الأولية إنشاء مكتبة التحليل الخاصة بنا ، ولكن في هذا السيناريو يمكننا الاستفادة من برنامج GPS الخفي الذي يعمل في الخلفية للمساعدة في استخدام تحليل البيانات ونقلها إلى Raspberry Pi

من أجل تحقيق ذلك ، يمكننا فتح محطة طرفية على Raspberry Pi وتنفيذ الكود:

sudo apt-get update

sudo apt-get install gpsd gpsd- clients python-gps

هذا يجب أن يهتم بالتحميل بالنسبة لنا.

بمجرد اكتمالها ، نحتاج إلى تعطيل خدمة نظام gpsd عن طريق تشغيل الأوامر التالية:

sudo systemctl stop gpsd.socket

sudo systemctl تعطيل gpsd.socket

إذا كنت تريد في أي وقت تمكين خدمة نظام gpsd الافتراضية ، فيمكنك تشغيل الأوامر التالية لاستعادتها:

sudo systemctl تمكين gpsd.socket

sudo systemctl بدء gpsd.socket

نحتاج الآن إلى بدء برنامج GPSd الخفي وتوجيهه إلى منافذ UART عن طريق الدخول

sudo gpsd / dev / ttyAMA0 -F /var/run/gpsd.sock

يمكننا الآن تشغيل الأمر أدناه ورؤية جميع البيانات العائمة!

cgps -s

الخطوة 4: قم بتوصيل الشاشة بـ Raspberry Pi

قم بتوصيل الشاشة بـ Raspberry Pi
قم بتوصيل الشاشة بـ Raspberry Pi
قم بتوصيل الشاشة بـ Raspberry Pi
قم بتوصيل الشاشة بـ Raspberry Pi

بمجرد تشغيل جهاز استقبال GPS الخاص بنا والعمل مع Raspberry Pi ، يمكننا بعد ذلك توصيل الشاشة بـ Raspberry Pi. سنستخدم 5 أسلاك لتوصيل شاشة LCD الخاصة بنا بـ Raspberry Pi و 4 دبابيس أخرى لتوصيل الطاقة الرئيسية و LED على الشاشة.

لقد قمت بتضمين صورة لشاشة TFT التي أستخدمها ، ولكن هذا يجب أن يعمل مع شاشات ذات نفس الحجم والبنية.

قم بتوصيل LED- و GND بالأرض وتوصيل LED + و VCC بـ 3.3 فولت.

قم بتوصيل دبوس RESET على الشاشة برقم 25 على لوحة Pi.

قم بتوصيل A0 برقم 24 على لوحة Pi.

قم بتوصيل دبوس SDA بدبوس MOSI على لوحة Pi.

قم بتوصيل دبوس SCK على شاشة LCD بلوحة Pi.

قم بتوصيل دبوس CS بالدبوس 8 على لوحة Pi.

الخطوة 5: إعداد العرض للعمل مع Raspberry Pi

إعداد العرض للعمل مع Raspberry Pi
إعداد العرض للعمل مع Raspberry Pi

لإعداد العرض ، نحتاج إلى استخدام مكتبة ST7735 الموجودة في هذا الريبو:

مكتبة شاشة Python ST7735

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

قم بإنشاء ملف بعنوان example.py وأدخل النص التالي فيه مع صورة عينة من اختيارك في نفس المجلد

استيراد ST7735 كـ TFTimport Adafruit_GPIO مثل استيراد GPIO Adafruit_GPIO. SPI كـ SPI

العرض = 128

الارتفاع = 160 سرعة_ هرتز = 4000000

# تكوين Raspberry Pi.

# هذه هي المسامير اللازمة لتوصيل شاشة LCD بـ Raspberry Pi

تيار مستمر = 24 RST = 25 SPI_PORT = 0 SPI_DEVICE = 0

# إنشاء فئة شاشة TFT LCD.

توزيع = TFT. ST7735 (DC، rst = RST، spi = SPI. SpiDev (SPI_PORT، SPI_DEVICE، max_speed_hz = SPEED_HZ))

# تهيئة العرض.

disp.begin () disp.reset ()

# قم بتحميل صورة.

newData = 0x42 disp.command (newData) print ('Loading image…') image = Image.open ('cat.jpg')

# قم بتغيير حجم الصورة وقم بتدويرها بحيث تتطابق مع العرض.

image = image.rotate (270). تغيير الحجم ((WIDTH ، HEIGHT))

# ستطبع إلى المحطة أن برنامجنا يرسم صورتنا على الشاشة

طباعة ("صورة الرسم")

# ستعرض هذه الوظيفة صورتنا على الشاشة

عرض (صورة)

سيقوم هذا الملف بإعداد تكوين Raspberry Pi لشاشة LCD وستقوم المكتبة بتحويل صورتنا في المجلد وعرضها على الشاشة.

الخطوة 6: إعداد أجهزة الحالة لعرض معلومات GPS على الشاشة

قم بإعداد أجهزة الحالة لعرض معلومات GPS على الشاشة
قم بإعداد أجهزة الحالة لعرض معلومات GPS على الشاشة
قم بإعداد أجهزة الحالة لعرض معلومات GPS على الشاشة
قم بإعداد أجهزة الحالة لعرض معلومات GPS على الشاشة
قم بإعداد أجهزة الحالة لعرض معلومات GPS على الشاشة
قم بإعداد أجهزة الحالة لعرض معلومات GPS على الشاشة

سنستخدم 5 آلات مختلفة للحالة ، أثناء تنفيذ مخطط مهمتنا لإعداد نظام GPS الخاص بنا.

جهاز عرض تغيير الحالة:

ستتحكم آلة الحالة هذه في العرض الذي سيتم عرضه اعتمادًا على إدخال الزر الخاص بنا. يقوم بذلك عن طريق تغيير متغير يسمح لبيثون بالاستفادة من كتابة بطة واستدعاء الوظيفة الصحيحة لعرضها اعتمادًا على الوظيفة التي يتم استدعاؤها

آلة حالة السرعة:

ستقوم آلة الحالة هذه بتنفيذ السرعة الحالية اعتمادًا على موقع الأفراد. سيؤدي هذا إلى تنفيذ كل دورة ساعة لنظام GPS

آلة حالة الإخراج:

ستحدد آلة الحالة هذه الإخراج بناءً على المتغير الذي تحدده آلة حالة تغيير العرض ليكون العرض الحالي.

آلة حالة المسافة

ينفذ جهاز الحالة هذا كل دورة على مدار الساعة ويحدد المسافة الإجمالية التي يقطعها المستخدم وبمجرد الضغط على زر إعادة الضبط ، سيعيد ضبط المسافة الحالية المقطوعة.

آلة حالة الموقع:

تقوم آلة الحالة هذه بإرجاع الموقع الحالي للمستخدم ، باستخدام الإحداثيات التي ترجعها وحدة GPS عن المستخدم. تعتمد آلة الحالة هذه على اتصال المستخدمين بالإنترنت.

الخطوة 7: لنطبق نظام GPS الخاص بنا

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

## الملف الرئيسي لنظام الملاحة # # # #

# مكتبات لرسم الصور

من PIL استيراد صورة من PIL استيراد ImageDraw من استيراد PIL ImageFont

# مكتبة لوحدة التحكم ST7737

استيراد ST7735 كـ TFT

# مكتبة لـ GPIO لـ Raspberry Pi

استيراد Adafruit_GPIO مثل GPIO استيراد Adafruit_GPIO. SPI كـ SPI

# مكتبة لنظام تحديد المواقع

#import gpsd من gps3 import gps3

# مكتبة للوقت

وقت الاستيراد

# مكتبة لإيجاد المسافة بين نقطتين

من الرياضيات استيراد sin ، cos ، sqrt ، atan2 ، راديان

# استيراد مكتبة Rpi لاستخدام الأزرار للتبديل بين القوائم وإعادة التعيين

# استيراد RPi. GPIO كـ bGPIO

# دبابيس الإعداد للأزرار

وضع bGPIO.set (bGPIO. BCM)

bGPIO.setup (18 ، bGPIO. IN ، pull_up_down = bGPIO. PUD_DOWN)

bGPIO.setup (23 ، bGPIO. IN ، pull_up_down = bGPIO. PUD_DOWN)

# استيراد مكتبة جيوبى للترميز الجغرافي

# # الوصول إلى الإنترنت ضروري لهذا العمل

من geopy.geocoders استيراد Nominatim

geolocator = Nominatim ()

# الثوابت للنظام

#################################

العرض = 128

الارتفاع = 160 سرعة_ هرتز = 4000000

# دبابيس تكوين Raspberry Pi

DC = 24 # A0 على شاشة TFT RST = 25 # إعادة تعيين الدبوس على شاشة TFT SPI_PORT = 0 # منفذ SPI على raspberry pi ، SPI0 SPI_DEVICE = 0 # Slave حدد على rapsberry pi ، CE0

# إنشاء كائن شاشة TFT LCD

توزيع = TFT. ST7735 (DC، rst = RST، spi = SPI. SpiDev (SPI_PORT، SPI_DEVICE، max_speed_hz = SPEED_HZ))

# تهيئة العرض

disp.begin ()

# سيتم تعيين الخلفية إلى اللون الأخضر

# disp.clear ((0، 255، 0))

# شاشة واضحة للعرض الأبيض

# disp.clear ((255، 255، 255)) draw = disp.draw () # draw.rectangle ((0 ، 10 ، 127 ، 150) ، مخطط تفصيلي = (255 ، 0 ، 0) ، تعبئة = (0 ، 0 ، 255)) # عرض.

# متغيرات وضع السرعة وخط العرض وخط الطول

#currentS = "السرعة الحالية:" # Speed string #totalDis = "إجمالي المسافة:" # Distance string #currentLoc = "الموقع الحالي:" # سلسلة الموقع

# إحداثيات المسافة x و y

distX = 10 distY = 20

PointsList =

# إحداثيات السرعة x و y

السرعة س = 10 سرعة ص = 20

# الموقع x و y المنسقين

locX = 10 locY = 20

# يحول من m / s إلى mph

تحويل = 2.24

# وظيفة تحديث السرعة ، وإرجاع السلسلة

سبيدفار = 0

def speedFunc (): Global SpeedVar SpeedText = data_stream. TPV ['speed'] if (SpeedText! = "n / a"): SpeedText = float (SpeedText) * convertVal SpeedVar = round (SpeedText، 1) # return (SpeedText)

def locationFunc ():

latLoc = str (latFunc ()) lonLoc = str (lonFunc ())

reverseString = latLoc + "،" + lonLoc

الموقع = geolocator.reverse (reverseString)

العودة (location.address)

# وظيفة تحديث Latitude ، ترجع قيمة عائمة

def latFunc (): Latitude = data_stream. TPV ['lat'] if (Latitude == "n / a"): إرجاع 0 else: return float (round (Latitude، 4))

# وظيفة تحديث خط الطول ، وإرجاع السلسلة

def lonFunc (): Longitude = data_stream. TPV ['lon'] if (Longitude == "n / a"): إرجاع 0 else: return float (round (Longitude، 4))

# ترجع دالة المسافة إجمالي المسافة المقطوعة

إجمالي المسافة = 0

def distFunc ():

global totalDistance newLat = latFunc () newLon = lonFunc () if (newLat == 0 أو newLon == 0): totalDistance = totalDistance # return (totalDistance) else: pointsList.append ((newLat، newLon)) last = len (PointsList)) -1 if (last == 0): return else: totalDistance + = coorDistance (pointsList [last-1]، pointsList [last]) # return totalDistance

# يعيد تعيين المسافة الإجمالية

المقاومة defDistance ():

إجمالي المسافة الكلية العالمية = 0

# وظيفة تستخدم لإيجاد المسافة بين إحداثيات

# يستخدم صيغة Haversine للبحث. # نقاط الإدخال عبارة عن مجموعة

def coorDistance (نقطة 1 ، نقطة 2):

# نصف القطر التقريبي للأرض بالكيلومترات ، earthRadius = 6373.0

lat1 = نقطة 1 [0]

lon1 = نقطة 1 [1]

lat2 = نقطة 2 [0]

lon2 = نقطة 2 [1]

DistanceLon = lon2 - lon1

DistanceLat = خط الطول 2 - خط الطول 1

# هافرسين أ

أ = الخطيئة (DistanceLat / 2) ** 2 + cos (lat1) * cos (lat2) * الخطيئة (مسافة Lon / 2) ** 2

# هافرسين ج

ج = 2 * atan2 (sqrt (a)، sqrt (1-a))

# تحويل كم إلى أميال

المسافة = (earthRadius * c) * 0.62137

إذا كانت (مسافة <= 0.01): قم بإرجاع 0.00 وإلا: قم بإرجاع الجولة (المسافة ، 3)

# وظيفة لعرض السرعة على الشاشة

def dispSpeed ():

Global SpeedVar # ضع المسافة على نص متغير على الشاشة ((speedX، speedY)، str (SpeedVar)، font = ImageFont.truetype ("Lato-Medium.ttf"، 72))

# وظيفة لعرض المسافة على الشاشة

def dispDistance ():

draw.text ((distX، distY)، str (totalDistance)، font = ImageFont.truetype ("Lato-Medium.ttf"، 60))

# وظيفة عرض موقع ti على الشاشة ، تتطلب الإنترنت للعمل

def dispLocation ():

draw.text ((locX، locY)، locationFunc ()، font = ImageFont.truetype ("Lato-Medium.ttf"، 8))

# استخدام القاموس لتقليد عبارات التبديل

dispOptions = {

0: dispSpeed، 1: dispDistance، 2: dispLocation}

# وظيفة إخراج الشاشة

إخراج def ():

# استخدام المتغير العام لـ displayIndex global displayIndex # Clearing screen and application background disp.clear ((255، 255، 255)) draw.rectangle ((0، 10، 127، 150)، outline = (255، 0، 0) ، ملء = (255 ، 0 ، 0))

# وظيفة المكالمات تعتمد على قيمة displayIndex

dispOptions [displayIndex] ()

# سوف يمحو إذا نجحت طريقة أخرى

# متغير مسافة المكان على الشاشة

# draw.text ((distX، distY)، str (distFunc ())، font = ImageFont.load_default ()) # متغير سرعة المكان على الشاشة # draw.text ((speedX، speedY)، speedFunc ()، font = ImageFont.load_default ()) # عرض التحديثات على شاشة العرض ()

displayButton = 18 # BCM دبوس على التوت باي

resetButton = 23 # BCM Pin on Raspberry Pi

buttonPress = خطأ

فحص def

زر global ، اضغط عرض الفهرس العام إذا كان (bGPIO.input (displayButton) وليس buttonPress): displayIndex + = 1 buttonPress = True if (displayIndex == 2): displayIndex = 0 elif (bGPIO.input (displayButton) and buttonPress): print (" لا يزال مضغوطًا ") else: buttonPress = False

# إعداد نظام تحديد المواقع

gps_socket = gps3. GPSDSocket () data_stream = gps3. DataStream () gps_socket.connect () gps_socket.watch ()

الموقت الفترة =.5

# قيمة الفهرس للعرض displayIndex = 0 حاول: من أجل new_data في gps_socket: if new_data: data_stream.unpack (new_data) if data_stream. TPV ['lat']! = 'n / a': print (data_stream. TPV ['speed']، data_stream. TPV ['lat']، data_stream. TPV ['lon']) distFunc () speedFunc () output () checkDisplay () if (bGPIO.input (resetButton)): resDistance () else: output () check العرض () إذا كان (bGPIO.input (resetButton)): طباعة resDistance () ('GPS غير متصل بعد') time.sleep (.1) time.sleep (.8) باستثناء KeyboardInterrupt: gps_socket.close () print (' / n أنهى بواسطة المستخدم ctrl + c ')

الكود أعلاه هو مجرد مثال واحد على كيفية ترميز نظامنا وقد قمت بتضمين مقطع فيديو حول كيفية عمل هذا النظام.

موصى به: