آموزش آردوینو

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

UART مخفف Universal Asynchronous Receiver/Transmitter است. این یک دستگاه سخت افزاری (یا مدار) است که برای ارتباط سریال بین دو دستگاه استفاده می شود.

دستگاه های UART چگونه به هم متصل می شوند؟

اتصال دو دستگاه UART به یکدیگر ساده و آسان است. شکل زیر نحوه اتصال پایه های UART را نشان می دهد.مقدمه ای بر ارتباطات UARTهر دستگاه UART دو پایه دارد که RX و TX نام دارند. TX داده ها را از دستگاه خارج میکند و RX داده ها را دریافت میکند. بنابراین این پایه ها باید به صورت ضربدری به هم متصل شوند تا یکی فرستنده و دیگری گیرنده باشد.

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

پارامترهای UART

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

  • Baud Rate: نرخ باود تعداد بیت در ثانیه (bps) است که یک دستگاه UART می تواند ارسال/دریافت کند. ما باید هر دو دستگاه UART را با نرخ باود یکسان تنظیم کنیم تا انتقال مناسب داده ها انجام شود. مقادیر رایج برای نرخ باود 9600، 1200، 2400، 4800، 19200، 38400، 57600 و 115200 هستند.
  • طول داده: طول داده به تعداد بیت در هر بایت داده اشاره دارد.
  • تعداد بیت توقف: دستگاه های UART می توانند از هیچ، یک یا دو بیت توقف برای علامت گذاری پایان مجموعه ای از بیت ها (بسته) ارسال شده استفاده کنند.
  • کنترل جریان: Flow Control روشی برای جلوگیری از خطر از دست دادن داده ها هنگام انتقال داده از طریق UART است. دستگاه UART از کاراکترهای ویژه به عنوان کنترل جریان برای شروع/توقف انتقال استفاده می کند.

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

آردوینو بسته به برد یک یا چند پین UART دارد. ما برای این پروژه، از Arduino Uno استفاده خواهیم کرد که در آن تنها یک رابط UART در پایه 0 (RX0) و پایه 1 (TX0) یافت می شود. پین‌های 0 و 1 آردوینو همچین برای برقراری ارتباط با نرم افزار آردوینو IDE از طریق USB استفاده می‌شوند. بنابراین، اگر میخواهید کدی را در برد UNO خود آپلود کنید، مطمئن شوید که ابتدا سیم‌ های متصل به پین‌ های 0 و 1 را جدا کرده اید. شکل زیر محل قرارگیری پایه‌ های ارتباط UART یعنی TX و RX را نشان می‌دهد.

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

ارتباط بین 2 آردوینو از طریق پروتکل UART

پس از یادگیری نحوه عملکرد UART، اجازه دهید اکنون یک طرح ساده بسازیم که نحوه استفاده از ارتباطات UART با استفاده از Arduino Uno را نشان می دهد. پروژه ما در مورد کنترل LED روی برد آردوینو از راه دور از طریق UART است. یک دکمه فشاری متصل به اولین برد Uno، ال ای دی داخلی برد Uno دوم را کنترل می کند و بالعکس.

شکل زیر نحوه اتصال اجزای مورد استفاده در پروژه را نشان می دهد.

مدار اتصال دو آردوینو به یکدیگر

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

برای ساخت پروژه خود به اجزای زیر نیاز داریم:

  • آردوینو اونو (2 عدد)
  • دکمه های فشاری (2 عدد)
  • برد بورد
  • سیم های جامپر
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

کد آردوینو برای ارتباط UART

پس از جمع آوری و مونتاژ سخت افزار، اکنون آماده برنامه ریزی بردهای خود هستیم. برای این پروژه، هر دو برد دارای کد های یکسان خواهند بود. ابتدا حالت پین شماره 8 (متصل به دکمه فشاری) را روی INPUT_PULLUP تنظیم میکنیم. سپس حالت پین 13 (LED) را روی OUTPUT قرار می دهیم و حالت اولیه پایه 13 را روی LOW (LED خاموش) قرار می دهیم.

void setup() {
  pinMode(8, INPUT_PULLUP); // ورودی کردن پین دکمه
  pinMode(13, OUTPUT);      // خروجی کردن پایه ال ای دی
  digitalWrite(13, LOW);    // خاموش کردن ال ای دی
}

void loop() {
}

