هدف این پروژه جمع آوری داده های موقعیت مکانی (طول و عرض جغرافیایی) از طریق UART از یک ماژول GPS و نمایش آنها بر روی LCD 16×2 است.
قطعات مورد نیاز:
Raspberry Pi 3
ماژول GPS مذل Neo 6m v2
LCD سایز ۱۶ * ۲
منبع تغذیه
کابل LAN
مقاومت / پتانسیومتر به LCD
کارت حافظه ۸ یا ۱۶ گیگابایتی دارای Raspbian
ماژول GPS و عملکرد آن:
GPS مخفف سیستم موقعیت یابی جهانی است و برای تشخیص طول و عرض جغرافیایی هر مکان روی زمین، با زمان دقیق UTC (با زمان جهانی هماهنگ) استفاده می شود. ماژول GPS مولفه اصلی در پروژه سیستم ردیابی خودرو است. این دستگاه مختصات ماهواره را برای هر ثانیه با زمان و تاریخ دریافت می کند.
ماژول GPS داده های مربوط به موقعیت ردیابی را به صورت آنلاین ارسال می کند و داده های زیادی را در قالب NMEA ارسال می کند (به تصویر زیر نگاه کنید). قالب NMEA شامل چندین جمله است که در آنها فقط به یک جمله احتیاج داریم.
این جمله از $ GPGGA شروع می شود و شامل مختصات ، زمان و سایر اطلاعات مفید است. این GPGGA به Global Fixing System Fix Data ارجاع می شود.
می توان با شمردن ویرگولهای موجود در رشته، مختصات را از رشته $ GPGGA استخراج کرد. فرض کنید رشته $ GPGGA را پیدا کرده و آن را در یک آرایه ذخیره می کنید، سپس Latitude را می توانید پس از دو ویرگول و بعد از چهار ویرگول را پیدا کنید. اکنون این طول و عرض جغرافیایی را می توان در آرایه های دیگر قرار داد.
در بخش زیر رشته $ GPGGA به همراه توضیحات آن آورده شده است:
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
$GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
Identifier | Description |
$GPGGA | Global Positioning system fix data |
HHMMSS.SSS | Time in hour minute seconds and milliseconds format. |
Latitude | Latitude (Coordinate) |
N | Direction N=North, S=South |
Longitude | Longitude(Coordinate) |
E | Direction E= East, W=West |
FQ | Fix Quality Data |
NOS | No. of Satellites being Used |
HPD | Horizontal Dilution of Precision |
Altitude | Altitude from sea level |
M | Meter |
Height | Height |
Checksum | Checksum Data |
آماده سازی Raspberry Pi برای برقراری ارتباط با GPS:
بسیار خوب، برای اینکه توضیحات خسته کننده نشود، ما فرض می کنیم شما در مورد Raspberry Pi اطلاعات زیادی دارید، برای نصب سیستم عامل، به دست آوردن آدرس IP، اتصال به نرم افزار ترمینال مانند putty و سایر موارد در مورد Raspberry Pi می توانید به آموزش های قبلی ما نگاهی بیاندازید.
در صورت انجام نشدن هر یک از موارد ذکر شده ، من را در بخش نظرات مطلع کنید و خوشحال خواهم شد که به شما کمک کنم.
اولین کاری که برای انجام این پروژه باید انجام دهیم این است که Raspberry Pi 3 خود را آماده کنیم تا بتواند با ماژول GPS از طریق UART ارتباط برقرار کند، ، این تقریبا سخت ترین قسمت پروژه است. در اینجا ما از ماژول GPS Neo 6m v2 استفاده کرده ایم.
برای ورود به این کار، در اینجا توضیح مختصری درباره نحوه کار Raspberry Pi 3 و UART آورده شده است.
Raspberry Pi دارای دو UART داخلی، PL011 و mini UART است. آنها با استفاده از بلوک های سخت افزاری مختلف اجرا می شوند، بنابراین ویژگی های آنها کمی متفاوت است.
اما در Raspberry pi 3، ماژول بی سیم / بلوتوث به PLO11 UART متصل است، در حالی که mini UART برای خروج کنسول linux استفاده می شود. بسته به نوع دیدگاه شما، من PLO11 را به دلیل سطح اجرای آن، به عنوان بهترین UART تعریف می کنم. بنابراین برای این پروژه ما با استفاده از یک پوشش موجود در نسخه فعلی به روز شده Raspbian Jessie، ماژول بلوتوث را از PLO11 UART غیرفعال خواهیم کرد.
مرحله ۱: به روزرسانی Raspberry Pi:
اولین کاری که دوست دارم قبل از شروع هر پروژه انجام دهم بروزرسانی رزبری پای است. بنابراین اجازه دهید دستورات معمول را انجام داده و دستورات زیر را اجرا کنیم.
sudo apt-get update sudo apt-get upgrade
سپس سیستم را با راه اندازی مجدد راه اندازی کنید.
sudo reboot
مرحله ۲: راه اندازی UART در Raspberry Pi:
sudo nano /boot/config.txt
در پایین فایل config.txt ، خطوط زیر را اضافه کنید
dtparam=spi=on dtoverlay=pi3-disable-bt core_freq=250 enable_uart=1 force_turbo=1
برای خروج ctrl + x و y را فشار داده و وارد کنید تا ذخیره شود.
با بررسی مجدد اطمینان حاصل کنید که اشتباه تایپی یا خطایی وجود ندارد زیرا خطایی که باعث می شود از بوت شدن جلوگیری کند.
دلایل این دستورات چیست، force_turbo UART را قادر می سازد از حداکثر فرکانس هسته ای که در این حالت تنظیم می کنیم ۲۵۰ باشد استفاده کند. دلیل این امر اطمینان از ثبات و یکپارچگی داده های سریال دریافت شده است. ذکر این نکته مهم است که استفاده از force_turbo = 1 ضمانت Raspberry Pi را باطل می کند، اما علاوه بر این، بسیار ایمن است.
dtoverlay = pi3-disable-bt بلوتوث را از ttyAMA0 جدا می کند، این به ما این امکان را می دهد تا به جای mini UART ttyS0 از قدرت کامل UART موجود از طریق ttyAMAO استفاده کنیم.
مرحله دوم در بخش تنظیمات UART ویرایش boot / cmdline.txt است
من به شما پیشنهاد می کنم یک کپی از cmdline.txt تهیه کنید و قبل از ویرایش ابتدا آن را ذخیره کنید تا در صورت لزوم بعداً به آن برگردید. این کار را می توان با استفاده از
sudo cp boot/cmdline.txt boot/cmdline_backup.txt sudo nano /boot.cmdline.txt
جایگزین کردن محتوا با
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
ذخیره و خروج.
با انجام این کار، برای ایجاد تغییرات (راه اندازی مجدد sudo) باید سیستم را مجدداً راه اندازی مجدد کنیم.
مرحله ۳: غیرفعال کردن سرویس Getty Serial
این دستور از شروع مجدد آن در هنگام راه اندازی مجدد جلوگیری می کند:
sudo systemctl stop serial-getty@ttyS0.service sudo systemctl disable serial-getty@ttyS0.service
از دستورات زیر می توان برای فعال کردن مجدد آن در صورت نیاز استفاده کرد
sudo systemctl enable serial-getty@ttyS0.service sudo systemctl start serial-getty@ttyS0.service
سیستم را دوباره راه اندازی کنید.
مرحله ۴: فعال کردن ttyAMAO
ما ttyS0 را غیرفعال کردیم، مورد بعدی این است که ttyAMAO را فعال کنیم.
sudo systemctl enable serial-getty@ttyAMA0.service
مرحله ۵: نصب Minicom و pynmea2
ما برای اتصال به ماژول GPS و درک دقیق داده ها به این نرم افزار ها نیاز داریم. این نرم افزار ابزاری است که ما برای تست استفاده خواهیم کرد تا مطمئن شویم ماژول GPS ما به خوبی کار می کند.
sudo apt-get install minicom
برای تجزیه و تحلیل آسان داده های دریافتی، از کتابخانه pynmea2 استفاده خواهیم کرد.
sudo pip install pynmea2
داکیومنت های کتابخانه را می توان در اینجا یافت
https://github.com/Knio/pynmea2
مرحله ۶: نصب کتابخانه LCD
برای این آموزش ما از کتابخانه AdaFruit استفاده خواهیم کرد. این کتابخانه برای AdaFruit ساخته شده است اما برای صفحه نمایش با استفاده از HD44780 نیز کار می کند. اگر نمایشگر همین مدل است، باید بدون مشکل کار کند.
بهتر است که کتابخانه را شبیه سازی کنم و فقط مستقیم نصب کنم. برای شبیه سازی اجرا
git clone https://github.com/adafruit/Adafruit_Python_CharLCD.git
وارد پوشه کلون شده شوید و آن را نصب کنید
cd ./Adafruit_Python_CharLCD sudo python setup.py install
در این مرحله، من راه اندازی مجدد دیگری را پیشنهاد می کنم.
اتصال ماژول GPS به Raspberry Pi
همانطور که در شکل مدار زیر نشان داده شده است ، ماژول GPS و LCD را به Raspberry Pi وصل کنید.
تست برنامه نوشته شده به زبان پایتون:
برای ما مهم است که قبل از اقدام به اسکریپت پایتون، اتصال ماژول GPS را آزمایش کنیم. دستور را اجرا کنید:
sudo minicom -D/dev/ttyAMA0 -b9600
جایی که ۹۶۰۰ نشان دهنده نرخ باود است که ماژول GPS با آن ارتباط برقرار می کند. هنگامی که مطمئن شویم از برقراری ارتباط داده ها بین GPS و RPI یعنی زمان نوشتن اسکریپت پایتون مطمئن هستیم، می توان از این مورد استفاده کرد.
این آزمایش همچنین می تواند با استفاده از cat انجام شود
sudo cat /dev/ttyAMA0
با تمام گفته ها و کارها، زمان آن است که کل سیستم را آزمایش کنید. مهم این است که شما اطمینان حاصل کنید که GPS شما درست کار می کند، اکثر GPS ها برای رفع مشکل به سه تا ۴ ماهواره احتیاج دارند.
کد اجرایی پایتون
Code
import time import serial import string import pynmea2 import RPi GPIO as gpio #to add the LCD library import Adafruit_CharLCD as LCD gpio.setmode(gpio.BCM) #declaring LCD pins lcd_rs = 17 lcd_en = 18 lcd_d4 = 27 lcd_d5 = 22 lcd_d6 = 23 lcd_d7 = 10 lcd_backlight = 2 lcd_columns = 16 #Lcd column lcd_rows = 2 #number of LCD rows lcd = LCD.Adafruit_CharLCD(lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight) port = "/dev/ttyAMA0" # the serial port to which the pi is connected. #create a serial object ser = serial.Serial(port, baudrate = 9600, timeout = 0.5) while 1: try: data = ser.readline() except: print("loading") #wait for the serial port to churn out data if data[0:6] == '$GPGGA': # the long and lat data are always contained in the GPGGA string of the NMEA data msg = pynmea2.parse(data) #parse the latitude and print latval = msg.lat concatlat = "lat:" + str(latval) print concatlat lcd.set_cursor(0,0) lcd.message(concatlat) #parse the longitude and print longval = msg.lon concatlong = "long:"+ str(longval) print concatlong lcd.set_cursor(0,1) lcd.message(concatlong) time.sleep(0.5)#wait a little before picking the next data.
مطالب پیشنهادی برای شما
- MQTT چیست؟
- ارتباط سریال RS-485 بین Raspberry Pi و Arduino Uno
- معرفی Webmin برای کار با Raspberry Pi
- پیدا کردن MAC Address در Raspberry Pi
- ۸ عامل برای انتخاب یک IoT وب سرور
- تفاوت بین روتر و فایروال - مهر ۱۰, ۱۴۰۳
- مسیریابی استاتیک در ویندوز - مهر ۸, ۱۴۰۳
- پروتکل SNMP - شهریور ۱۵, ۱۴۰۳