آموزش جامع ارتباط سریال آردوینو -بخش اول

آموزش ارتباط سریال Arduino

به نام خدا

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

آموزش ارتباط سریال آردوینو بخش اول

 

تمام برد های آردوینو دارای حداقل یک عدد  پورت سریال می باشد که  اختصارا به آن ها UART ,USART گفته می‌شود. در آردوینو از پین‌های دیجیتال ۰ و ۱ برای راه اندازی پورت سریال استفاده می‌شود و میتوان به وسیله‌ی درگاه USB بر روی برد ،آردوینو را به کامپیوتر متصل نمود( پین ۰   RX(گیرنده اطلاعات)  و پین ۱   TX (فرستنده اطلاعات )می باشد).هنگامی که از پین های ۰ و ۱ به عنوان پروت سریال استفاده شود ، دیگر نمی‌توان از این پین ها به عنوان ورودی خروجی دیجیتال استفاده نمود.

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

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

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

پس از باز کردن این پنجره در قسمت boude rate ، مقداری که در هنگام استفاده از تابع begin وراد کرده اید را  در این قسمت وارد کنید( این قسمت به طور کامل در طول آموزش توضیح داده می‌شود).

آردوینو Uno فقط دارای یک پورت ارتباط سریال می‌باشد که از پین های ۰ و ۱ برای این منظور استفاده شده است.

آردوینو سری MEGA علاوه بر پورت سریالی که بر روی پین های ۰ و ۱ دارد ، دارای سه پورت سریال دیگر به نام‌های Serial1 , Serial2 , Serial3 می‌باشد.اگر شما قصد برقراری ارتباط آردوینو با کامپیوتر به وسیله‌ی این سه پورت ( Serial1 , Serial2 , Serial3) را دارید باید از یک مبدل USB TO Serial استفاده کنید.همچنین می‌توانید برای متصل کردن پورت‌های سریال آردوینو به کابل  DB9 ، مطابق مدار زیر از یک آی‌سی MAX232 استفاده کنید.

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

مدار ای سی max232 برای اتصال آردوینو DB9

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

کابل DB9

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

برنامه نویسی

 

 

begin()

 

begin اولین تابع مورد نیاز برای برقراری ارتباط سریال می‌باشد.توسط این تابع نرخ (سرعت)انتقال دیتا که اصطلاحا به آن باد ریت می‌گویند  میان دستگاه ، ماژول و یا کامپیوتری که قصد برقرای ارتباط با آن را دارید مشخص می‌شود. سرعت های استاندار برای برقراری ارتباط سریال ۳۰۰, ۶۰۰, ۱۲۰۰, ۲۴۰۰, ۴۸۰۰, ۹۶۰۰, ۱۴۴۰۰, ۱۹۲۰۰, ۲۸۸۰۰, ۳۸۴۰۰, ۵۷۶۰۰ و ۱۱۵۲۰۰ می‌باشند.البته توجه داشته باشید که شما میتوانید از اعداد دیگری برای بادریت استفاده کنید ، برای مثال ممکن است با ماژولی کار کنید که آن ماژول دارای بادریت استاندار نباشد  و شما نیز باید از بادریتی که در دیتاشیت ماژل ذکر شده است استفاده کنید.

این تابع دارای دو ساختار به صورت زیر می‌باشد:

ساختار اول دارای یگ آرگمان ورودی می‌باشد که نرخ انتقال دیتا را مشخص می‌کند و بسیار ساده می‎‌باشد.

در مورد ساختار دوم ، آرگمان اول (speed) بادریت را مشخص می‌کند .

آرگمان دوم (config) مربوط به تنظیمات تعداد بیت داده، بیت توازن  و استاپ بیت (stop bit یا بیت پایانی ) می‌باشد.برای فهم بهتر مطلب به توضیح بیت توزان و stop bit می‌پردازیم:

تعداد بیت داده چیست؟

هر وقت بخواهیم دیتایی از سمت فرستنده به گیرنده ارسال کنیم ، دیتای ما به بسته های  ۵ ، ۶ ، ۷ ، ۸ یا ۹ بیتی تقسیم میشود و سپس ارسال اطلاعات صورت می‌گیرد..در بیشتر کاربرد ها از داده ۸ بیتی استفاده می شود . در بیشتر طرح های ارتباط سریال ابتدا بیت کم ارزش ارسال می گردد .

