# GPS ഡാറ്റ വായിക്കുക - Raspberry Pi ഈ പാഠത്തിന്റെ ഈ ഭാഗത്ത്, നിങ്ങൾ നിങ്ങളുടെ Raspberry Pi-ലേക്ക് GPS സെൻസർ ചേർത്തു, അതിൽ നിന്നുള്ള മൂല്യങ്ങൾ വായിക്കും. ## ഹാർഡ്‌വെയർ Raspberry Pi-ക്ക് ഒരു GPS സെൻസർ ആവശ്യമാണ്. നിങ്ങൾ ഉപയോഗിക്കുന്ന സെൻസർ [Grove GPS Air530 സെൻസർ](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html) ആണ്. ഈ സെൻസർ വ്യത്യസ്ത GPS സിസ്റ്റങ്ങളുടെ കൂടിയുള്ള കണക്ഷൻ മുഖേന വേഗവും കൃത്യവുമായ ഫിക്‌സിനെ സാധ്യമാക്കുന്നു. സെൻസ് രണ്ടുഭാഗങ്ങളായി നിർമ്മിച്ചിരിക്കുന്നു - സെൻസറിന്റെ മൗലിക ഇലക്ട്രോണിക്സ്, കൂടാതെ വിവിധ ഉപഗ്രഹങ്ങളിൽ നിന്നുള്ള റേഡിയോ തരംഗങ്ങൾ പകരുന്നതിനായി തമ്പർതിയുള്ള വയർ വഴി ബന്ധിപ്പിച്ച ഉള്ളേതായി ഒരു പുറംഅന്തേന. ഇത് UART സെൻസർ ആണ്, അതിനാൽ GPS ഡാറ്റ UART വഴി അയക്കും. ## GPS സെൻസർ കണക്റ്റ് ചെയ്യുക Grove GPS സെൻസർ Raspberry Pi-യുമായി കണക്റ്റ് ചെയ്യാൻ കഴിയും. ### ചുമതല - GPS സെൻസർ കണക്റ്റ് ചെയ്യുക GPS സെൻസർ കണക്റ്റ് ചെയ്യുക. ![A grove GPS sensor](../../../../../translated_images/ml/grove-gps-sensor.247943bf69b03f0d.webp) 1. Grove കേബിളിന്റെ ഒരു അറ്റം GPS സെൻസറിലെ സോക്കറ്റിലേക്ക് ഇറയ്ക്കുക. ഇത് ഒരേയൊരു രീതിയിൽ മാത്രം പോകും. 1. Raspberry Pi പവർ ഓഫ് ചെയ്തിരിക്കുന്നപ്പോൾ, Grove കേബിളിന്റെ മറ്റേ അറ്റം Grove Base ഹാറ്റിൽ Pi-യോട് ചേർന്ന UART സോക്കറ്റിലെ **UART** എന്ന് അടയാളപ്പെടുത്തിയ ഭാഗത്തു കണക്റ്റ് ചെയ്യുക. ഈ സോക്കറ്റ് മധ്യനില റോയിൽ, SD കാർഡ് സ്ലോട്ടിന് ഏറ്റവും അടുത്തുള്ള പക്കിലാണുള്ളത്, USB പോർട്ടുകളും ഇതർനെറ്റ് സോക്കറ്റുകളുമുള്ള മറുവശമല്ല. ![The grove GPS sensor connected to the UART socket](../../../../../translated_images/ml/pi-gps-sensor.1f99ee2b2f652891.webp) 1. GPS സെൻസറിന്റെ അറ്റേന ആകാശത്തിനായി കാണാൻ കഴിയുന്നിടത്ത്, ഉദാഹരണത്തിന് ഒരു തുറന്ന ജനാലക്കപ്പം അല്ലെങ്കിൽ പുറത്തേക്ക്, വച്ചിടുക. അന്തേനയ്ക്ക് തടസ്സമില്ലാതെ സിഗ്നലുകൾ സ്വീകരിക്കുന്നത് എളുപ്പമാണ്. ## GPS സെൻസർ പ്രോഗ്രാം ചെയ്യുക Raspberry Pi ഇപ്പോൾ GPS സെൻസർ ഉപയോഗിക്കുന്നതിനായി പ്രോഗ്രാം ചെയ്യാൻ കഴിയും. ### ചുമതല - GPS സെൻസർ പ്രോഗ്രാം ചെയ്യുക ഉപ്പകരണം പ്രോഗ്രാം ചെയ്യുക. 1. Pi-യെ പവറപ്പിച്ച് ബൂട്ട് ആകുന്നതിന് കാത്തിരിക്കുക 1. GPS സെൻസറിന് രണ്ട് LEDകൾ ഉണ്ട് - ഡാറ്റ പ്രക്ഷേപണം നടക്കുമ്പോൾ തിളക്കുന്ന നീല LED, ഉപഗ്രഹങ്ങളിൽ നിന്നും ഡാറ്റ സ്വീകരിക്കുമ്പോൾ ഓരോ സെക്കന്റ് ഇടവിട്ട് തിളക്കുന്ന പച്ച LED. Pi പവർ ചെയ്യുമ്പോൾ നീല LED തിളക്കുന്നത് ഉറപ്പാക്കുക. കുറച്ച് മിനിറ്റുകൾക്കുശേഷം പച്ച LED തിളക്കും - ഇല്ലെങ്കിൽ, antenne സ്ഥാനം മാറ്റേണ്ടിവരും. 1. VS കോഡ് ആരംഭിക്കുക, Pi-ലോ അല്ലെങ്കിൽ Remote SSH എക്സ്റ്റൻഷൻ വഴി കണക്റ്റ് ചെയ്ത്. > ⚠️ ആവശ്യമെങ്കിൽ [പാഠം 1 ൽ VS കോഡ് സെറ്റപ്പ് ചെയ്യുന്നതും ആരംഭിക്കുന്നതും സംബന്ധിച്ച നിർദേശങ്ങൾ](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md) കാണാം. 1. ബ്ളൂടൂത്ത് പിന്തുണയുള്ള പുതിയ Raspberry Pi മോഡലുകളിൽ, ബ്ളൂടൂത്ത് ഉപയോഗിക്കുന്ന സീരിയൽ പോർട്ടിന്റെയും Grove UART പോർട്ടിന്റെയും ഇടയിൽ ഒരു ഗാര്യഭദം ഉണ്ടാകാം. ഇത് പരിഹരിക്കാൻ: 1. VS കോഡ് ടർമിനലിൽ `nano` എന്ന ടെക്സ്റ്റ് എഡിറ്റർ ഉപയോഗിച്ച് `/boot/config.txt` ഫയൽ എഡിറ്റ് ചെയ്യുക: ```sh sudo nano /boot/config.txt ``` > ഈ ഫയൽ VS കോഡ് സ്റ്റാൻഡേർഡ് പരിധിയിൽ എഡിറ്റ് ചെയ്യാനാകില്ല, കാരണം `sudo` അനുമതികൾ ആവശ്യമാണ്. VS കോഡ് ഈ അനുമതി സാധാരണയായി നൽകാറില്ല. 1. ഫയലിന്റെ അവസാനം പോകുവാൻ കേഴ്‌സർ കീകൾ ഉപയോഗിക്കുക, പിന്നെ താഴെ കാണുന്ന കോഡ് കോപ്പി ചെയ്ത് ഫയലിന്റെ അവസാനം പേസ്റ്റ് ചെയ്യുക: ```ini dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1 ``` നിങ്ങളുടെ ഉപകരണത്തിന് സാധാരണ കീബോർഡ് ഷോർട്ട്‌കട്ടുകൾ ഉപയോഗിച്ച് പേസ്റ്റ് ചെയ്യാം (`Ctrl+v` വിൻഡോസ്, ലിനക്‌സ്, Raspberry Pi OS, `Cmd+v` macOS). 1. ഈ ഫയൽ സേവ് ചെയ്ത് `nano` നിന്നു പുറത്തുവരാൻ `Ctrl+x` അമർത്തുക. മാറ്റം സേവ് ചെയ്യാമോ എന്ന് ചോദിച്ചാൽ `y` അമർത്തുക, ശേഷം `/boot/config.txt` overwrite ചെയ്യുന്നതിന് `enter` അമർത്തുക. > പിശക് സംഭവിച്ചാൽ സേവ് ചെയ്യാതെയുള്ള പുറത്തുവരാൻ കഴിയും, പിന്നെ വീണ്ടും ശ്രമിക്കുക. 1. nano ഉപയോഗിച്ച് `/boot/cmdline.txt` ഫയൽ ഇതുപോലെ എഡിറ്റ് ചെയ്യുക: ```sh sudo nano /boot/cmdline.txt ``` 1. ഈ ഫയലിൽ കമാൻഡ് ലൈൻ കീ/വാല്യു വാക്യങ്ങൾ സ്പേസ് കൊണ്ട് വേർതിരിച്ചിരിക്കുന്നു. `console` എന്ന് തുടങ്ങുന്ന ഏത് കീ/വാല്യു ഊം ചരങ്ങൾ നീക്കം ചെയ്യുക. അവ സാധാരണ ഇങ്ങനെ വരും: ```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. Pi റീബൂട്ട് ചെയ്ത്, പിന്നെ Pi വീണ്ടും ബൂട്ടായ ശേഷം VS കോഡിൽ വീണ്ടും കണക്റ്റ് ചെയ്യുക. 1. ടർമിനലിൽ നിന്നും `pi` ഉപയോക്തൃ ഹോം ഡയറക്ടറിയിൽ `gps-sensor` എന്ന ഫോൾഡർ സൃഷ്ടിക്കുക. ഈ ഫോൾഡറിൾ `app.py` എന്ന ഫയൽ ഉണ്ടാക്കുക. 1. ഈ ഫോൾഡർ VS കോഡിൽ തുറക്കുക 1. GPS മോഡ്യൂൾ UART വഴി സീരിയൽ പോർട്ട് വഴി ഡാറ്റ അയയ്ക്കുന്നു. നിങ്ങളുടെ Python കോഡിൽ നിന്ന് സീരിയൽ പോർട്ട് ഉപയോഗിച്ച് ആശയവിനിമയം നടത്താൻ `pyserial` പിപ് പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുക: ```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` പിപ് പാക്കേജിലെ `serial` മോഡ്യൂൾ ഇറക്കുമതി ചെയ്യുന്നു. പിന്നെ `/dev/ttyAMA0` സീരിയൽ പോർട്ടുമായി കണക്റ്റ് ചെയ്യുന്നു - ഇത് Grove Pi Base ഹാറ്റ് അതിന്റെ UART പോർട്ടിന് ഉപയോഗിക്കുന്ന സീരിയൽ പോർട്ട് വിലാസമാണ്. പിന്നെ ഈ സീരിയൽ കണക്ഷനിൽ നിലവിലുള്ള ഡാറ്റയൊക്കെ നീക്കം ചെയ്യുന്നു. പിന്നാലെ `print_gps_data` എന്ന ഒരു ഫംഗ്ഷൻ നിർവ്വചിച്ചിരിക്കുന്നു, ഇത് പാസ്സായ ലൈനിനെ കൺസോളിൽ പ്രിന്റ് ചെയ്യുന്നു. പിന്നീട് കോഡ് സ്ഥിരമായി ലൂപിൽ പെട്ടെന്ന് തിരിച്ച് സീരിയൽ പോർട്ടിൽ നിന്ന് എത്ര_LINES_ അടിസ്ഥാനവുമുള്ള നമ്പറിലേക്കുൽ എഴുത്തുകൾ വായിച്ച്, ഓരോ ലൈനിനും `print_gps_data` ഫംഗ്ഷൻ വിളിക്കുന്നു. എല്ലാ ഡാറ്റയും വായിച്ചതിനു ശേഷം ലൂപ് 1 സെക്കൻഡ് ഉറങ്ങും, പിന്നെ വീണ്ടും ശ്രമിക്കും. 1. ഈ കോഡ് റൺ ചെയ്യുക. GPS സെൻസറിന്റെ raw output താഴെപോലെയായിരിക്കും കാണുന്നത്: ```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') # ആദ്യ ബൈറ്റ് വായിക്കുന്നത് ഒരു അക്ഷരത്തിന്റെ നടുവിലായിരിക്കാനുള്ള യാദൃച്ഛിക സാധ്യതയുണ്ട്. # മറ്റൊരു പൂർണ്ണ വരി വായിച്ച് തുടരുക. 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) ഉപയോഗിച്ച് വിവര്‍ത്തനം ചെയ്തിരിക്കുന്നു. നാം സതീസ്‍ക്തതയ്ക്ക് ശ്രമിക്കുന്നതിനിടയിലും, ഓട്ടോമാറ്റിക് വിവര്‍ത്തനങ്ങളില്‍ പിഴവുകള്‍ അല്ലെങ്കില്‍ അസ്ഥിരതകള്‍ ഉണ്ടായിരിക്കാം എന്നാണ് ദയവായി മനസിലാക്കേണ്ടത്. അസല്‍ ഭാഷയിലെ പ്രമാണം പ്രസക്തമായ നിലവിലുള്ള ഉറവിടമായിട്ട് കണക്കാക്കണം. നിര്‍ണായക വിവരങ്ങള്‍ക്കായി, പ്രൊഫഷണല്‍ മാനുഷിക വിവര്‍ത്തനം ശുപാര്‍ശ ചെയ്യപ്പെടുന്നു. ഈ വിവര്‍ത്തനത്തിന്റെ ഉപയോഗത്തില്‍ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകള്‍ക്കും പിഴവുകള്‍ക്കുമുള്ള ഉത്തരവാദിത്വം ഞങ്ങള്‍ക്കില്ല.