مثل همیشه، آردوینو با استفاده از آبجکت سریال، استفاده از سخت افزار داخلی UART را برای ما آسان می کند. آبجکت سریال دارای عملکردهای لازم برای استفاده آسان از رابط UART آردوینو است.

SERIAL.BEGIN(): برای برقراری ارتباط از طریق رابط UART، ابتدا باید آن را پیکربندی کنیم. ساده ترین راه برای پیکربندی UART آردوینو استفاده از تابع Serial.begin(speed) است. پارامتر speed، نرخ باودی است که می خواهیم UART اجرا کند. این تابع، پارامترهای UART باقی مانده را با مقادیر پیش فرض تنظیم می کند (طول داده = 8، بیت برابری = 1، تعداد بیت های توقف = هیچ).

کد زیر Serial.begin(9600) را اضافه می کند. درون تابع setup()، مقداردهی اولیه UART با نرخ باود 9600 و سایر پارامترها روی مقادیر پیش فرض تنظیم شده اند.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
void setup() {
  pinMode(8, INPUT_PULLUP); // ورودی کردن پین دکمه
  pinMode(13, OUTPUT); // خروجی کردن پایه ال ای دی
  digitalWrite(13, LOW); // خاموش کردن ال ای دی

  Serial.begin(9600);       // آغاز ارتباط سریال
}

void loop() {
}

قسمت بعدی کدگذاری، خواندن و ذخیره مقدار دریافتی از طریق سریال است. برای انجام این کار، از تابع Serial.available() همراه با یک عبارت If استفاده می کنیم تا بررسی کنیم که آیا داده دریافتی وجود دارد یا خیر. سپس Serial.read() را فراخوانی می کنیم تا یک بایت از داده های دریافتی را دریافت کرده و مقدار را در متغیر data_rcvd ذخیره کنیم. مقدار data_rcvd روشن/خاموش بودن LED داخلی را کنترل می کند.

SERIAL.AVAILABLE(): برای بررسی اینکه آیا داده ای در انتظار خواندن در بافر UART (یا سریال) وجود دارد، از تابع Serial.available() استفاده می کنیم. Serial.available() تعداد بایت های منتظر در بافر را برمی گرداند.

SERIAL.READ(): برای خواندن داده های منتظر در بافر سریال، از تابع Serial.read() استفاده می کنیم. این تابع یک بایت از داده های خوانده شده از بافر را برمی گرداند.

void setup() {
  pinMode(8, INPUT_PULLUP); // ورودی کردن پین دکمه
  pinMode(13, OUTPUT); // خروجی کردن پایه ال ای دی
  digitalWrite(13, LOW); // خاموش کردن ال ای دی 
  Serial.begin(9600); // آغاز ارتباط سریال
}

void loop() {
  if(Serial.available()) {
    char data_rcvd = Serial.read();   // read one byte from serial buffer and save to data_rcvd

    if(data_rcvd == '1') digitalWrite(13, HIGH);  // switch LED On
    if(data_rcvd == '0') digitalWrite(13, LOW);   // switch LED Off
  }
}

SERIAL.WRITE(): برای ارسال داده ها از طریق پین TX0 آردوینو، از تابع Serial.write(val) استفاده می کنیم. پارامتر val همان بایت (یا سری از بایت ها) است که باید ارسال شود.

در کد خود، بسته به وضعیت پین 8، کاراکتری را ارسال می کنیم. اگر وضعیت پایه 8 برابر HIGH باشد، مقدار کاراکتر ‘1’ و اگر وضعیت پایه 8 برابر LOW باشد، مقدار کاراکتر ‘0’ ارسال می کنیم.

void setup() {
  pinMode(8, INPUT_PULLUP); // ورودی کردن پین دکمه
  pinMode(13, OUTPUT); // خروجی کردن پایه ال ای دی
  digitalWrite(13, LOW); // خاموش کردن ال ای دی 
  Serial.begin(9600); // آغاز ارتباط سریال
}

void loop() {
  if (Serial.available()) {
    char data_rcvd = Serial.read();   // خواندن داده ورودی

    if (data_rcvd == '1') digitalWrite(13, HIGH); // روشن کردن ال ای دی
    if (data_rcvd == '0') digitalWrite(13, LOW);  // خاموش کردن ال ای دی
  }

  if (digitalRead(8) == HIGH) Serial.write('0');    // اگر دکمه فشرده نیست 0
  else Serial.write('1');                           // اگر دکمه فشرده است 1 ارسال شود
}

آپلود و تست کد

کد داده شده را در هر دو برد آردوینو آپلود کنید. به یاد داشته باشید که قبل از بارگذاری طرح، سیم های متصل به پین ​​های TX0 و RX0 را جدا کنید. پس از آپلود موفقیت آمیز، سیم های پین های TX0 و RX0 را دوباره وصل کنید.

پس از آپلود، می توانیم با فشار دادن دکمه فشاری متصل به برد دیگر، LED تعبیه شده یکی از بردها را کنترل کنیم. کد ما وضعیت دکمه را بررسی می کند و یک مقدار کاراکتر ‘0’ یا ‘1’ را برای کنترل LED داخلی به برد دیگر ارسال می کند.

اگر سوالی دارید یا در تنظیمات این پروژه مشکل دارید، حتما نظر بدهید!

4.2 (5 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

13 نظر

  1. سلام مهندس ببخشین من قسمت ها اول اموزشتون رو دیدم واقعا عالی بود متشکرم الان من می‌خوام پروژه طراحی کنم ک نیاز به دوتا rx .txدارم سوالم اینه چه راه هایی دارم که بتونم هر دو ماژول را کنترل کنم ساده ترین و بهترینش کدومه پیشاپیش ممنون از راهنماییتون🌹

    1. سلام عزیز
      باید از کتابخانه سریال نرم افزاری استفاده کنید همانکاری که در دوره اردوینو برای ماژول بلوتوث انجام شده است

  2. عرض ادب مجدد جناب
    ن منظورم این نبود ک با nrf این شبیه سازی رو انجام بدم
    خواستم از شما کمک بگیرم ک با چه ماژولی میتونم این کار رو انجام بدم ک ب جای سیسم از یک ماژول برای راتباط بین دو آردوینو استفاده کنم
    این شبیه سازی برای کنترل دو لامپ با استفاده از آردوینو هستش
    اگر امکانش هست شمارتون یا آیدیتون رو ارسال بفرمایید تا در تلگرام یا ایتا باهاتون در ارتباط باشم عکس مدار رو ارسال کنم ببینید و کمکم کنید

  3. عرض ادب و خسته نباشید خدمت شما
    من شبیه سازی کنترل دو لامپ با برد آردوینو UNO رو در پروتئوس انجام دادم
    پروژه صرفا شبیه سازی بوده و ساخت نیست
    استادم گفتن ک به جای اتصال دو آردوینو ک با سیم هست، از ماژول گیرنده فرستنده استفاده کنم و تغییراتی داخل کد دیگه انجام ندم
    از چ ماژولی میتونم برای این شبیه سازی استفاده کنم؟؟
    خیلی گشتم ولی هیچی پیدا نکردم
    اسکرین از شبیه سازی هم اگر میخواید خدمتتون ارسال میکنم اینجا نمیشه ارسال کرد
    لطفا راهنماییم کنید فردا الی پس فردا دیگه باید پروژمو تحویل بدم و موندم ک چیکار کنم

    1. سلام عزیز
      برای شبیه سازی مناسب نیست اما اگر بسازید با nrf به سادگی انجام میشود

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

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

  5. سلام مهندس
    ببخشید با این روش میشه دو تا esp8266 رو هم وصل کرد؟؟؟

  6. سلام مهندس عزیز. سپاس فراوان برای آموزش خوبتون.
    فقط یک سوال اینکه چرا میفرمایین برای اپلود کد باید پین های TX-RX رو جدا کنیم؟
    چه ارتباطی بین پورت USB برای ریختن کد و این دو تا پین وجود داره و ممکنه چ مشکلی پیش بیاد ؟
    و چقدر احتمال ایجاد این مشکل هست ؟
    پیشاپیش متشکرم از توضیحتون

    1. سلام عزیز
      کد از طریق ارتباط سریال در برد آردوینو ریخته میشود که این خطوط به پایه های 0 و 1 متصل هستند. زمانی که چیزی به پایه های 0 و 1 متصل باشد باعث تداخل میشود و کد آپلود نمیشود.

  7. سلام مهندس
    من یک پروژه ساختم که با پیامک و ماژول سیم ۸۰۰ ال چهار تا رله هم کنترل کنم سوالم اینه که آیا میتوان از پایه 0 و 1 آردینو استفاده کرد( چون پین های ارتباطی هستند) یعنی ۶ رله را کنترل کنم؟

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

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

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