استارت بیت(start bit) جیست؟

هنگام ارسال اطلاعات  یک بیت ۰ برای آگاه سازی از ارسال بسته به گیرنده ارسال می‌شود که به آن استارت‌بیت  ( start bit) می‌گویند.

stop bit چیست؟

همانطور که در بالا گفته شد برای ارسال دیتا ، دیتا را به بسته های   ۵ ، ۶ ، ۷ ، ۸ یا ۹ بیتی تقسیم بندی میکنیم.  حال برای اینکه گیرنده را آگاه سازیم که بسته‌ی داده‌ی ما به طور کامل ارسال شده است یک یا دو بیت درپایان دیتا ارسال می‌کنیم و گیرنده را از به پایان رسیدن بسته آگاه می‌سازیم.

بیت توازن چیست؟ 

بیتی است که برای نشان دادن زوج یا فرد بودن تعداد بیت هایی که ۱ می باشند به بیت های داده اضافه می شود.در مفهومی بسیار ساده بیت توازن برای مشخص کردن خطای کد و از دست نرفتن داده به کار می‌رود.دو نوع بیت توازن داریم : ۱- توازن زوج ۲- توزان فرد

۱-توزان زوج : به بیانی بسیار ساده ، یعنی به کدمان نگاه میکنیم ، اگر تعداد ۱ ها فرد باشید یک عدد ۱ به کد اضافه میکنیم که تعداد ۱ ها زوج شود.

۲-توازن فرد:  یعنی به کدمان نگاه می‌کنیم، اگر تعداد ۱ ها زوج باشد ، یک عدد ۱ به کد اضافه می‌کنیم که تعداد ۱ ها فرد شود.

***برای مثال فرض کنید کد ما۱۰۰۱۰۱ باشد ، چون تعداد ۱ ها فرد می‌باشد ، یک عدد ۱ به کدمان اضافه می‌کنیم ، کد ۱۰۰۱۰۱۱ حاصل می‌شود.پس با این کار کدی که  ما به سمت گیرنده میفرستیم همیشه تعداد ۱ های آن زوج می‌باشد. حال اگر در طرف گیرنده تعداد ۱ ها فرد باشد ، متوجه می‌شویم که کد دچار خطا شده است.

هم  اکنون به توضیح آرگومان config می‌پردزایم.این آرگمان دارای مقدار پیش فرض SERIAL_8N1  می باشد .به آرگمان config نیز می‌توان مقادیر زیر را نسبت داد:

  • SERIAL_5N1
  • SERIAL_6N1
  • SERIAL_7N1
  • SERIAL_8N1   به صورت پیش فرض از این گزینه استفاده شده است
  • SERIAL_5N2
  • SERIAL_6N2
  • SERIAL_7N2
  • SERIAL_8N2
  • SERIAL_5E1
  • SERIAL_6E1
  • SERIAL_7E1
  • SERIAL_8E1
  • SERIAL_5E2
  • SERIAL_6E2
  • SERIAL_7E2
  • SERIAL_8E2
  • SERIAL_5O1
  • SERIAL_6O1
  • SERIAL_7O1
  • SERIAL_8O1
  • SERIAL_5O2
  • SERIAL_6O2
  • SERIAL_7O2
  • SERIAL_8O2

سوالی که حتما برای شما پیش می آید ، این است که این مقادیر به چه معنا هستند ؟! به عنوان نمونه به توضیح SERIAL_8N1 می‌پردازیم.

در مقدار های نسبت داده شده به config  ؛ O مخفف کلمه odd  به معنای بیت توازن زوج ، E مخفف کلمه ی Even به معنای بیت توزان فرد و N مخفف کلمه None به معنای عدم استفاده از بیت توازن می‌باشد. عدد۱ تعداد stop بیت می‌باشد و عدد ۸ تعداد بیت داده می‌باشد.

مثال:فرض می‌کنیم از این کد قطعه کد برای تنظیم کردن پورت  سریال  استفاده کرده ایم و قصد داریم کاراکتر رشته OK را با استفاده از پورت سریال به کامپیوتر منتقل کنیم:

این کد به این معناست که از بادریت ۹۶۰۰ و از مقدار SERIAL_8N1 به عنوان config   استفاده کرده ایم .

