مقدمه
Universal Serial Asynchronous Receiver Transmitter یا به اختصار USART یک پروتکل ارتباط سریال است که برای دریافت/ارسال داده به صورت سریال و در یک baud rate مشخص به کار گرفته میشود.
قطعات مختلف از جمله GPS ،GSM ،RFID، سنسورها و … به منظور دریافت یا انتقال اطلاعات، باید با میکروکنترلر ارتباط برقرار کنند. برای ارتباط با میکروکنترلر، پروتکلهای مختلفی مانند RS232 ،SPI ،I2C ،CAN و … مورد استفاده قرار میگیرد. اساساً یک پروتکل یک مجموعه قوانین بوده که از طرف ارسال کننده و دریافت کننده، مورد توافق قرار میگیرد و مشخص کند که:
- داده چگونه بسته بندی میشود؟
- چه تعداد بیت تشکیل دهنده یک کارکتر باشند؟
- داده چگونه آغاز شده و چگونه پایان میپذیرد؟
با کمک USART، میتوان داده را به یک کامپیوتر یا دیگر دستگاهها ارسال یا دریافت نمود. USART همچنین به عنوان رابط بین میکروکنترلر و ماژولهای متنوعی مانند ماژول ESP8266) Wi-Fi)، بلوتوث، GPS ،GSM و … به کار برده میشود.
حال اجازه دهید ارتباط سریال مبتنی بر USART را با هم شروع کنیم.
ارتباط غیرهمزمان: عملیات غیرهمزمان بدین معنی است که یک پروسه مستقل از پروسههای دیگر عمل میکند. ارتباط غیرهمزمان بدین معنی است که هر کارکتر (بایت داده) بین بیتهای شروع و پایان قرار میگیرد. بیت شروع همیشه صفر (پایین) و بیت پایان همیشه یک (بالا) میباشد.
Bit Rate و Baud Rate: نرخ انتقال داده در ارتباط سریال در واحد بیت برثانیه (bps) سنجیده میشود. اصطلاح رایج دیگری که برای bps استفاده میشود Baud Rate میباشد؛ که به معنی تعداد تغییرات در یک سیگنال در هر ثانیه میباشد. در اینجا، سیگنال بیتها میباشند، بنابراین بیت ریت برابر با باودریت است.
USART در آردوینو
آردوینو Atmega328) Uno) یک واحد USART داخلی دارد که برای ارتباط سریال مفید میباشد. از آن میتوان برای تبادل داده با کامپیوتر یا دیگر قطعات مانند GSM ،GPS، بلوتوث و … استفاده کرد.
آردوینو از طریق پینهای دیجیتال صفر (RXD) و یک (TXD) با دستگاههای سریالی ارتباط برقرار میکند. در حالی که برای ارتباط با کامپیوتر/لپتاپ از usb بهره میگیرد. پینهای آردوینو در تصویر زیر نشان داده شدهاند.
- در تصویر بالا، دو led نمایشگر TX و RX با دایره مشخص شدهاند. این LEDها، LEDهای وضعیتی هستند که نشانگر عملیات ارسال و دریافت سریال میباشند.
- وقتی کامپیوتر داده را به صورت سریالی و از طریق usb به آردوینو Uno منتقل میکند، الایدی RX روشن شده و دریافت داده را نمایش میدهد. وقتی آردوینو Uno داده را از طریق usb به کامپیوتر ارسال میکند، الایدی TX روشن شده و ارسال داده را نمایش میدهد.
- الایدیهای نمایشگر وضعیت کاملا در جهت عکس تبادل داده با ماژول/قطعات عمل میکند. در مورد آردوینو Uno، ارتباط همزمان از طریق usb و پینهای TX و RX اجازه داده نمیشود.
- ارتباط سریال از طریق پینهای RX/TX از سطح منطق TTL استفاده میکند. ارتباط سریال بین آردوینو و کامپیوتر/قطعات سریالی در یک باودریت مانند ۴۸۰۰، ۹۶۰۰، ۱۱۵۲۰۰، ۳۴۸۰۰ و … انجام میشود.
مانیتور سریال آردوینو
IDE آردوینو یک مانیتور سریال (Serial Monitor) درونی دارد که از آن میتوان برای مشاهده دادههای سریال استفاده کرد. بعد از آپلود برنامه به آردوینو، مانیتور سریال را برای مشاهده داده سریال باز کنید. میتوان همانند شکل زیر سریال مانیتور را پیدا کرد.
به Serial Monitor à Tools بروید.
میتوان با کلیک روی آیکون موجود در گوشه بالا سمت راست IDE آردوینو نیز مانیتور سریال را باز کرد.
سپس پنجره مانیتور سریال را همانند شکل زیر مشاهده خواهید کرد.
میتوان باودریت را با انتخاب یک از گزینههای مشخص شده در شکل بالا تغییر داد. اگر باودریت دو قطعه با هم سازگار نباشند، هیچ مقداری دریافت نشده و یا داده اشتباه دریافت خواهید کرد.
Serial plotter آردوینو
Serial Plotter آردوینو ویژگی بسیار جذاب IDE آردوینو میباشد. این برنامه دادههای دریافتی روی پورت سریال کامپیوتر را به صورت شکل موج رسم میکند. این برنامه برای مصورسازی دادهها، عیبیابی کد و مصورسازی متغیرها به صورت شکل موج بسیار مفید میباشد.
میتوان Serial Plotter را همانند شکل زیر اجرا کرد.
توابع مورد استفاده در ارتباط سریال
(Serial.begin (baud rate: این تابع برای آغاز یک ارتباط سریال با باودریت مشخص به کار میرود.
مثال:
Serial.begin(9600)
((Serial.print (data, format type (optional: این تابع کارکتر اسکی را روی پورت سریال ارسال میکند و بنابراین به راحتی برای انسان قابل فهم است. این تابع داده را به کارکتر اسکی تبدیل کرده و سپس آن را ارسال (پرینت) میکند.
مثال:
Serial.print (123); Serial.print (“123”); Serial.print (12, HEX)
((Serial.println (data, format type (optional: این تابع کارکتر اسکی را روی پورت سریال با یک کارکتر carriage return ارسال میکند.
()Serial.write: این تابع داده باینری را روی پورت سریال مینویسد. همچنین تعداده بایتهای نوشته شده را برمیگرداند.
مثال:
Serial.write (65); // it writes actual byte to serial port
()Serial.available: این تابع تعداد بایتهای موجود برای خواندن را برمیگرداند.
()Serial.read: این تابع برای خواندن داده به صورت سریال استفاده میشود.
مثال:
received_data = Serial.read()
()Serial.readString: این تابع برای خواندن رشتههای دریافتی به کار میرود.
مثال:
String received_data = Serial.readString()
ارسال داده به کامپیوتر به صورت سریال
اجازه دهید با استفاده از آردوینو و در باودریت ۹۶۰۰، یک برنامه برای ارسال داده به صورت سریال به کامپیوتر بنویسیم.
اسکچ انتقال داده به کامپیوتر
void setup() { Serial.begin (9600); //initiate serial communication with 9600 baud rate } void loop() { Serial.println("hello"); //send data to computer delay(1000); }
خروجی در سریال مانیتور
خواندن داده به صورت سریال از کامپیوتر و نمایش آن روی مانیتور سریال
در اینجا، داده را به صورت سریالی از کامپیوتر به آردوینو منتقل کرده و آن را میخوانیم. بعد از خواندن داده، آن را روی مانیتور سریال (کامپیوتر) نمایش میدهیم.
اسکچ خواندن داده به صورت سریالی
char received_data; //variable to store read data void setup() { Serial.begin(9600); } void loop() { if(Serial.available()>0) //check for any data received { received_data = Serial.read(); //read received data Serial.print("received data is: "); Serial.println(received_data); //display received data } }
خواندن رشته سریالی از کامپیوتر
اجازه دهید برنامهای بنویسیم که رشتههای دریافتی از کامپیوتر را خوانده و آن را روی مانیتور سریال نشان دهد.
اسکچ خواندن رشته سریالی
String receive_buffer; void setup() { Serial.begin(9600); } void loop() { if(Serial.available()>0) //check for any data received { receive_buffer = Serial.readString(); //read received data Serial.print("received data is: "); Serial.println(receive_buffer); //display received data } }
خاموش و روشن کردن LED از کامپیوتر با استفاده از آردوینو
میخواهیم یک برنامه کوچک بسازیم و از طریق آن led را با ارسال فرمان سریال از کامپیوتر کنترل کنیم.
اسکچ برای کنترل LED از طریق کامپیوتر
char received_data; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { if(Serial.available()>0){ //read serial data received_data = (char)Serial.read(); Serial.print("received data is: "); //check for received command for action if(received_data=='1'){ digitalWrite(13, HIGH); Serial.println(received_data); } else if(received_data=='0'){ digitalWrite(13, LOW); Serial.println(received_data); } else Serial.println(" invalid"); } }
ویدیوی خروجی
رسم موج سینوسی روی Serial Plotter
میخواهیم یک موج سینوسی تولید کرده و روی serial plotter نمایش دهیم.
اسکچ تولید موج سینوسی
void setup() { Serial.begin(9600); } void loop() { for (float j = 0; j < 360.00; j=j+2) { Serial.println(sin(j * (PI / 180.00))); //plot sinewave } }
خروجی Serial Plotter
نکته: برای رسم چندین متغیر یا شکل موج به صورت همزمان، باید یک «فضای خالی» بین دو تابع print چاپ شود.
Serial.print(value 1); Serial.print(" "); Serial.println(value 2);
مصورسازی چندین داده در Serial Plotter
حال اجازه دهید با استفاده از آردوینو سیگنال سینوس و کسینوس ساخته و انها را با باودریت ۹۶۰۰ به کامپیوتر انتقال دهیم. بعد از انتقال دادهها، میتوان این سیگنالها را روی Signal Plotter مصور کرد.
اسکچ برای رسم سینوس و کسینوس
void setup() { Serial.begin(9600); } void loop() { for (float j = 0; j < 360.00; j=j+2) { Serial.print(sin(j * (PI / 180.00))); //plot sinewave Serial.print(" "); Serial.println(cos(j * (PI / 180.00))); //plot cosinewave } }
خروجی Serial plotter
- منبع: ترجمه از سایت electronicwings.com
امیدوارم آموزش USART در آردوینو Uno براتون مفید واقع شده باشه.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.