# GPS डेटा पढ़ें - रास्पबेरी पाई इस पाठ के इस भाग में, आप अपने रास्पबेरी पाई में एक GPS सेंसर जोड़ेंगे और उससे डेटा पढ़ेंगे। ## हार्डवेयर रास्पबेरी पाई को एक GPS सेंसर की आवश्यकता है। आप जो सेंसर उपयोग करेंगे वह [Grove GPS Air530 सेंसर](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html) है। यह सेंसर कई GPS सिस्टम्स से जुड़ सकता है ताकि तेज़ और सटीक डेटा प्राप्त किया जा सके। यह सेंसर दो भागों से बना है - सेंसर का मुख्य इलेक्ट्रॉनिक्स और एक बाहरी एंटीना जो पतले तार से जुड़ा होता है ताकि सैटेलाइट्स से रेडियो तरंगें प्राप्त की जा सकें। यह एक UART सेंसर है, जो UART के माध्यम से GPS डेटा भेजता है। ## GPS सेंसर को कनेक्ट करें Grove GPS सेंसर को रास्पबेरी पाई से जोड़ा जा सकता है। ### कार्य - GPS सेंसर को कनेक्ट करें GPS सेंसर को कनेक्ट करें। ![एक Grove GPS सेंसर](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.hi.png) 1. Grove केबल का एक सिरा GPS सेंसर के सॉकेट में डालें। यह केवल एक ही दिशा में जाएगा। 1. रास्पबेरी पाई को बंद करके, Grove केबल का दूसरा सिरा Grove बेस हैट पर **UART** नामक सॉकेट में कनेक्ट करें। यह सॉकेट मध्य पंक्ति में है, SD कार्ड स्लॉट के पास, USB पोर्ट्स और ईथरनेट सॉकेट के विपरीत दिशा में। ![UART सॉकेट से जुड़ा Grove GPS सेंसर](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.hi.png) 1. GPS सेंसर को इस तरह से रखें कि जुड़ा हुआ एंटीना आकाश को देख सके - आदर्श रूप से एक खुली खिड़की के पास या बाहर। एंटीना के रास्ते में कुछ भी न होने पर सिग्नल अधिक स्पष्ट रूप से प्राप्त होता है। ## GPS सेंसर को प्रोग्राम करें अब रास्पबेरी पाई को जुड़े हुए GPS सेंसर का उपयोग करने के लिए प्रोग्राम किया जा सकता है। ### कार्य - GPS सेंसर को प्रोग्राम करें डिवाइस को प्रोग्राम करें। 1. पाई को चालू करें और इसके बूट होने की प्रतीक्षा करें। 1. GPS सेंसर में 2 LED होती हैं - एक नीली LED जो डेटा ट्रांसमिट होने पर चमकती है, और एक हरी LED जो सैटेलाइट्स से डेटा प्राप्त होने पर हर सेकंड चमकती है। सुनिश्चित करें कि पाई चालू करने पर नीली LED चमक रही हो। कुछ मिनटों के बाद हरी LED चमकने लगेगी - यदि ऐसा नहीं होता है, तो आपको एंटीना को पुनः स्थिति में रखना पड़ सकता है। 1. VS Code लॉन्च करें, या तो सीधे पाई पर, या Remote SSH एक्सटेंशन के माध्यम से कनेक्ट करें। > ⚠️ यदि आवश्यक हो, तो [पाठ 1 में VS Code सेटअप और लॉन्च करने के निर्देशों का संदर्भ लें](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md)। 1. रास्पबेरी पाई के नए संस्करणों में जो ब्लूटूथ का समर्थन करते हैं, ब्लूटूथ के लिए उपयोग किए जाने वाले सीरियल पोर्ट और Grove UART पोर्ट के लिए उपयोग किए जाने वाले पोर्ट के बीच एक संघर्ष होता है। इसे ठीक करने के लिए निम्नलिखित करें: 1. VS Code टर्मिनल से, `/boot/config.txt` फ़ाइल को `nano` का उपयोग करके संपादित करें, जो एक अंतर्निहित टर्मिनल टेक्स्ट एडिटर है, निम्नलिखित कमांड के साथ: ```sh sudo nano /boot/config.txt ``` > इस फ़ाइल को VS Code द्वारा संपादित नहीं किया जा सकता क्योंकि इसे `sudo` अनुमतियों, यानी उन्नत अनुमतियों के साथ संपादित करने की आवश्यकता है। VS Code इन अनुमतियों के साथ नहीं चलता। 1. कर्सर कुंजियों का उपयोग करके फ़ाइल के अंत तक जाएं। फिर नीचे दिए गए कोड को कॉपी करें और इसे फ़ाइल के अंत में पेस्ट करें: ```ini dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1 ``` आप अपने डिवाइस के सामान्य कीबोर्ड शॉर्टकट का उपयोग करके पेस्ट कर सकते हैं (`Ctrl+v` Windows, Linux या Raspberry Pi OS पर, `Cmd+v` macOS पर)। 1. इस फ़ाइल को सहेजें और `Ctrl+x` दबाकर nano से बाहर निकलें। जब पूछा जाए कि क्या आप संशोधित बफर को सहेजना चाहते हैं, तो `y` दबाएं, फिर `/boot/config.txt` को ओवरराइट करने की पुष्टि करने के लिए `enter` दबाएं। > यदि आप कोई गलती करते हैं, तो बिना सहेजे बाहर निकल सकते हैं और फिर इन चरणों को दोहरा सकते हैं। 1. `/boot/cmdline.txt` फ़ाइल को nano में निम्नलिखित कमांड के साथ संपादित करें: ```sh sudo nano /boot/cmdline.txt ``` 1. इस फ़ाइल में कई key/value जोड़े होते हैं जो स्पेस से अलग होते हैं। `console` key के लिए किसी भी key/value जोड़े को हटा दें। वे संभवतः इस तरह दिखेंगे: ```output console=serial0,115200 console=tty1 ``` आप कर्सर कुंजियों का उपयोग करके इन प्रविष्टियों पर जा सकते हैं, फिर सामान्य `del` या `backspace` कुंजियों का उपयोग करके हटा सकते हैं। उदाहरण के लिए, यदि आपकी मूल फ़ाइल इस तरह दिखती है: ```output console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` नई संस्करण इस तरह होगा: ```output root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` 1. ऊपर दिए गए चरणों का पालन करके इस फ़ाइल को सहेजें और nano से बाहर निकलें। 1. अपने पाई को पुनः चालू करें, फिर पाई के पुनः चालू होने के बाद VS Code में पुनः कनेक्ट करें। 1. टर्मिनल से, `pi` उपयोगकर्ता के होम डायरेक्टरी में एक नया फ़ोल्डर बनाएं जिसका नाम `gps-sensor` हो। इस फ़ोल्डर में `app.py` नामक एक फ़ाइल बनाएं। 1. इस फ़ोल्डर को VS Code में खोलें। 1. GPS मॉड्यूल UART डेटा को सीरियल पोर्ट के माध्यम से भेजता है। Python कोड से सीरियल पोर्ट के साथ संवाद करने के लिए `pyserial` Pip पैकेज इंस्टॉल करें: ```sh pip3 install pyserial ``` 1. अपने `app.py` फ़ाइल में निम्नलिखित कोड जोड़ें: ```python import time import serial serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) serial.reset_input_buffer() serial.flush() def print_gps_data(line): print(line.rstrip()) while True: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data(line) line = serial.readline().decode('utf-8') time.sleep(1) ``` यह कोड `pyserial` Pip पैकेज से `serial` मॉड्यूल को आयात करता है। फिर यह `/dev/ttyAMA0` सीरियल पोर्ट से जुड़ता है - यह वह पता है जो Grove Pi Base Hat अपने UART पोर्ट के लिए उपयोग करता है। इसके बाद यह इस सीरियल कनेक्शन से किसी भी मौजूदा डेटा को साफ करता है। इसके बाद एक `print_gps_data` नामक फ़ंक्शन परिभाषित किया जाता है जो पास की गई लाइन को कंसोल पर प्रिंट करता है। इसके बाद कोड हमेशा के लिए लूप करता है, प्रत्येक लूप में सीरियल पोर्ट से जितनी लाइनों का टेक्स्ट पढ़ सकता है उतना पढ़ता है। यह प्रत्येक लाइन के लिए `print_gps_data` फ़ंक्शन को कॉल करता है। सभी डेटा पढ़ने के बाद, लूप 1 सेकंड के लिए सोता है, फिर पुनः प्रयास करता है। 1. इस कोड को चलाएं। आपको GPS सेंसर से कच्चा आउटपुट दिखाई देगा, कुछ इस तरह: ```output $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $BDGSA,A,1,,,,,,,,,,,,,,,*0F $GPGSV,1,1,00*79 $BDGSV,1,1,00*68 ``` > यदि आप कोड को रोकने और पुनः शुरू करने पर निम्नलिखित त्रुटियों में से कोई एक प्राप्त करते हैं, तो अपने while लूप में एक `try - except` ब्लॉक जोड़ें। ```output UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte ``` ```python while True: try: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data() line = serial.readline().decode('utf-8') # There's a random chance the first byte being read is part way through a character. # Read another full line and continue. except UnicodeDecodeError: line = serial.readline().decode('utf-8') time.sleep(1) ``` > 💁 आप इस कोड को [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi) फ़ोल्डर में पा सकते हैं। 😀 आपका GPS सेंसर प्रोग्राम सफल रहा! **अस्वीकरण**: यह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।