به این علت که کاراکتر O و K هر کدام ۸ بیت و همچنین در کانفیگ از  SERIAL_8N1  که به معنای ۸ بیت داده ، بدون بیت توازن  و ۱ عدد stop bit می‌باشد ، باید در ۲ بسته اطلاعات را  ارسال کنیم . هم اکنون به شرح ارسال کاراکتر O می‌پردازیم. کاراکتر O دارای کد اسکی ۷۹  می باشد و در مبنای دو دارای مقدار ۰۱۰۰۱۱۱۱ می‌باشد.

بنابراین نقشه ی ارسال کاراکتر O به صورت زیر می‌باشد.

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

نقشه‌ی ارسال کاراکتر O

 

 

end()

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

برای راه اندازی مجدد می‌توان از تابع Begin استفاده نمود.

 

 

print()

این تابع دیتا را به پورت سریال ارسال می‌کند.تابع print دارای فرم های مختلفی می‌باشد.این تابع اعداد صحیح  ، متن ، کاراکتر را به صورت رشته اعداد اعشاری را به صورت رشته  با دو عدد اعشار ارسال می‌کند.به مثال زیر توجه کنید:

 

این تابع دارای دو ساختار به صورت زیر می‌باشد:

 

val : دیتایی می باشد که می‌خواهیم آن را به پروت سریال ارسال کنیم

format : فرمت نمایش و تعداد ممیز اعشار نمایش داده را مشخص می‌کند.

 

برای ارسال اطلاعات به فرمت باینری ( مبنای ۲ )  از BIN ، مبنای ۸ از OCT ، مبنای ۱۰ از DEC و مبنای ۱۶ از HEX  استفاده می‌کنیم. توجه شما را به مثال زیر جلب می‌کنم :

 

 

همچنین می‌توان تعداد ممیز اعشار را توسط format تعیین نمود.برای این کار کافی است تنها تعداد اعشار مورد نیاز را به جای format قرار دهیم همانند مثال زیر:

 

 

 

 

println()

 

این تابع همانند تابع   print عمل می‌کند با این تفاوت که با هر بار ارسال اطلاعات دستور رفتن به خط بعد را نیز اجرا می‌کند.

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

 

 

 

 

 

available()

 

به وسیله‌ی این تابع تعداد کاراکتر هایی که آماده خواندن از پورت سریال می‌باشند مشخص می‌شود.همچنین این تابع این امکان را فراهم می‌کند که ۶۴ بایت در بافر دریافت کننده ی پورت سریال ذخیره شود. این تابع تعداد کاراکتر های موجود در بافر را بر می‌گرداند. ساختار کلی تابع به صورت زیر می‌باشد:

 

 

به مثال زیر توجه کنید:

 

در این مثال اگر اطلاعاتی به پورت سریال فرستاده شد Serial.available مقدار true را برمی‌گرداند و برنامه وارد شرط شده و عملیاتی را انجام می‌دهد.برنامه همچنان ادامه پیدا می‌کند و اگر در بافر سریال اطلاعی برای خواندن وجود داشت ، دوباره برنامه وارد شرط می‌شود.توصیه می‌شود در برنامه نویسی حتما از این تابع استفاده کنید.

 

 

 

 

 

علیرضا قربانی
علیرضا قربانی
علیرضا قربانی هستم دانشجوی مهندسی پزشکی. چیزهای خیلی زیادی رو در دنیا دوست دارم. یک گیک هستم و یشه گفت یک هکر. نه به معنی دزدی پسورد و ایمیل مردم. به معنی عشق به دونستن و عشق به تحقیق درباره خیلی از چیزهایی که می بینم و می‌شنوم. اگر بخوام علاقه‌مندی‌ درجه یکم رو نام ببرم میتونم بگم برنامه نویسی و بعد از اون امبدد سیستم ها.

