نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
آزادی حجاز از دست نااهلان
مهدی دمیرچیلو

پروتکل NMEA 0183

به نام خدا : این مطلب ترجمه سند NMEA 0183 Protocol 2000-2001 v3.0 هستش ( نسخه اصلی این سند در ته مطلب قرار داده شده برای دانلود )؛ خلاصه داستان اینه که NMEA 0183، یک نوع فرمت/استاندارد برای تبادل داده بین دستگاه‌ها هستش؛ در ته مطلب، قسمت مطالب مرتبط، یه سری لینک و یک فایل pdf به زبان فارسی گزاشتم که میخونید و متوجه داستان NMEA 0183 میشید، در زیر سعی میکنم یکم کاربردی/عملیاتی ( خخخ ) توضیح بدم؛ البته نمیدونم چرا مجموعه NMEA، از لفظ پروتکل استفاده کردن، لفظ استاندارد بهتر نبود؟ بگذریم، حوصله بازی با کلمات رو ندارم؛ اصل داستان و کاربرد و استفاده ازش مهمه برا ما، والااااااااا

پروتکل NMEA 0183

پروتکل NMEA 0183

 

مقدمه

وبسایت این پروتکل : nmea.org

 

مخفف : NMEA مخفف عبارت National Marine Electronics Association ( انجمن ملی الکترونیک دریایی ) هستش.

 

پروتکل تبادل داده : پیشنهاد میشه که خروجی گوینده، مطابق با EIA RS-422 باشه؛ هرچند که RS232 هم قبوله!؛ مدارهای differential در مقابل نویز مقاومتر هستند؛ پروتکل RS422  از این متد برای تبادل داده استفاده میکند و RS232 از روش دیفرانسیل برای تبادل داده استفاده نمیکنه؛ در هر دو روش ( RS232 یا RS422 ) توصیه میشه که در مدار گیرنده، از opto-isolator با مدار محافظ مناسب استفاده کنید؛ در گیرنده، پایه ورودی باید از زمین جدا/ایزوله بشه.

 

مشخصات ارتباط سریال دستگاه :

  1. Baud rate : 4800
  2. Number of data bits : 8 (bit 7 is 0)
  3. Stop bits : 1 (or more)
  4. Parity : none
  5. Handshake : none

 

NMEA HS-0183 : نسخه جدیدتر NMEA 0183 هستش ( HS = high speed )، که از یک رابط 3 سیمه و نرخ انتقال داده ( Baud rate ) برابر با 38400 استفاده میکند.

 

NMEA 2000 : تو این که نسخه جدیدتر NMEA 0183 هستش شکی نی، اما درباره جزئیات و خصوصیاتش اطلاعاتی ندارم! ( مطالعه نکردم، فقط عنوانشو ایجاد کردم تا بدونید همچین چیزی هستش و بعدا اگه مطالعه ای کردم، تکمیلش کنم... )

 

 

نسخه‌های مختلف NMEA :

  1. NMEA 2.00 : January 1992
  2. NMEA 2.01 : August 1994
  3. NMEA 2.10 : October 1995
  4. NMEA 2.20 : January 1997
  5. NMEA 2.30 : March 1998
  6. NMEA 3.00 : July 2000
  7. NMEA 3.01 : January 2002
  8. NMEA 4.00 : November 2008
  9. NMEA 4.10 : July 2012

نسخه‌های قبل از 2.00، در وب سایت NMEA، ثبت و یا بایگانی نشده است. ( تو نت هم من سندی ازشون پیدا نکردم؛ کسی پیدا کرد، بده پیوست کنم به مطلب؛ هرچند فک نکنم نسخه‌های قبل از 2.00 دیگه الان بکار بیان... ).

البته یه سایت دیگه به آدرس sirf.com، هم اسنادی از NMEA ارائه داده که نسخه و سال انتشارش با اسنادی که از طرف سایت nmea.org، ارائه شده، نسبتی نداره؛ حالا داستان چیه الله اعلم؛ مثلا v2.1 سایت sirf.com در سال 2007 منتشر شده، همین نسخه در سایت nmea.org مربطه به سال 1994 ( بگذریم، موضوع مهمی نی... )

