نحوه اتصال ماژول GPS (NEO-6M) به آردوینو
در این پروژه، نحوه اتصال یک ماژول GPS به آردوینو UNO نشان داده شده است . دادههای طول و عرض جغرافیایی روی صفحه LCD نمایش داده میشوند.
1 - اطلاعات درباره GPS
سوال GPS چیست؟
سامانه موقعیتیابی جهانی (GPS) یک سیستم ناوبری مبتنی بر ماهواره است که از حداقل ۲۴ ماهواره تشکیل شده است. GPS در هر شرایط آبوهوایی، در هر نقطه از جهان، بهصورت ۲۴ ساعته کار میکند و هیچ هزینه اشتراک یا راهاندازی ندارد.
نحوه کار GPS
ماهوارههای GPS دو بار در روز در یک مدار دقیق به دور زمین میچرخند. هر ماهواره سیگنال منحصربهفردی همراه با پارامترهای مداری ارسال میکند که به دستگاههای GPS امکان میدهد موقعیت دقیق ماهواره را رمزگشایی و محاسبه کنند. گیرندههای GPS از این اطلاعات و روش سهجانبهسازی (trilateration) برای محاسبه مکان دقیق کاربر استفاده میکنند. در واقع، گیرنده GPS فاصله تا هر ماهواره را با اندازهگیری مدت زمانی که طول میکشد تا سیگنال ارسالی دریافت شود، محاسبه میکند. با اندازهگیری فاصله از چند ماهواره دیگر، گیرنده میتواند موقعیت کاربر را تعیین کرده و نمایش دهد.
برای محاسبه موقعیت دوبعدی (طول و عرض جغرافیایی) و ردیابی حرکت، گیرنده GPS باید به سیگنال حداقل ۳ ماهواره متصل شود. با دریافت سیگنال از ۴ ماهواره یا بیشتر، گیرنده میتواند موقعیت سهبعدی (طول، عرض جغرافیایی و ارتفاع) را تعیین کند. به طور کلی، یک گیرنده GPS معمولاً ۸ ماهواره یا بیشتر را ردیابی میکند، اما این تعداد به زمان روز و مکان شما روی زمین بستگی دارد.
هنگامی که موقعیت شما تعیین شد، دستگاه GPS میتواند اطلاعات دیگری مانند موارد زیر را محاسبه کند:
– سرعت
– جهت (Bearing)
– مسیر (Track)
– مسافت سفر
– فاصله تا مقصد
سیگنال چیست؟
ماهوارههای GPS حداقل دو سیگنال رادیویی کمقدرت ارسال میکنند. این سیگنالها بهصورت خط دید (Line of Sight) حرکت میکنند، به این معنی که میتوانند از ابرها، شیشه و پلاستیک عبور کنند، اما از اکثر اشیاء جامد مانند ساختمانها و کوهها عبور نمیکنند. با این حال، گیرندههای مدرن حساستر هستند و معمولاً میتوانند حتی در داخل خانهها سیگنال را ردیابی کنند.
یک سیگنال GPS شامل سه نوع اطلاعات مختلف است:
– کد شبهتصادفی (Pseudorandom Code): این یک کد شناسایی است که مشخص میکند کدام ماهواره در حال ارسال اطلاعات است. شما میتوانید ببینید که از کدام ماهوارهها سیگنال دریافت میکنید در صفحه ماهوارههای دستگاهتان.
– دادههای افمرید (Ephemeris Data): این دادهها برای تعیین موقعیت ماهواره لازم هستند و اطلاعات مهمی درباره سلامت ماهواره، تاریخ و زمان کنونی ارائه میدهند.
– دادههای آلمانیک (Almanac Data): این دادهها به گیرنده GPS میگویند که هر ماهواره GPS در هر زمان از روز کجا باید باشد و اطلاعات مداری مربوط به آن ماهواره و هر ماهواره دیگر در سیستم را نشان میدهد.
2. دانلود و نصب کتابخانههای مورد نیاز برای عملکرد GPS در Arduino IDE
1- کتابخانه SoftwareSerial
کتابخانه SoftwareSerial به شما امکان میدهد تا پینهای دیجیتال معمولی آردوینو را به پورتهای سریال اضافی تبدیل کنید تا بتوانید با ماژول GPS ارتباط برقرار کنید. برای نصب این کتابخانه:
- نرمافزار Arduino IDE را باز کنید.
- به منوی Sketch > Include Library > Manage Libraries بروید.
- در نوار جستجو، عبارت “SoftwareSerial“ را تایپ کنید.
- کتابخانه SoftwareSerial را که توسط Arduino ارائه شده است، پیدا کنید.
- روی دکمه Install کلیک کنید تا کتابخانه نصب شود.
2- کتابخانه TinyGPS
کتابخانه TinyGPS برای تجزیه و تحلیل دادههای GPS (مانند مختصات، زمان و غیره) از ماژول GPS استفاده میشود. برای نصب این کتابخانه:
- در Arduino IDE، به Sketch > Include Library > Manage Libraries بروید.
- عبارت “TinyGPS“ یا “++TinyGPS“ را در نوار جستجو وارد کنید.
- کتابخانه TinyGPSPlus (یا TinyGPS) را پیدا کنید.
- روی Install کلیک کنید تا کتابخانه نصب شود.
نکته: توصیه میشود از کتابخانه TinyGPSPlus استفاده کنید، زیرا نسخه جدیدتر و پیشرفتهتری نسبت به TinyGPS است و قابلیتهای بیشتری دارد.
3. ماژول GPS NEO-6M
ماژول GPS NEO-6M در شکل زیر نشان داده شده است. این ماژول همراه با یک آنتن خارجی ارائه میشود و فاقد پینهای هدر است. بنابراین، باید پینها را به آن لحیم کنید.
مرور کلی ماژول GPS NEO-6M
چیپ GPS NEO-6M
قلب این ماژول، چیپ GPS NEO-6M از شرکت u-blox است. این چیپ قادر است تا ۲۲ ماهواره را در ۵۰ کانال ردیابی کند و بالاترین سطح حساسیت در صنعت، یعنی ردیابی -۱۶۱ دسیبل، را ارائه میدهد، در حالی که تنها ۴۵ میلیآمپر جریان مصرف میکند. موتور موقعیتیابی u-blox 6 همچنین دارای زمان رسیدن به اولین موقعیت (TTFF) کمتر از ۱ ثانیه است. یکی از بهترین ویژگیهای این چیپ، حالت صرفهجویی در مصرف انرژی (Power Save Mode – PSM) است. این حالت با روشن و خاموش کردن انتخابی بخشهایی از گیرنده، مصرف انرژی سیستم را کاهش میدهد. این ویژگی مصرف انرژی ماژول را به تنها ۱۱ میلیآمپر کاهش میدهد و آن را برای کاربردهای حساس به مصرف انرژی، مانند ساعتهای مچی GPS، مناسب میکند. پینهای داده ضروری چیپ GPS NEO-6M به هدرهای با فاصله ۰.۱ اینچ متصل شدهاند. این پینها شامل پینهای مورد نیاز برای ارتباط با یک میکروکنترلر از طریق UART هستند.
توجه: این ماژول از نرخ باود ۴۸۰۰ تا ۲۳۰۴۰۰ بیت بر ثانیه پشتیبانی میکند و نرخ باود پیشفرض آن ۹۶۰۰ است.
نشانگر LED موقعیتیابی
روی ماژول GPS NEO-6M یک LED وجود دارد که وضعیت موقعیتیابی را نشان میدهد. این LED بسته به حالت ماژول با نرخهای مختلفی چشمک میزند:
– بدون چشمک زدن: به این معناست که ماژول در حال جستجوی ماهوارههاست.
– چشمک زدن هر ۱ ثانیه: به این معناست که موقعیتیابی انجام شده است.
رگولاتور 3.3 ولت
ولتاژ کاری چیپ NEO-6M بین ۲.۷ تا ۳.۶ ولت است. اما این ماژول مجهز به رگولاتور MIC5205 با افت ولتاژ بسیار پایین برای تولید ۳.۳ ولت است. پینهای منطقی این ماژول نیز تا ۵ ولت تحمل دارند، بنابراین میتوان آن را بهراحتی به آردوینو یا هر میکروکنترلر با منطق ۵ ولت بدون نیاز به مبدل سطح منطقی متصل کرد.
باتری و EEPROM
ماژول مجهز به یک EEPROM سریال دوسیمه مدل HK24C32 است. این EEPROM دارای ظرفیت ۴ کیلوبایت است و از طریق پروتکل I2C به چیپ NEO-6M متصل شده است. همچنین، این ماژول شامل یک باتری دکمهای قابل شارژ است که بهعنوان یک سوپرکاپاسیتور عمل میکند.
EEPROM به همراه باتری به حفظ حافظه RAM پشتیبانیشده توسط باتری (BBR) کمک میکند. این حافظه شامل دادههای ساعت، آخرین دادههای موقعیت (GNSS یا دادههای بیت) و تنظیمات ماژول است. اما این حافظه برای ذخیرهسازی دائمی دادهها طراحی نشده است.
وجود باتری باعث میشود که دادههای ساعت و آخرین موقعیت حفظ شوند، در نتیجه زمان رسیدن به اولین موقعیت (TTFF) به طور قابلتوجهی به ۱ ثانیه کاهش مییابد. این ویژگی امکان قفل شدن سریعتر موقعیت را فراهم میکند.
بدون باتری، GPS همیشه در حالت استارت سرد (Cold Start) قرار میگیرد و در نتیجه قفل اولیه GPS زمان بیشتری طول میکشد. باتری هنگام اعمال توان بهصورت خودکار شارژ میشود و میتواند دادهها را تا دو هفته بدون منبع تغذیه حفظ کند.
ماژول GPS NEO-6M دارای پینهایی است که برای اتصال به میکروکنترلرها (مانند آردوینو) استفاده میشود. در زیر توضیح پینهای اصلی آورده شده است:
| پین | توضیحات |
|---|---|
| VCC | تغذیه (2.7 تا 3.6 ولت، معمولاً 3.3 ولت). به پین 3.3V یا 5V آردوینو (با توجه به رگولاتور داخلی) متصل میشود. |
| GND | زمین (Ground). به پین GND آردوینو متصل میشود. |
| TX | انتقال داده (Transmit). دادههای سریال را به میکروکنترلر ارسال میکند (به پین دیجیتال آردوینو متصل میشود). |
| RX | دریافت داده (Receive). دادههای سریال را از میکروکنترلر دریافت میکند (به پین دیجیتال آردوینو متصل میشود). |
آردوینو UNO
آردوینو یک پلتفرم الکترونیکی متنباز است که بر پایه سختافزار و نرمافزار ساده و کاربرپسند طراحی شده است. بردهای آردوینو قادر به خواندن ورودیها هستند – مانند نور روی یک حسگر، لمس یک دکمه یا پیام توییتر – و تبدیل آن به خروجیهایی مثل فعال کردن یک موتور، روشن کردن یک LED یا انتشار چیزی در اینترنت. شما میتوانید با ارسال مجموعهای از دستورات به میکروکنترلر روی برد، به آن بگویید چه کاری انجام دهد. برای این کار از زبان برنامهنویسی آردوینو (بر پایه Wiring) و نرمافزار آردوینو (IDE)، که بر پایه Processing ساخته شده است، استفاده میکنید.
توضیحات پینهای آردوینو
آردوینو اونو یک برد میکروکنترلر است که بر پایه میکروکنترلر ۸ بیتی ATmega328P ساخته شده است. این برد علاوه بر ATmega328P شامل اجزای دیگری مانند اسیلاتور کریستالی، ارتباط سریال، رگولاتور ولتاژ و غیره است که از میکروکنترلر پشتیبانی میکنند. آردوینو اونو دارای ۱۴ پین ورودی/خروجی دیجیتال (که ۶ تای آنها میتوانند بهعنوان خروجی PWM استفاده شوند)، ۶ پین ورودی آنالوگ، یک اتصال USB، یک جک بشکهای تغذیه، یک هدر ICSP و یک دکمه ریست است.
۱۴ پین ورودی/خروجی دیجیتال میتوانند با استفاده از توابع `()pinMode`، `digitalRead()` و `digitalWrite()` در برنامهنویسی آردوینو بهعنوان پین ورودی یا خروجی استفاده شوند. هر پین با ولتاژ ۵ ولت کار میکند و میتواند حداکثر ۴۰ میلیآمپر جریان ارائه دهد یا دریافت کند. همچنین، هر پین دارای یک مقاومت داخلی pull-up با مقدار ۲۰ تا ۵۰ کیلواهم است که بهصورت پیشفرض غیرفعال است. از میان این ۱۴ پین، برخی از آنها دارای عملکردهای خاص هستند که در زیر فهرست شدهاند:
– پینهای سریال 0 (Rx) و 1 (Tx): پینهای Rx و Tx برای دریافت و ارسال دادههای سریال TTL استفاده میشوند. این پینها به چیپ سریال USB به TTL مربوط به ATmega328P متصل هستند.
– پینهای وقفه خارجی 2 و 3: این پینها میتوانند طوری تنظیم شوند که در صورت مقدار پایین، لبه بالارونده یا پایینرونده، یا تغییر مقدار، وقفهای را فعال کنند.
– پینهای PWM 3، 5، 6، 9 و 11: این پینها با استفاده از تابع `analogWrite()` خروجی PWM ۸ بیتی ارائه میدهند.
– پینهای SPI 10 (SS)، 11 (MOSI)، 12 (MISO) و 13 (SCK): این پینها برای ارتباط SPI استفاده میشوند.
– پین LED داخلی 13: این پین به یک LED داخلی متصل است. وقتی پین 13 در حالت HIGH باشد، LED روشن میشود و وقتی در حالت LOW باشد، خاموش است.
– پینهای ورودی آنالوگ: ۶ پین ورودی آنالوگ وجود دارد که هر کدام رزولوشن ۱۰ بیتی (یعنی ۱۰۲۴ مقدار مختلف) ارائه میدهند. این پینها ولتاژ را از ۰ تا ۵ ولت اندازهگیری میکنند، اما این محدوده میتواند با استفاده از پین AREF و تابع `analogReference()` افزایش یابد.
– پینهای آنالوگ 4 (SDA) و 5 (SCL):** این پینها همچنین برای ارتباط TWI با استفاده از کتابخانه Wire استفاده میشوند.
– پین AREF: برای ارائه ولتاژ مرجع برای ورودیهای آنالوگ با استفاده از تابع `analogReference()` به کار میرود.
– پین ریست: با پایین آوردن (LOW کردن) این پین، میکروکنترلر ریست میشود.
۴. اتصال آردوینو UNO و ماژول GPS
چهار پین ماژول UBLOX را به آردوینو بهصورت زیر متصل کنید:
| ماژول GPS | آردوینو |
|---|---|
| GND | GND |
| TX | پین دیجیتال (D3) |
| RX | پین دیجیتال (D4) |
| Vcc | 3.3 ولت |
توصیه: پیشنهاد میکنم از یک منبع تغذیه خارجی برای تأمین برق ماژول GPS استفاده کنید، زیرا حداقل ولتاژ مورد نیاز برای عملکرد ماژول GPS، ۳.۳ ولت است و آردوینو قادر به تأمین این مقدار ولتاژ بهصورت پایدار نیست.
۶. اتصال آردوینو اونو و LCD
| ماژول LCD | آردوینو |
|---|---|
| VSS | GND |
| VCC | ۵ ولت |
| VEE | مقاومت ۱۰ کیلواهم |
| RS | A0 (پین آنالوگ) |
| R/W | GND |
| E | A1 |
| D4 | A2 |
| D5 | A3 |
| D6 | A4 |
| D7 | A5 |
| LED+ | VCC با یک مقاومت 220 اهم |
| LED- | GND |
در زیر کد با کامنتهای فارسی ارائه شده است که هر بخش را بهصورت روان و دقیق توضیح میدهد:
#include // شامل کردن کتابخانه برای کار با نمایشگر LCD
#include // شامل کردن کتابخانه برای ارتباط سریال نرمافزاری
#include // شامل کردن کتابخانه برای پردازش دادههای GPS
float lat = 28.5458, lon = 77.1703; // تعریف متغیرهای شناور برای ذخیره عرض جغرافیایی (latitude) و طول جغرافیایی (longitude)
SoftwareSerial gpsSerial(3, 4); // تعریف پینهای سریال نرمافزاری برای ارتباط با ماژول GPS (پین 3 به RX و پین 4 به TX)
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5); // تعریف شیء LCD با استفاده از پینهای آنالوگ A0 تا A5 برای اتصال به LCD
TinyGPS gps; // تعریف شیء برای پردازش دادههای GPS با استفاده از کتابخانه TinyGPS
void setup() {
Serial.begin(9600); // شروع ارتباط سریال با نرخ باود 9600 برای نمایش اطلاعات در سریال مانیتور
//Serial.println("The GPS Received Signal:"); // خطی که غیرفعال شده و برای چاپ پیام اولیه در سریال مانیتور استفاده میشود
gpsSerial.begin(9600); // شروع ارتباط سریال با ماژول GPS با نرخ باود 9600
lcd.begin(16, 2); // راهاندازی نمایشگر LCD با ابعاد 16 ستون و 2 سطر
}
void loop() {
while (gpsSerial.available()) { // بررسی وجود داده از ماژول GPS
if (gps.encode(gpsSerial.read())) { // رمزگشایی دادههای دریافتی از GPS
gps.f_get_position(&lat, &lon); // دریافت مقادیر عرض و طول جغرافیایی از دادههای GPS
// نمایش موقعیت روی LCD
lcd.clear(); // پاک کردن صفحه LCD
lcd.setCursor(1, 0); // تنظیم مکاننما در ستون 1، سطر 0
lcd.print("GPS Signal"); // نمایش پیام "GPS Signal" روی LCD
// بخشهای غیرفعال شده برای چاپ مختصات در سریال مانیتور
//Serial.print("Position: ");
//Serial.print("Latitude:");
//Serial.print(lat, 6);
//Serial.print(";");
//Serial.print("Longitude:");
//Serial.println(lon, 6);
lcd.setCursor(1, 0); // تنظیم مکاننما در ستون 1، سطر 0
lcd.print("LAT:"); // نمایش برچسب "LAT:" برای عرض جغرافیایی
lcd.setCursor(5, 0); // تنظیم مکاننما در ستون 5، سطر 0
lcd.print(lat); // نمایش مقدار عرض جغرافیایی
//Serial.print(lat); // خط غیرفعال برای چاپ عرض جغرافیایی در سریال مانیتور
//Serial.print(" "); // خط غیرفعال برای چاپ فاصله در سریال مانیتور
lcd.setCursor(0, 1); // تنظیم مکاننما در ستون 0، سطر 1
lcd.print(",LON:"); // نمایش برچسب ",LON:" برای طول جغرافیایی
lcd.setCursor(5, 1); // تنظیم مکاننما در ستون 5، سطر 1
lcd.print(lon); // نمایش مقدار طول جغرافیایی
}
}
String latitude = String(lat, 6); // تبدیل مقدار عرض جغرافیایی به رشته با 6 رقم اعشار
String longitude = String(lon, 6); // تبدیل مقدار طول جغرافیایی به رشته با 6 رقم اعشار
Serial.println(latitude + ";" + longitude); // چاپ عرض و طول جغرافیایی در سریال مانیتور با فرمت "latitude;longitude"
delay(1000); // تأخیر 1 ثانیهای برای بهروزرسانی دادهها
}