41 دیدگاه ها

  1. معین74 می‌گه:

    دوسش دارم خوبه

  2. اصغر می‌گه:

    آردوینو چیه؟
    بدرد میخوره من بخرم؟

    • علیرضا قربانی می‌گه:

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

      آردوینو می تواند جهت ایجاد اشیای تعاملی، گرفتن ورودی از تعداد زیادی سوییچ و حسگر، و کنترل تنوعی از لامپ ها، موتورها، و سایر خروجی های فیزیکی به کار گرفته شود. پروژه های آردوینو می توانند مستقل باشند، و یا با نرم افزاری که روی کامپیوتر شما در حال اجراست(مثل Flash ، Processing، MaxMSP)، ارتباط برقرار کند. شما می توانید بردها را به طور دستی مونتاژ کنید و یا به صورت از پیش مونتاژ شده، خریداری کنید؛ محیط برنامه نویسی open-source را می توانید به صورت رایگان دانلود کنید.

      زبان برنامه نویسی آردوینو، یک پیاده سازی از Wiring(یک پلت فرم محاسباتی و فیزیکی مشابه) است، که بر اساس محیط برنامه نویسی چندرسانه ای Processing کار می کند.

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

  3. […] آموزش ارتباط سریال در آردوینو بخش اول […]

  4. […] سلام البته ک میشه لینک زیر میتونه کمکتو.ن کنه آموزش جامع ارتباط سریال آردوینو -بخش اول – دیجی اسپارک […]

  5. جواد لطفی می‌گه:

    سلام اقای قربانی،واقعا دستت درد نکنه خیلی مطالب اموزنده ایه،اقا من اون مشکل ارتباط اردوینو با لب تابم رو حل کردم،البته با راهنمایی های جنابعالی فقط میخواستم یه لطف دیگه به بنده بکنید و بفرمایید،اگه بنده الان بخوام با گوشی اندروید به یکی یا چندتا از پین هاش خروجی برای مثلا در بازکن بگیرم البته با مازول بلوتوث hc-05 به نظر جنابعالی چه برنامه ایی باید رو اردوینو اپلود کنم.اگه امکان داره برنامش رو برام ایمیل کنید بسیار ممنون میشم.متشکرم.

  6. میم می‌گه:

    سلام تو مثالی که زدین من if رو متوجه نمیشم مخصوصا اونجاش که نوشته ;gt&

    لطفا اگه ممکنه بیشتر تویضح بدین ممنون

  7. حامد می‌گه:

    با سلام
    بسیار تشکر دارم از آموزشهای خوب و کاملی که در سایتتان قرار میدهید
    بنده نیازی دارم در مورد نوع ارتباط با ای سی یو های خودرو توسط اوردینو اطلاعاتی کسب نمایم
    گویا اوردینو میتواند در ارتباط با پروتکلهای خوردوریی برای نمایش کدهای خطا و یا همان دیاگ مورد استفاده قرار گیرد
    منتها میخواستم بدونم برای این کار به چه اطلاعاتی نیازمندیم .
    آیا این پروتکلها مانند OBD , OBD2 , ALDL , I2C , 1Wire , Handshake , جزو زیرمجموعه های پروتکلهای ارتباط سریال می باشند . و توسط تابع های سریال این پروتکلها را میتوان برنامه نویسی کرد ؟
    لطفا در این مورد و نحوه ی راه اندازی این نوع پروتکلها به طور کامل آموزش بگذارید
    البته این مورد در وب سایت و انجمن رسمی اوردینو مورد بحث و حتی به صورت پروژه انجام شده است . اما به دلیل انگلیسی بودن مقداری سخت است . در صورتیکه توسط شما و به فارسی آموزش داده شود راه اندازی این بخش راحت تر انجام میشود
    با تشکر

    • سلام به زودی به سوال شما پاسخ داده میشه

      پیگیری کنید …

    • سلام به زودی به سوال شما پاسخ داده میشه

      پیگیری کنید …

      • حامد می‌گه:

        سلام
        فرموده بودید به زودی پاسخ میدهید . خواستم پیگیری کنم در این مورد .
        با تشکر

        • سلام

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

          لطفا مشکلتان را دوباره بفرمایید

          • حامد می‌گه:

            با سلام
            بسیار تشکر دارم از آموزشهای خوب و کاملی که در سایتتان قرار میدهید
            بنده نیازی دارم در مورد نوع ارتباط با ای سی یو های خودرو توسط اوردینو اطلاعاتی کسب نمایم
            گویا اوردینو میتواند در ارتباط با پروتکلهای خوردوریی برای نمایش کدهای خطا و یا همان دیاگ مورد استفاده قرار گیرد
            منتها میخواستم بدونم برای این کار به چه اطلاعاتی نیازمندیم .
            آیا این پروتکلها مانند OBD , OBD2 , ALDL , I2C , 1Wire , Handshake , جزو زیرمجموعه های پروتکلهای ارتباط سریال می باشند . و توسط تابع های سریال این پروتکلها را میتوان برنامه نویسی کرد ؟
            لطفا در این مورد و نحوه ی راه اندازی این نوع پروتکلها به طور کامل آموزش بگذارید
            البته این مورد در وب سایت و انجمن رسمی اوردینو مورد بحث و حتی به صورت پروژه انجام شده است . اما به دلیل انگلیسی بودن مقداری سخت است . در صورتیکه توسط شما و به فارسی آموزش داده شود راه اندازی این بخش راحت تر انجام میشود
            با تشکر

          • سلام
            به غیر از i2C که خودش یه پروتکل به حساب میاد بقیه موراد جز پروتکل سریال هستند و لی با سطح منطق های ولتاژ های متفاوت که برای کار کردن با آن ها و اتصالشون به آردوینو باید از IC ها و ماژول های مبدل استفاده کنید

            مثل:

            https://learn.sparkfun.com/tutorials/obd-ii-uart-hookup-guide

            http://wbo2.com/~techedge.com.au/vehicle/aldl8192/8192hw.htm

      • حامد می‌گه:

        سلام
        آقا لطفا ما رو تحویل بگیرید . ممنون میشم بتونید راهنمایی کنید
        من همچنان منتظر راهنمایی شما هستم
        با تشکر

  8. محسن می‌گه:

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

  9. محسن می‌گه:

    سلام ضمن تشکر فراوان میخواستم بدونم آیا جهت ساخت آبنمای حروف میتوان از مطالب گفته شده شما استفاده کرد؟ آیا نرم افزاری که بتواند حرو را بصورت کد اسکی یا درمبنای ۲ یا هر شکل دیگری به آردوینو بفرستد و تبعا آردوینو نیز به شیربرقی ها فرمان دهد آیا چه نرم افزاری مناسب این کار هست؟

  10. محمدرضا می‌گه:

    توضیحات بی نظیر بود خیلی ممنون واقعا عالی بود

  11. محمدرضا می‌گه:

    توضیحات بی نظیر بود خیلی ممنون واقعا عالی بود

  12. محمدرضا می‌گه:

    توضیحات بی نظیر بود خیلی ممنون واقعا عالی بود

  13. بهزاد پورک نیا می‌گه:

    سلام به همه دوستان.
    من میخواستم بدونم راهی هست که بردهای آردوینو رو با هم به وسیله usart ارتباط داد ،به طوری که یک برد که به کامپیوتر وصل است به عنوان master باشه و بقیه بردها slave باشند،و برد های slave دارای یک آدرس ۱۰ بیتی باشند که برای master قابل شناسایی باشه،و تعداد slave ها چند تا میتونه باشه ،با تشکر از دوستان

  14. ا.م می‌گه:

    سلام
    ببخشید من وقتی وقتی می خواهم برنامه ای روی آردوینو آپلود کنم ارور میدهد در صورتی که کامپایل می شود
    نگاه که کردم د=دیدم در قسمت tools منوی portغیرفعال است
    و هر کار کردم نتوانستم فعالش کنم
    چکار باید بکنم؟

  15. میلاد می‌گه:

    سلام
    خسته نباشید و ممنون بابت آموزش خوبتون
    ما روی یه رباتی کار میکینیم که یک قسمت از پردازشش با رسبپری پای انجام میشه و خروجی اون وارده یک آردوینو میشه.میخواستم ببینم به نظر شما بهترین راه برای برقراری ارتباظ بین این دو کروم پروتکله؟
    بازم بابت مطالبه مفیدتون سپاسگذارم.

  16. »محسن می‌گه:

    سلام حامد جان من هم روی این موضوع کار میکنم خوشحال میشم با هم تبادل نظر کنم.

  17. »محسن می‌گه:

    سلام حامد جان من هم روی این موضوع کار میکنم خوشحال میشم با هم تبادل نظر کنم. اگه میشه باهم در تماس باشیم

  18. حامد می‌گه:

    سلام . میشه لطفا برای ارتباط بین آردوینو due و Mega2560 راهنماییم کنید؟
    مسئله من اینجوره که متغیری رو از due به mega میفرستم و بالعکس.
    تغییر سطوح ولتاژ از ۵ به ۳٫۳ رو هم با تقسیم مقاومتی و هم با مبدل سطح منطقی انجام میدم اما نمیدونم مشکل کجاست؟

پاسخ دهید

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