# خواندن داده‌های GPS - رزبری پای در این بخش از درس، شما یک حسگر GPS به رزبری پای اضافه می‌کنید و مقادیر آن را می‌خوانید. ## سخت‌افزار رزبری پای به یک حسگر GPS نیاز دارد. حسگری که استفاده می‌کنید [Grove GPS Air530 sensor](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html) است. این حسگر می‌تواند به سیستم‌های مختلف GPS متصل شود تا موقعیت‌یابی سریع و دقیق انجام دهد. این حسگر از دو بخش تشکیل شده است - بخش الکترونیکی اصلی حسگر و یک آنتن خارجی که با یک سیم نازک به حسگر متصل شده تا امواج رادیویی ماهواره‌ها را دریافت کند. این حسگر از نوع UART است و داده‌های GPS را از طریق UART ارسال می‌کند. ## اتصال حسگر GPS حسگر Grove GPS می‌تواند به رزبری پای متصل شود. ### وظیفه - اتصال حسگر GPS حسگر GPS را متصل کنید. ![حسگر Grove GPS](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.fa.png) 1. یک سر کابل Grove را به سوکت حسگر GPS وارد کنید. کابل فقط از یک جهت وارد می‌شود. 1. با خاموش بودن رزبری پای، سر دیگر کابل Grove را به سوکت UART که با **UART** روی Grove Base hat متصل به رزبری پای مشخص شده است، وصل کنید. این سوکت در ردیف وسط، در سمت نزدیک به شیار کارت SD قرار دارد، در طرف مقابل پورت‌های USB و سوکت اترنت. ![حسگر Grove GPS متصل به سوکت UART](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.fa.png) 1. حسگر GPS را در موقعیتی قرار دهید که آنتن متصل به آن دید به آسمان داشته باشد - ترجیحاً کنار یک پنجره باز یا در فضای باز. دریافت سیگنال واضح‌تر زمانی آسان‌تر است که چیزی جلوی آنتن نباشد. ## برنامه‌نویسی حسگر GPS اکنون می‌توانید رزبری پای را برای استفاده از حسگر GPS متصل برنامه‌نویسی کنید. ### وظیفه - برنامه‌نویسی حسگر GPS دستگاه را برنامه‌نویسی کنید. 1. رزبری پای را روشن کنید و منتظر بوت شدن آن باشید. 1. حسگر GPS دارای دو LED است - یک LED آبی که هنگام ارسال داده چشمک می‌زند و یک LED سبز که هر ثانیه هنگام دریافت داده از ماهواره‌ها چشمک می‌زند. مطمئن شوید که LED آبی هنگام روشن کردن رزبری پای چشمک می‌زند. پس از چند دقیقه، LED سبز شروع به چشمک زدن می‌کند - اگر این اتفاق نیفتاد، ممکن است نیاز باشد آنتن را جابجا کنید. 1. VS Code را اجرا کنید، یا مستقیماً روی رزبری پای یا از طریق افزونه Remote SSH متصل شوید. > ⚠️ می‌توانید به [دستورالعمل‌های تنظیم و اجرای VS Code در درس 1 در صورت نیاز](../../../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` در ویندوز، لینوکس یا Raspberry Pi OS، `Cmd+v` در macOS) کپی کنید. 1. این فایل را ذخیره کرده و با فشار دادن `Ctrl+x` از nano خارج شوید. وقتی از شما پرسیده شد که آیا می‌خواهید بافر تغییر یافته را ذخیره کنید، `y` را فشار دهید، سپس `enter` را برای تأیید اینکه می‌خواهید `/boot/config.txt` را بازنویسی کنید، فشار دهید. > اگر اشتباهی کردید، می‌توانید بدون ذخیره خارج شوید و سپس این مراحل را تکرار کنید. 1. فایل `/boot/cmdline.txt` را در nano با فرمان زیر ویرایش کنید: ```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. رزبری پای را ریبوت کنید، سپس پس از ریبوت شدن دوباره در VS Code متصل شوید. 1. از ترمینال، یک پوشه جدید در دایرکتوری خانگی کاربر `pi` به نام `gps-sensor` ایجاد کنید. یک فایل در این پوشه به نام `app.py` ایجاد کنید. 1. این پوشه را در VS Code باز کنید. 1. ماژول GPS داده‌های UART را از طریق یک پورت سریال ارسال می‌کند. بسته Pip به نام `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) ``` این کد ماژول `serial` را از بسته Pip `pyserial` وارد می‌کند. سپس به پورت سریال `/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 ``` > اگر هنگام توقف و راه‌اندازی مجدد کد خود یکی از خطاهای زیر را دریافت کردید، یک بلوک `try - except` به حلقه while خود اضافه کنید. ```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 شما موفقیت‌آمیز بود! **سلب مسئولیت**: این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه حرفه‌ای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.