فرمت عمومی جملات پروتکل NMEA 0183

فرمت عمومی جملات پروتکل NMEA 0183

تمام داده‌ها به صورت جملات ( sentences ) ارسال می‌شوند؛ تنها کاراکترهای قابل چاپ ASCII بعلاوه CR و LF ( همون /r و /n هستند ) برای استفاده مجاز هستند؛ هر جمله، با کاراکتر $ شروع و با /r/n پایان می‌یابد؛ 3 نوع جمله اصلی وجود دارد :

  1. talker sentences
  2. proprietary sentences
  3. query sentences

1) Talker Sentences

فرمت عمومی برای talker sentence به صورت زیر هستش :

$ : قبلا گفتیم که جملات با این کاراکتر شروع میشوند.
tt : شناسه گوینده/فرستنده ( talker identifier )
sss : شناسه جمله ( sentence identifier )
<CR><LF> : قبلا گفتیم که جملات با این 2 کاراکتر پایان می‌یابند.

بعد از sss، تعدادی فیلد داده که با کاما از هم جدا می‌شوند، قرار میگیرند؛ بعدش یک checksum اختیاری قرار میگیره ( checksum برا بحث خطایابی بکار میره )؛ در آخر هم <CR><LF> قرار میگیره.

فیلدهای داده، برای هر نوع جمله، به صورت انحصاری تعریف شده است؛ در زیر یک مثال را مشاهده میکنید :

یک جمله می‌تواند شامل حداکثر 80 کاراکتر بعلاوه کاراکتر آغازین ( $ ) و کاراکترهای پایانی ( CR/LF ) باشد.

اگه داده برای یک فیلد موجود نباشد، فیلد حذف خواهد شد، اما کاما ( , ) های جداکننده فیلدها کماکان ارسال می‌شنوند ( یعنی اگه یه فیلد داده ارسال نشه، بازم کاراکتر کاما بعد اون فیلد ارسال میشه ) و بین دو کاما متوالی، فاصله ای ( space ) قرار نمیگیره.

فیلد checksum حاوی یک کاراکتر * و 2 رقم با فرمت hex هستش که بیانگر OR شدن تمام کاراکترهای موجود در جمله ( غیر از کاراکتر * و $ ) هستش.

2) Proprietary Sentences

این استاندارد به تولیدکنندگان اجازه می‌دهد تا "فرمت داده جملات اختصاصی موردنیازشون" رو تعریف کنند؛ این جملات با $P شروع می‌شوند؛ سپس 3 کاراکتر مربوط به ID تولیدکننده ( کد شرکت‌ سازنده / Manufacturer Code ) قرار میگیره؛ سپس داده های دلخواه تولیدکننده قرار میگیره.

3) Query sentences

خب اگه برنامه نویسی ( مثلا برا دیتابیس ) کرده باشید، حتما به اصلاح query برخوردید و تقریبا میدونید کارش چیه!؛ خب زمانی که گیرنده داده ای رو بخواد، یا بخواد به فرستنده بگه کاری رو انجام بده، باید یه query به فرستنده فرسته، در این قسمت فرمت این نوع داده ( query ) رو تعیین میکنیم؛ فیلدهای جمله Query به صورت زیر هستش :

tt : شناسه گوینده/فرستنده ( talker identifier )، فرستنده ای که میخوایم query رو براش بفرستیم.

ll : شناسه جمله ( sentence identifier )، جمله مدنظرمون که فرستنده باید اجراش/ارسالش کنه.

Q : یه کاراکتر ثابت که مشخص میکنه که جمله از نوع Query هستش.

sss : نفهمیدم

شناسه‌های گوینده ( talker identifiers )

شناسه‌های گوینده ( talker identifiers )

لیست زیر قدیمی هستش، لیست جدید ( بروزرسانی شده تا تاریخ 2019/03/03 ) در سند NMEA 0183 Talker Identifier Mnemonics قرار داره. ( این سند در ته مطلب قرار داده شده برای دانلود )

  • AG : Autopilot - General
  • AP : Autopilot - Magnetic
  • CD : Communications – Digital Selective Calling (DSC)
  • CR : Communications – Receiver / Beacon Receiver
  • CS : Communications – Satellite
  • CT : Communications – Radio-Telephone (MF/HF)
  • CV : Communications – Radio-Telephone (VHF)
  • CX : Communications – Scanning Receiver
  • DF : Direction Finder
  • EC : Electronic Chart Display & Information System (ECDIS)
  • EP : Emergency Position Indicating Beacon (EPIRB)
  • ER : Engine Room Monitoring Systems
  • GP : Global Positioning System (GPS)
  • HC : Heading – Magnetic Compass
  • HE : Heading – North Seeking Gyro
  • HN : Heading – Non North Seeking Gyro
  • II : Integrated Instrumentation
  • IN : Integrated Navigation
  • LC : Loran C
  • P : Proprietary Code
  • RA : RADAR and/or ARPA
  • SD : Sounder, Depth
  • SN : Electronic Positioning System, other/general
  • SS : Sounder, Scanning
  • TI : Turn Rate Indicator
  • VD : Velocity Sensor, Doppler, other/general
  • DM : Velocity Sensor, Speed Log, Water, Magnetic
  • VW : Velocity Sensor, Speed Log, Water, Mechanical
  • WI : Weather Instruments
  • YX : Transducer
  • ZA : Timekeeper – Atomic Clock
  • ZC : Timekeeper – Chronometer
  • ZQ : Timekeeper – Quartz
  • ZV : Timekeeper – Radio Update, WWV or WWVH
کد شرکت‌های سازنده ( Manufacturer Codes )

کد شرکت‌های سازنده ( Manufacturer Codes )

لیست تمام این کدها، در سند NMEA 0183 Protocol، در صفحات 25 تا 27 قرار داره. ( این لیست قدیمی هستش )

لیست جدید ( بروزرسانی شده تا تاریخ 2019/11/05 ) در سند NMEA 0183 Manufacturer Mnemonic Codes قرار داره. ( این سند در ته مطلب قرار داده شده برای دانلود )

شناسه و قالب جمله‌ها ( Sentence Identifiers and Formats )

شناسه و قالب جمله‌ها ( Sentence Identifiers and Formats )

در صفحات 4 تا 20 از سند NMEA 0183 Protocol، لیست تمام جملات عمومی قرار داره که ذکر تمامشون خارج از حوصله این مطلب ( حوصله من laugh ) هستش؛ در زیر به ذکر یک نمونه اکتفا میکنم.

مثال زیر مربوط به جمله ای هستش که زاویه یک خط ( که تعیین ابتدا و انتهای این خط بر عهده ما هستش ) رو نسب به یک محوره ( مثلا شمال جغرافیایی یا... ) محاسبه میکنه؛ $ که کاراکتر شروع جمله هستش؛ دو کاراکتر بعدیش ( -- )، شناسه گوینده/فرستنده ( talker identifier ) هستش که میتونه هرچیزی باشه!؛ 3 کاراکتر بعدی ( BOD )، شناسه جمله هستش؛ بقیه موارد داده هستند و در آخر هم Checksum قرار داره. ( چیز ساده ای هستش ^_^ )

Bearing – Waypoint to Waypoint

مثال‌هایی از Proprietary Sentences

مثال‌هایی از Proprietary Sentences

Proprietary Sentences : جملات اختصاصی؛ جملاتی که شرکت‌های سازنده، تعریف میکنند؛ قبلا توضیحش دادم...

لیست کامل این مثال‌ها، در صفحات 21 تا 24 سند NMEA 0183 Protocol قرار داره، من فقط یه نمونه‌شو مثال میزنم براتون ( سری شرکت، رفتن بر طبق نیازشون یه سری فرمت جمله تعریف کردن، حالا ما در این قسمت یکیشونو انتخاب میکنیم و توضیحش میدیم !!! )

خب در زیر یه نمونه فرمت جمله اختصاصی که توسط شرکت ??? ایجاد شده رو مشاهده میکنید :

  1. قبلا گفتم که جملات اختصاصی با $P شروع میشوند.
  2. بعدش 3 کاراکتر قرار میگیره که در واقع ID شرکت تولید کننده این جمله اختصاصی هستش؛ ID جمله زیر برابر با GRM هستش که میشه شرکت GARMIN CORPORATION.
  3. بعدش 1 کاراکتر دیگه هم میاد ( تمام مثال های جملات اخصاصی رو که بررسی کردم، بعد از ID یک کاراکتر دیگه قرار داره ) که خب سند این پروتکل، چیزی دربارش نگفته متاسفانه. ( کسی فهمید / میدونه بگه تا اینجا اضافه کنم، با تشکر )
  4. بعدش داده‌ها قرار میگیرند. ( الان این داده حاوی موقعیت جغرافیایی به همراه زمان و تاریخ هستش؛ که موقعیت های جغرافیایی با فرمت DMM هستند؛ DMM یه جور فرمت نمایش موقعیت های جغرافیایی هستش؛ ان شاء الله در مطلب جداگونه ای بهش میپردازم، چیز ساده هستش )
  5. در آخر هم Checksum میاد که قبلا دربارش صحبت کردیم.

nmea 0183 proprietary sentences

این یه جمله اختصاصی بود که توسط شرکت GARMIN CORPORATION ایجاد شده و با هم بررسیش کردیم، برا دیدن مثال‌های بیشتر درباره جملات اخصاصی، به سند NMEA 0183 Protocol مراجعه کنید.

 

یکم داستان بگیم...

خب اگه دیتاشیت ماژول u-blox 7 GNSS modules ( یه مدل ماژول gps محصول شرکت u-blox ) رو بررسی کنید؛ تو یه قسمت از دیتاشیت اومده گفته من از این پروتکل‌ها پشتیبانی میکنم و تمام ( که خب یکیشون NMEA 0183 بود )؛ در این ماژول به خصوص که من دیتاشیتشو دیدم، نوشته بود از NMEA 0183 نسخه 2.3 پشتیبانی میکنم؛ دیتاشیت فوق رو پیدا کنید و نگاه کنید چیز خاصی نداره، شبیه همین 1-2 تا مثالی که در بالا زدم هستش. ( این که مثال بزنم یا نزم مهم نی زیاد! )؛ حالا بدبختی اینجاس که سندی از NMEA 0183 نسخه 2.3 من تو نت پیدا نکردم ( هرچند مهم نی، همون دیتاشیت ماژول u-box 7 کار رو راه میندازه )

ماژول های NEO یکی از حرفه ای ترین ماژول های GPS است که ساخت شرکت U-blox آلمان است و از آنتن اکتیو نیز پشتیبانی می کند. پروتکل ارتباطی این نوع ماژول از نوع UART میباشد که توسط رزبری پای قابل راه اندازی است. بر روی این ماژول باطری قابل شارژ نیز درنظر گرفته شده است.

ماژول دارای حافظه داخلی eeprom به منظور ذخیره تنظیمات است و از WAAS, EGNOS, MSAS, GAGAN نیز پشتیبانی می کند. سرعت بالای دریافت اطلاعات و مکان یابی با دقت بسیار بالا و راه اندازی سریع باعث محبوبیت ماژول در کاربردهای صنعتی شده است. NMEA 0183 استانداردی که این ماژول برای ارتباط با MCU ویا همان رزبری استفاده میکند.

منبع

 

خب این همه داستان گفتیم و این مطلب رو خوندیم، خب که چی؟ چه سودی برامون داره؟ خب حداقلش اینه که شما یه قالب استاندارد داده رو دیدید!؛ اگه مطلب رو خونده باشید!، تو فرمت داده ما :

  1. کاراکتر $ در شروع جمله.
  2. اطلاعاتی درباره جمله.
  3. خود داده
  4. CRC
  5. /r/n

خب حالا این مدل فرمت داده چه مزایایی داره؟

1) خب تنها دلیلی که برا وجود کاراکتر ثابت آغازین فهمیدم، اینه که : به کمکش میتونیم شروع یک جمله جدید رو متوجه بشیم. ( حالا دلیل یا فایده دیگه ای داره رو نمیدونم )

2) معرفی جمله؛ زمانی که انواع جملاتی که میخوایم استفاده کنیم زیاد باشه، این قسمت "معرفی جمله" بکار میاد؛ مثلا اگه abc بود ( مثلا استاندارد من‌درآوردی‌مون! اینه که این قسمت 3 بایت باشه )، میفهمیم که داده‌مون حاوی اطلاعاتی درباره سنسور هستش؛ اگه sdf بود یعنی داده‌مون حاوی اطلاعاتی درباره نمایشگر هستش و ...

3) خب داده های اینجا قرار میگیره؛ بین هر داده یه کاراکتر ',' ارسال میکنیم تا داده ها از هم مجزا بشن؛ تو C# ( یا هر زبون و محیط دیگه ای ) هم خوندن هر فیلد ( هر داده که با کاراکتر فوق از هم جدا شدن ) به سادگی آب خوردن میشه؛ تو بحث ذخیره داده های فوق تو Excel هم کارمون خیلی راحت میشه ( اکسل یه قابلیت داره که، داده های ستون انتخابی رو بر حسب یک کاراکتر خاص، در اینجا کاراکتر ',' میاد و جدا میکنه و تبدیل به چند ستون میکنه؛ داده ها رو از هم جدا میکنه، این طور بگم شاید بهتر باشه )؛ این طوری کار برنامه نویسی خودمون هم راحت میشه، میدونیم بین هر دو داده، یه کاراکتر ',' وجود داره؛ قبلا مثلا مجبور بودیم یه قالب تعریف کنیم، مثلا بگیم 2 بایت اول، فیلد/داده اولی هستش؛ 4 بایت بعدی فیلد دوم؛ 3 بایت بعدی ...؛ والا الان دیگه این مسخره بازی ها رو نداریم، طول هر فید میخواد هر چند بایت که میخواد باشه، مهم اینه که بین هر فیلد، یه کاراکتر جداکننده قرار داره؛ پس اصل داستان این قسمت این شد که بین هر فید، یه کاراکتر جدا کننده قرار بدیم ( که در فیلد هامون هم موجود نباشه، این موضوع رو حواستون باشه )

4.1) CRC برا بحث خطایابی کاربرد داره، گیرنده میاد CRC رو محاسبه میکنه و میبینه که آیا با CRC داخل جمله برابر هستش یا نه؛ اگه برابر نباشه یعنی داده دچار مشکل شده یا داده ما نیست!!!

4.2) CRC هم برا ایمنی هم هستش؛ مخصوصا تو فرستنده های بیسیم؛ که فقط داده خودمونو دریافت کنیم!!! ( اومدیم یه نفر، داده ای مشابه داده ما ارسال کرد... )؛ مثلا یه دستگاه ریموت داریم، داده ( ABCDEFG ) رو به صورت بیسیم ارسال میکنه و مثلا کرکره مغازه رو باهاش باز میکنه، خب اگه یکی این داده رو بخونه، میاید همون داده ( ABCDEFG ) رو تولید میکنه و اون موقع باید بگی "رحم الله من یقرا فاتحه مع الصلوات"... ( کرکره مغازه رو باز میکنه و ... )؛ ولی خب اگه یه داده CRC تو جمله مون باشه که طبق یه فرمولی تغییر کنه؛ یعنی برای یه داده ثابت، در هر بار که ارسالش میکنی مقدار CRC تغییر کنه ( تا جلو کپی شده داده هم گرفته بشه )؛ دیدم ماژول هایی که اینکارو میکنن ولی خودم هم دوست دارم بدونم چطوری این کارو میکنند!

