12 KiB
خواندن دادههای GPS - رزبری پای
در این بخش از درس، شما یک حسگر GPS به رزبری پای اضافه میکنید و مقادیر آن را میخوانید.
سختافزار
رزبری پای به یک حسگر GPS نیاز دارد.
حسگری که استفاده میکنید Grove GPS Air530 sensor است. این حسگر میتواند به سیستمهای مختلف GPS متصل شود تا موقعیتیابی سریع و دقیق انجام دهد. این حسگر از دو بخش تشکیل شده است - بخش الکترونیکی اصلی حسگر و یک آنتن خارجی که با یک سیم نازک به حسگر متصل شده تا امواج رادیویی ماهوارهها را دریافت کند.
این حسگر از نوع UART است و دادههای GPS را از طریق UART ارسال میکند.
اتصال حسگر GPS
حسگر Grove GPS میتواند به رزبری پای متصل شود.
وظیفه - اتصال حسگر GPS
حسگر GPS را متصل کنید.
-
یک سر کابل Grove را به سوکت حسگر GPS وارد کنید. کابل فقط از یک جهت وارد میشود.
-
با خاموش بودن رزبری پای، سر دیگر کابل Grove را به سوکت UART که با UART روی Grove Base hat متصل به رزبری پای مشخص شده است، وصل کنید. این سوکت در ردیف وسط، در سمت نزدیک به شیار کارت SD قرار دارد، در طرف مقابل پورتهای USB و سوکت اترنت.
-
حسگر GPS را در موقعیتی قرار دهید که آنتن متصل به آن دید به آسمان داشته باشد - ترجیحاً کنار یک پنجره باز یا در فضای باز. دریافت سیگنال واضحتر زمانی آسانتر است که چیزی جلوی آنتن نباشد.
برنامهنویسی حسگر GPS
اکنون میتوانید رزبری پای را برای استفاده از حسگر GPS متصل برنامهنویسی کنید.
وظیفه - برنامهنویسی حسگر GPS
دستگاه را برنامهنویسی کنید.
-
رزبری پای را روشن کنید و منتظر بوت شدن آن باشید.
-
حسگر GPS دارای دو LED است - یک LED آبی که هنگام ارسال داده چشمک میزند و یک LED سبز که هر ثانیه هنگام دریافت داده از ماهوارهها چشمک میزند. مطمئن شوید که LED آبی هنگام روشن کردن رزبری پای چشمک میزند. پس از چند دقیقه، LED سبز شروع به چشمک زدن میکند - اگر این اتفاق نیفتاد، ممکن است نیاز باشد آنتن را جابجا کنید.
-
VS Code را اجرا کنید، یا مستقیماً روی رزبری پای یا از طریق افزونه Remote SSH متصل شوید.
⚠️ میتوانید به دستورالعملهای تنظیم و اجرای VS Code در درس 1 در صورت نیاز مراجعه کنید.
-
در نسخههای جدیدتر رزبری پای که از بلوتوث پشتیبانی میکنند، یک تضاد بین پورت سریال مورد استفاده برای بلوتوث و پورت مورد استفاده توسط Grove UART وجود دارد. برای رفع این مشکل، مراحل زیر را انجام دهید:
-
از ترمینال VS Code، فایل
/boot/config.txt
را با استفاده ازnano
، یک ویرایشگر متن داخلی ترمینال، با فرمان زیر ویرایش کنید:sudo nano /boot/config.txt
این فایل نمیتواند توسط VS Code ویرایش شود زیرا نیاز به ویرایش با مجوز
sudo
دارد، یک مجوز ارتقا یافته. VS Code این مجوز را اجرا نمیکند. -
با استفاده از کلیدهای مکاننما به انتهای فایل بروید، سپس کد زیر را کپی کرده و در انتهای فایل قرار دهید:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1
میتوانید با استفاده از میانبرهای معمول صفحهکلید دستگاه خود (
Ctrl+v
در ویندوز، لینوکس یا Raspberry Pi OS،Cmd+v
در macOS) کپی کنید. -
این فایل را ذخیره کرده و با فشار دادن
Ctrl+x
از nano خارج شوید. وقتی از شما پرسیده شد که آیا میخواهید بافر تغییر یافته را ذخیره کنید،y
را فشار دهید، سپسenter
را برای تأیید اینکه میخواهید/boot/config.txt
را بازنویسی کنید، فشار دهید.اگر اشتباهی کردید، میتوانید بدون ذخیره خارج شوید و سپس این مراحل را تکرار کنید.
-
فایل
/boot/cmdline.txt
را در nano با فرمان زیر ویرایش کنید:sudo nano /boot/cmdline.txt
-
این فایل شامل تعدادی جفت کلید/مقدار است که با فاصله جدا شدهاند. هر جفت کلید/مقدار مربوط به کلید
console
را حذف کنید. احتمالاً چیزی شبیه به این خواهند بود:console=serial0,115200 console=tty1
میتوانید با استفاده از کلیدهای مکاننما به این ورودیها بروید، سپس با استفاده از کلیدهای
del
یاbackspace
معمول حذف کنید.برای مثال، اگر فایل اصلی شما به این شکل باشد:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
نسخه جدید به این شکل خواهد بود:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
-
مراحل بالا را دنبال کنید تا این فایل را ذخیره کرده و از nano خارج شوید.
-
رزبری پای را ریبوت کنید، سپس پس از ریبوت شدن دوباره در VS Code متصل شوید.
-
-
از ترمینال، یک پوشه جدید در دایرکتوری خانگی کاربر
pi
به نامgps-sensor
ایجاد کنید. یک فایل در این پوشه به نامapp.py
ایجاد کنید. -
این پوشه را در VS Code باز کنید.
-
ماژول GPS دادههای UART را از طریق یک پورت سریال ارسال میکند. بسته Pip به نام
pyserial
را نصب کنید تا بتوانید از کد پایتون خود با پورت سریال ارتباط برقرار کنید:pip3 install pyserial
-
کد زیر را به فایل
app.py
خود اضافه کنید: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
را از بسته Pippyserial
وارد میکند. سپس به پورت سریال/dev/ttyAMA0
متصل میشود - این آدرس پورت سریالی است که Grove Pi Base Hat برای پورت UART خود استفاده میکند. سپس هر داده موجود در این اتصال سریال را پاک میکند.سپس یک تابع به نام
print_gps_data
تعریف میشود که خطی را که به آن ارسال شده به کنسول چاپ میکند.سپس کد به طور مداوم حلقه میزند و در هر حلقه تا جایی که ممکن است خطوط متن را از پورت سریال میخواند. برای هر خط، تابع
print_gps_data
را فراخوانی میکند.پس از خواندن تمام دادهها، حلقه به مدت 1 ثانیه متوقف میشود و سپس دوباره تلاش میکند.
-
این کد را اجرا کنید. خروجی خام حسگر GPS را مشاهده خواهید کرد، چیزی شبیه به موارد زیر:
$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 خود اضافه کنید.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
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 پیدا کنید.
😀 برنامه حسگر GPS شما موفقیتآمیز بود!
سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.