آموزش راه اندازی برد رزبری پای و ماژول GPS

یکی از جالبترین ویژگی های سیستم عامل های امبدد این است که مانند آردوینو به سازندگان این امکان را داده است که با استفاده از ماژول GPS به راحتی داده های مکان را بدست آورند و بنابراین چیزهایی را بسازند که به مکان متکی باشند.

 

با صرفه جویی در هزینه Raspberry Pi، ساخت پروژه های مبتنی بر GPS با همان ماژول های GPS ارزان قیمت بسیار جالب خواهد بود. امروز در این پروژه ارتباط ماژول GPS با Raspberry Pi 3 خواهیم داشت.

هدف این پروژه جمع آوری داده های موقعیت مکانی (طول و عرض جغرافیایی) از طریق UART از یک ماژول GPS و نمایش آنها بر روی LCD 16×2 است.

 


قطعات مورد نیاز:

Raspberry Pi ۳
 ماژول 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 را می توانید پس از دو ویرگول و بعد از چهار ویرگول را پیدا کنید. اکنون این طول و عرض جغرافیایی را می توان در آرایه های دیگر قرار داد.

gps data

 

در بخش زیر رشته $ 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:

اولین کاری که در این مورد انجام خواهیم داد ویرایش پرونده /boot/config.txt است. برای انجام این کار ، دستورات زیر را اجرا کنید:
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 را فشار داده و وارد کنید تا ذخیره شود.

config

 

با بررسی مجدد اطمینان حاصل کنید که اشتباه تایپی یا خطایی وجود ندارد زیرا خطایی که باعث می شود از بوت شدن جلوگیری کند.

دلایل این دستورات چیست، 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 وصل کنید.

circuit

تست برنامه نوشته شده به زبان  پایتون:

برای ما مهم است که قبل از اقدام به اسکریپت پایتون، اتصال ماژول GPS را آزمایش کنیم. دستور را اجرا کنید:

sudo minicom -D/dev/ttyAMA0 -b9600

جایی که ۹۶۰۰ نشان دهنده نرخ باود است که ماژول GPS با آن ارتباط برقرار می کند. هنگامی که مطمئن شویم از برقراری ارتباط داده ها بین GPS و RPI یعنی زمان نوشتن اسکریپت پایتون مطمئن هستیم، می توان از این مورد استفاده کرد.

این آزمایش همچنین می تواند با استفاده از cat انجام شود

sudo cat /dev/ttyAMA0

cat

 

با تمام گفته ها و کارها، زمان آن است که کل سیستم را آزمایش کنید. مهم این است که شما اطمینان حاصل کنید که GPS شما درست کار می کند، اکثر 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.



مطالب پیشنهادی برای شما


 

محمد صداقتی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *