ارتباط سریال در آردوینو – جلسه چهارم

با اینکه توی مقاله ی ارتباط سریال یا پروتکل USART چیست؟ مفصل درباره ی این ارتباط صحبت کردیم اما بازم خوبه که نحوه کار  ارتباط سریال در آردوینو رو یکبار دیگه دور کنیم.
توی ارتباط سریال در آردوینو  اطلاعات به شکل سری و با سرعتی مشخص منتقل میشن که به بادریت baudrate معروفه. یک بسته داده که ارسال میشه شامل 1 بیت آغاز و 5تا 8 بیت دادست، بیت پریتی parity زوج یا فرد هم به صورت اختیاری و 1یا 2 بیت پایان است که توی شکل زیر هم نشون داده شده:

ارتباط سریال در آردوینو

اگر توی هرلحظه بتونیم داده رو دریافت یا ارسال کنیم به این ارتباط FULL Duplex میگن ، واحد ارتباط سریال توی میکروهای AVR , USART هستش که به معنی فرستنده و گیرنده ی هم زمان و غیرهم زمان عمومی هستش.

آردوینو به صورت پیش فرض ، پایه های دیجیتال شماره 0 و 1 رو برای دریافت و ارسال داده به کار میبره. ولی اما با استفاده از کتابخانه ی Software Serial می تونیم پایه های دیگه رو هم برای ارسال و دریافت داده ها تعریف کنیم.

توی ارتباط سریال در آردوینو حتی اگه میکرو درحال اجرای یک زیر برنامه ی دیگه باشه توانایی دریافت داده رو داره و میتونه اون رو توی بافری که 64 بایت ظرفیت داره ذخیره کنه که خیلی باحاله!

کاربرد های ارتباط سریال در آردوینو :

تا اینجا نحوه کار این ارتباط رو گفتیم ، اما ممکنه بپرسین کجا کاربرد داره ؟

ما از آردوینو استفاده می کنیم تا بتونیم اطلاعات سنسور ها، ماژول ها و یا هر المانی که به ما یک خروجی با ارزشی رو در قالب سیگنال به ما بده بخونیم و یا بتونیم روی lcd چیزی که میخوایم رو بنویسیم ، و یا یک موتور رو راه اندازی کنیم و با سرعت یا زاویه ی چرخش مورد نظرمون بهش فرمان بدیم و یا حتی  اطلاعاتی  که از یک سنسور میخونیم رو جای دیگه ای نشون بدیم .برای این کار بین قطعات یک زبان مشترک نیاز داریم، ارتباط سریال یکی از این زبان های مشترکه.

کاربرد ارتباط سریال هم برای اتصال آردوینو به کامپیوتره .با این ارتباط میشه هم از کامپیوتر به آردوینو فرمان داد هم اینکه اطلاعاتی رو که از آردوینو خوند روی کامپیوتر نشون داد.(مثلا خروجی یک یا چند سنسور رو میشه فرستاد روی کامپیوتر و … ).

ما برای شروع از شبیه سازی در پروتئوس استفاده میکنیم ، توی شبیه سازی نمیشه اطلاعاتی رو به آردوینو فرستاد و بهش فرمان داد. اما میشه با اتصال virtual terminal به پایه های RX و TX که پایه های سریال در آردوینو هستن اطلاعات رو خوند. در ادامه و جایی که مثال برای دانلود گذاشتم توضیحات بیشتر رو دادم.

تابع های ارتباط سریال در آردوینو :

تابع Serial.begin :

برای تعریف میزان سرعت و فعال کردن ارتباط سریال از تابع Serial.begin(speed) استفاده میکنیم. (چون بحث تعریف و فعال کردنه پس کدش رو باید توی حلقه setup فعال کنیم.)

توی ارتباط سریال در آردوینو Mega  چون 3 تا پورت (6 تا پایه)سریال داریم ،میشه از دستورای زیر استفاده کرد:

speed : سرعت ارتباط سریالمون هست که توی فرستنده و گیرنده باید برابر باشه، سرعت ارتباط سریال میتونه اعداد زیر باشه:

300 600 1200 2400 4800 9600
14400 19200 28800 38400 57600 115200

یه فوت کوزه گری هم اینجا اینه که اگه سرعت از 9600 بالاتر بره احتمال خطا وجود داره (شاید ناچیز باشه ولی خب خطا رو باید سعی کنیم صفر کنیم دیگه). برای جلوگیری از این خطا باید  بجای کریستال 16 مگاهرتز از یک کریستال 14745000هرتز استفاده کنیم که خطا اینطوری به صفر میرسه. پس چون حسش نیس کریستال روی برد آردوینو مون رو عوض کنیم بهتره از همون سرعت های زیر 9600 استفاده کنیم یا حدکثر 9600 ، بجز موارد خاص . 😀

تابعSerial.print

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

این کد یه شکل دیگه هم داره که کمتر و در موارد خاص استفاده میشه:

که توی هردو

val  داده ها هستن

و format  مبنای داده ی ارسالی.

منظورم از مبنا ، مبنای 2   یعنی BIN و مبنای 8 یعنی OCT ، مبنای 10 DEC  و مبنای 16 HEX هست.

مثال برای کد دوم که گفتم کابرد خاص داره :

دانلود فایل شبیه سازی و کد

این مثال برای چاپ کردن هر کاراکتر و کد اسکی و مقدار باینری و هگز و دسیمالش نوشته شده.

توی پروتئوس این کد رو که اجرا کنین این صفحه براتون باز میشه و اطلاعاتی که نوشته میشه درواقع اطلاعاتی هست که آردوینو میفرسته و در صفحه کامپیوتر نشون داده میشه اما ما اونو شبیه سازی کردیم.

شبیه سازی ارتباط سریال در آردوینو در نرم افزار پروتئوس

اما اگه شبیه سازی نبود این اطلاعات کجای کامپیوتر نمایش داده میشد؟نرم افزار آردوینو در بخش منوی tools گزینه ای داره با عنوان serial manitor که اگر اطلاعاتی رو آردوینوی متصل شده به کامپیوتر بفرسته اونجا نمایش میده و آخر اینکه حواستون باشه که سرعتی که توی serial.begin انتخاب کردین توی این صفحه هم باید انتخاب کنین.

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

مانیتور کردن ارتباط سریال در آردوینو

تابع Serial.println

ای تابع مثل print  عمل میکنه با این تفاوت که آخر هر کد دو تا کد اسکی 10 و 13 رو هم میفرسته ، حالا این 2تا رو ندونستین چی هستن هم مهم نیست، چون بهتون میگم!:D
این2 تا کاراکتر به ترتیب به معنی چاپ داده در انتهای خط و رفتن به خط جدیده.

خلاصش اینه که یک چیزیو چاپ کرد میره خط بعد! و فقط ارسال همین 2تا کار رو بیشتر از تابع print  انجام میده.

تابع flush

این تابع منتظر می مونه تا داده ارسال شه.توی نسخه های قبلی، تابع داده ی سریال ورودی رو پاک میکرد.

تابع serial.write

این تابع داده ی باینری رو به صورت سریال میفرسته. شکل های مختلف تابع به صورت زیره:

val بایت داده

str  رشته

buf و eln  آرایه و بعد آرایه هستن و خروجی این تابع هم تعداد بایت ارسالی رو میده که خوندن اون اختیاریه.

تابع serial.available

این تابع تعداد بایت های رسیده به بافر پورت سریال را میده(تابع ورودی نداره)

تابع serial.read()

این تابع داده ی رسیده در بافر ورودی پورت سریال رو میده(این تابع هم ورودی نداره).
خروجی این تابع هم مقداری هست که قراره دریافت بشه و میخونه، اما اگه دیتایی رو دریافت نکرد اونوقت هم باید یک خروجی ای نشون بده تا متوجه بشیم دیتایی دریافت نمیشه، پس برای اینجور مواقع خروجی رو برابر منفی یک (1-) میده.

 

 

این کد رو اگر امتحان کنید میبینید که اگه مقداری رو روی ورودی نداشته باشیم ،  متن no data to received نوشته میشه که به این معنیه ، مقدار منفی یک داره برگشت میخوره و وارد else if میشه.

یک نکته درمورد if   و شرطش هم بگم ، اون اینکه این کد رو خود سایت آردوینو برای معرفی این تابع نوشته  و عموما از همین روش هم برای ایجاد شرط توی سایت آردوینو استفاده شده، ولی نکته ای که داره اینه که اگر شرط Serial.available() > 0 برقرار نباشه ، دائما آردوینو -1 رو برمیگردونه و میکرو درحال فعالیته ، اما خب اگر ما شرط رو incomingByte>0 بزاریم ، تا دیتایی وارد این متغیر نشه میکرو منتظر میمونه و وارد اون چرخه ی الکی ارسال منفی یک نمیشه. دیتایی هم که وارد این متغیر میشه چون از نوع کد اسکی هست ، مطمئنا هیچوقت منفی نمیشه و مقداری بین صفر تا 255 داره و اطلاعاتی از دست نمیره.

تابع Serial.readBytes

این تابع همانند تابع serial.read هست ، با این تفاوت که اطلاعات روی توی آرایه ی بافر ذخیره میکنه و تعداد بایت دریافتی رو هم میشه براش توی بخش دوم ورودی تعریف کنیم.

 

buffer: چون ورودی کد اسکیه ،این متغیر یک آرایه از نوع char یا byte  میتونه باشه که اطلاعات دریافتی داخل اون ذخیره میشه.

length : یه متغیر از نوع int که تعداد بایت مورد نظری که قراره دریافت کنه رو مشخص میکنه.

تابع Serial.readBytesUntil

این تابع مثل تابع قبلیه فقط یک تفاوت اصلی داره که متمایزش میکنه و اون هم متغیر ورودی character.

 

مثل تابع قبلی ورودی رو دریافت میکنه اما زمانی که که کاراکتر ورودی برابر  character تعریف شده شد ، عملیات رو متوقف میکنه.
این تابع وقتی دیتایی رو دریافت نمیکنه صفر رو میگردونه.

این جلسه یکم طولانی شد ولی اصلا زحمت حفظ کردن این تابع هارو به خودتون ندین! هر زمانی که لازم شد از این تابع ها استفاده کنین بیاین اینجا و ازشون استفاده کنید. کافیه مفهوم این تابع هارو بدونین و بدونین که با ارتباط سریال در آردوینو میشه چه کارهایی کرد.بنظرم بهترین روش یادگرفتن برنامه نویسی برای آردوینو آشنایی اولیه با تابع هاست و بعدش کار عملی.

سعی میکنم جلسه بعد هم درمورد ارتباط سریال نرم افزاری توضیح بدم .

لوینیک رو به دوستاتونم معرفی کنید.

حمیدرضا مودت

یک مهندس الکترونیک ، علاقه مند به یاد دادن و یاد گرفتن پیرامون دانش برق و الکترونیک

شما ممکن است این را هم بپسندید

6 پاسخ‌ها

  1. داود ده جوریان گفت:

    سلام : من برنامه ای دارم که اطلاعاتی رو از سنسورها سنس میکنه و تو سریال نشون میده . چجوری می تونم این اطلاعات رو ذخیره کنم و برای پروژم تو ورد داشته باشم

    • سلام این کارو آردوینو نمیتونه انجام بده ، باید از نرم افزار یا سخت افزار مجزا کمک بگیرین.
      مثلا بجای سریال مانیتور نرم افزار آردوینو از نرم افزار های مشابه استفاده کنین که کار سریال مانیتور رو انجام میدن و قابلیت ذخیره هم دارن. مثل hyperterminal
      یا میتونین اون اطلاعات رو روی SD کارت ذخیره کنین.

  2. مهرداد گفت:

    سلام خسته نباشید وتشکر بابت اطلاعات خوبتون
    من یه شیلد sim900دارم یا کد های خود اردوینو پیام های دریافتی رو میاد روی پرت سریال نمایش میده
    حالا من میخوام پیام های روی پرت سریال رو بخونم و یه دستوری اجرا کنم
    مثال با پیام (on)یک رله رو روشن کنم
    با پیام offیک رله رو خاموش
    با چه متغییر یا دستوری میتونم این کارو انجام بدم
    چطور میتونم متقیر های استرینگ روی پرت سریال رو بخونم ؟
    ممنون میشم اگه راهنمایییم کنید

  3. fuad گفت:

    سلام و تشکر بابت به اشتراک گذاشتن دانشتون

    برای من که اندکی مبتدی هستم ورود به مبحث سریال کمی زود بود… راستش رو بخواهید اصلا کاربرد این مطلب رو نگفتید و بدون مقدمه و با پای برهنه وارد داستان شدید…

    به نظرم اگه کمی درباره کاربرد هر مبحث بیشتر بگین خیلی بهتره

    با تشکر

    • حمید گفت:

      سلام، مهم ترین کاری که آردوینو میکنه اینه که شما زیاد نیاز به شناختن خوده میکرو ندارین دیگه، تا این قسمت با پایه ها و اطلاعات مورد نیاز ابتدایی آشنا شدین و وقتش بود با دنیای بیرون ارتباط برقرار کنید! آردوینو واقعا همینه ، شما با آردوینو آشنا شدین ، الان نوبت آشنا شدن با روش های ارتباطیه.اگه avr بود آره خیلی زود میبود ورود به این مبحث و درست میگین ،حتما مطلب رو ادیت میکنم و درمورد کاربرد ها هم مینویسم. بازم اگر جایی نامفهوم بود خوشحال میشم بگین و سعیمو میکنم بهترش کنم.

پاسخ دهید

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

از لوینیک حمایت کنید