ارتباط سریال UART بین دو برد آردوینو
محتویات
UART مخفف Universal Asynchronous Receiver/Transmitter است. این یک دستگاه سخت افزاری (یا مدار) است که برای ارتباط سریال بین دو دستگاه استفاده می شود.
دستگاه های 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 را نشان میدهد.
ارتباط بین 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 داخلی به برد دیگر ارسال می کند.
اگر سوالی دارید یا در تنظیمات این پروژه مشکل دارید، حتما نظر بدهید!
سلام مهندس
دو سوال دارم:
۱- آیا میشود از همین ارتباط برای ارتباط بین nodeMCU و آردوینو استفاده کرد؟
۲- هنگام استفاده از این ارتباط دیگه نمیشه از سریال مانیتور آردوینو استفاده کرد؟
سلام وقت بخیر
بله میشه
بستگی به نود ام سی یو شما داره اگر فقط یک واحد ارتباطی داره خیر
سلام مهندس
میخواستم ببینم میتونم بخش های خاصی از یک داده سریال رو مورد استفاده قرار بدم برای مثال:
“X = “128” Y = “256
ومن فقط مقدار هایی که داخل “” هست رو میخوام
لطفا بگید چطور میتونم این کار رو انجام بدم.
ممنون
سلام عزیز
اگر به صورت یک آرایه یا داده ها را بین کاما (,) ارسال کنید با دستور parseint میتوانید جدا کنید
سلام مهندس ببخشین من قسمت ها اول اموزشتون رو دیدم واقعا عالی بود متشکرم الان من میخوام پروژه طراحی کنم ک نیاز به دوتا rx .txدارم سوالم اینه چه راه هایی دارم که بتونم هر دو ماژول را کنترل کنم ساده ترین و بهترینش کدومه پیشاپیش ممنون از راهنماییتون🌹
سلام عزیز
باید از کتابخانه سریال نرم افزاری استفاده کنید همانکاری که در دوره اردوینو برای ماژول بلوتوث انجام شده است
عرض ادب مجدد جناب
ن منظورم این نبود ک با nrf این شبیه سازی رو انجام بدم
خواستم از شما کمک بگیرم ک با چه ماژولی میتونم این کار رو انجام بدم ک ب جای سیسم از یک ماژول برای راتباط بین دو آردوینو استفاده کنم
این شبیه سازی برای کنترل دو لامپ با استفاده از آردوینو هستش
اگر امکانش هست شمارتون یا آیدیتون رو ارسال بفرمایید تا در تلگرام یا ایتا باهاتون در ارتباط باشم عکس مدار رو ارسال کنم ببینید و کمکم کنید
عرض ادب و خسته نباشید خدمت شما
من شبیه سازی کنترل دو لامپ با برد آردوینو UNO رو در پروتئوس انجام دادم
پروژه صرفا شبیه سازی بوده و ساخت نیست
استادم گفتن ک به جای اتصال دو آردوینو ک با سیم هست، از ماژول گیرنده فرستنده استفاده کنم و تغییراتی داخل کد دیگه انجام ندم
از چ ماژولی میتونم برای این شبیه سازی استفاده کنم؟؟
خیلی گشتم ولی هیچی پیدا نکردم
اسکرین از شبیه سازی هم اگر میخواید خدمتتون ارسال میکنم اینجا نمیشه ارسال کرد
لطفا راهنماییم کنید فردا الی پس فردا دیگه باید پروژمو تحویل بدم و موندم ک چیکار کنم
سلام عزیز
برای شبیه سازی مناسب نیست اما اگر بسازید با nrf به سادگی انجام میشود
درود وقتتون بخیر ممنون از سایت خوبتون.
من میخوام اطلاعت خروجی یک ماژول آلتراسونیک رو که وصل شده به یک آردوئینو به آردوئینو دوم انتقال بدم و از طریق آردوئینو دوم اطلاعات آلتراسونیک رو روی سریال مانیتور بخونم. من میتونم از این روش استفاده کنم ؟ و اینکه پروژه مشابه این رو چطور میتونم پیدا کنم . با تشکر
سلام عزیز
بله هم از این ارتباط هم از سایر پروتکل ها میتوانید استفاده کنید. در دوره آردوینو کامل آموزش داده شده است.
سلام مهندس
ببخشید با این روش میشه دو تا esp8266 رو هم وصل کرد؟؟؟
سلام عزیز
بله
سلام مهندس عزیز. سپاس فراوان برای آموزش خوبتون.
فقط یک سوال اینکه چرا میفرمایین برای اپلود کد باید پین های TX-RX رو جدا کنیم؟
چه ارتباطی بین پورت USB برای ریختن کد و این دو تا پین وجود داره و ممکنه چ مشکلی پیش بیاد ؟
و چقدر احتمال ایجاد این مشکل هست ؟
پیشاپیش متشکرم از توضیحتون
سلام عزیز
کد از طریق ارتباط سریال در برد آردوینو ریخته میشود که این خطوط به پایه های 0 و 1 متصل هستند. زمانی که چیزی به پایه های 0 و 1 متصل باشد باعث تداخل میشود و کد آپلود نمیشود.
سلام مهندس
من یک پروژه ساختم که با پیامک و ماژول سیم ۸۰۰ ال چهار تا رله هم کنترل کنم سوالم اینه که آیا میتوان از پایه 0 و 1 آردینو استفاده کرد( چون پین های ارتباطی هستند) یعنی ۶ رله را کنترل کنم؟
سلام عزیز
بله امکانش هست فقط در هنگام آپلود کد این دو پایه را قطع کنید.