5.1) به کمک این دو کاراکتر میشه انتهای هر جمله رو فهمیدم ( موقع کدنویسی بخواین داده‌ها/جملات رو پردازش کنید بکارتون میاد )

5.2) همون طور که میدونید کاراکتر رفتن به خط بعدی در سیستم عامل ویندوز /r/n هستش ( تو لینوکس /r هستش )؛ خب اگه بخوایم داده هامونو از یه دستگاهی به pc ارسال کنیم، میتونیم به راحتی تو یه فایل txt ذخیرشون کنیم؛ هر جمله داخل یک خط ذخیره میشه.

5.3) به راحتی میشه داده ها رو دریافت کرد، مثلا یه شرط میزاریم، زمانی که دو کاراکتر آخری /r/n بودند، یعنی یک جمله دریافت کردیم. ( تو C# با تابع SerialPort.ReadLine )

 

خب این روال تعریف جمله رو استفاده کنید ازش در پروژه هاتون، کارتون رو ساده میکنه؛ وگرنه مرده شور این NMEA رو ببرم با این Document بیرون دادنش ^_^، اسناد مربوط به NMEA رو مثل آدم که منتشر نکردن که خخخ

کل این مطلب این که این NMEA یه نوع استاندارد تعریف جملات هستش؛ وسلام.

 

اسناد مورد نیاز :

 

اسناد مرتبط :

 

مطالب مرتبط :

  1. NMEA 0183
  2. NMEA Revealed
  3. NMEA connections made easy
  4. پروتکل های ارتباطی تجهیزات سامانه های دریایی
  5. گیرنده های GPS و استاندارد NMEA
  6. بررسی پروتکل NMEA
  7. راه اندازی ماژول GPS NEO-6M توسط Raspberry Pi 3

 

استانداردهای دیگه : درباره اینا کسی اطلاعاتی داره بگه ^_^

  1. RTCM
  2. SiRF Binary Protocol

 

چیزایی که یادگرفتم و فهمیدم و به نظرم مفید بود و ممکنه بکار کسی بیاد رو گفتم و سعی هم کردم مطلب کامل باشه؛ هر چند ناقص و پر از مشکله، با این حال امیدوارم بکارتون بیاد این مطلب و مفید باشه براتون.

یا مطلب بعد، یا علی.

 

کلیپ زیر رو دوست داشتید ببینید، جالبه ( حجمش 1-2 میگ باید باشه )؛ ماجرای قبر کندن پیامبر (ص)

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو جنگ ما فتح قدس را به همراه خواهد داشت. [ امام خمینی (ره) ]
ارسال دیدگاه
4

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    زمانی

    سلام
    فرق استاندارد با پروتوکل چیست؟

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام
      معنی و توضیح علمیشو نمیدونم – اما چیزی که من فهمیدم ( احتملا هم شاید درست نباشه! ) اینه که :
      استاندارد که از اسمش معلومه، مثلا فرمت داده nmea 0183 یه استاندارد هستش، یه فرمت داده استاندارد و قابل قبول…
      اما پروتکل، یه روش ارتباطی سخت افزاری هستش، مثلا uart/i2c/spi و…

  2. Avatar

    مهمان

    محمدرضاعابدینی

    سلام خب درمورد چک سام و ,انواعcrc و همینگ و golay و.. پست بذار بعد بنظرم برو سراغ استانداردها….نتونستم کامل بخونم ولی قطعا برمیگردم کامل خوندم میگم بهت

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام

      چک سام

      فرموم محاسبه checksum مورد نیاز این مطلب؛ داخل مطلب وجود داره / اگه منظورت اینه که درباره انواع checksum تحقیق کنم، باشه.

      انواع CRC – کد همینگ – کد Golay و…

      یادداشت میکنم، تا دربارش تحقیق کنم. good

      بعد بنظرم برو سراغ استانداردها….

      اسم استاندارد های مدنظرتون رو بگید تا یادداشت کنم.