پروتکل های ارتباطی در آردوینو نقش اساسی در ارتباط و ارسال دیتا را برعهده دارند. به واسطه پروتکل های ارتباطی افزایش سرعت در ارسال، کاهش سیم کشی در مدار را داریم که نقاط قوت محسوب میشوند. در این آموزش به بررسی دو ارتباط Serial و Stream در آردوینو میپردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
ارتباط Serial
ارتباط UART (Universal Asynchronous Receiver/Transmitter) سریال یک روش معمول برای ارتباط بین دستگاههای الکترونیکی مختلف است. در میکروکنترلرها و بردهای میکروکنترلری مانند آردوینو، UART یکی از راههای ارتباطی است که به کمک آن میتوان دادهها را از یک دستگاه به دیگری منتقل کرد.ارتباط UART سریال به صورت ناهمزمان اتفاق میافتد، یعنی اطلاعات بدون ساعت مشخصی ارسال و دریافت میشوند. این روش از دو سیم مجزا برای ارسال و دریافت دادهها استفاده میکند.
یک سیم برای ارسال (TX – Transmit) و دیگری برای دریافت (RX – Receive).
دادهها به صورت بایت به بایت ارسال میشوند و هر بایت شامل ۸ بیت اطلاعات است. در آردوینو، میتوانید از توابع مربوط به UART سریال برای ارتباط با دیگر دستگاهها یا کامپیوتر استفاده کنید.
- Serial.begin(baudrate): این تابع برای تنظیم نرخ بیت در ثانیه (baud rate) استفاده میشود. بیت در ثانیه نشاندهنده تعداد بیتهای ارسالی و دریافتی در هر ثانیه است.
- Serial.available(): این تابع تعداد بایتهای دریافتی در بافر ورودی UART سریال را برمیگرداند.
- Serial.read(): این تابع یک بایت از بافر ورودی UART سریال را خوانده و برمیگرداند.
- Serial.write(data): این تابع برای ارسال یک بایت اطلاعات به UART سریال استفاده میشود.
ارتباط UART سریال به عنوان یکی از روشهای معمول برای ارتباط با سنسورها، دیگر میکروکنترلرها، نمایشگرها و دستگاههای خارجی در پروژههای آردوینو و دنیای اینترنت اشیاء (IoT) استفاده میشود.برای ارتباط برد آردوینو با دستگاه ها بهترین راه حل استفاده از ارتباط سریال Serial است. تمامی بردهای آردوینو حداقل یک پورت سریال را دارند و برای شروع ارتباط هیچ مانعی بر سر راه ما وجود ندارد. البته بردهایی مانند آردوینو Arduino Mega2560 از چندین پورت سریال استفاده میکنند. پایه های سریال در بردهای آردوینو ARDUINO با RX , TX مشخص شده است.
-
- برد آردوینو UNO , NANO , MINI دارای یک پورت سریال است.
- برد آردوینو MEGA دارای ۴ پورت سریال است.
- برد آردوینو LEONARDO, MICRO, YUN دارای یک پورت سربال است.
- برد آردوینو DUE دارای ۴ پورت سریال است.
با اتصال هر دیوایس به پایه های RX, TX بردهای آردوینو برقراری ارتباط انجام شده و امکان ارسال دیتا بین دو دستگاه آغاز میشود. همچنین نرم افزار IDE ARDUINO از طریق سریال مانیتور ارتباط سریال با برد آردوینو را برای ما فراهم کرده است.
پین های سریال RX, TX در ارتباط سریال از لاجیک لول TTL بسته به نوع آردوینو بین ۳٫۳ تا ۵ ولت استفاده میکنند. دقت کنید پایه ها را به صورت مستقیم به پورت RS232 متصل نکنید. برای اتصال مستقیم پایه های سریال کامپیوتر بایستی از مبدل های USB TO TLL استفاده کنید. برای اتصال پایه های RX , TX به مبدل USB TO SERIAL به روش زیر عمل کنید.
- پایه TX برد آردوینو را به پایه RX دیوایس مورد استفاده وصل کنید.
- پایه RX برد آردوینو را به پایه TX دیوایس مورد استفاده وصل کنید.
- پایه های تغذیه همانند جاپ روی بردها انجام شود.
if(Serial)
دستور if(Serial) در زبان برنامهنویسی Arduino امکان بررسی وضعیت اتصال سریال (UART سریال) را میدهد. این دستور در واقع به بررسی این امکان کمک میکند که آیا اتصال سریال آردوینو به کامپیوتر (یا دستگاه دیگری که به آردوینو متصل است) با موفقیت برقرار شده یا خیر.وقتی که دستگاه با کامپیوتر یا دستگاه دیگری از طریق پورت سریال (USB سریال) به آردوینو متصل میشود، اتصال سریال فعال میشود. در این حالت، Serial به عنوان یک آبجکت سریال فعال میشود. اگر از دستور if(Serial) استفاده کنید، به عنوان یک شرط در نظر گرفته میشود و اگر اتصال سریال فعال باشد، شرط به صورت صحیح ارزیابی میشود و بلوک کد داخل if اجرا میشود. در غیر این صورت، اگر اتصال سریال غیرفعال باشد (یعنی آردوینو به کامپیوتر متصل نشده باشد)، بلوک کد داخل if نادیده گرفته میشود.
if (Serial) {
// اتصال سریال فعال است، کد در اینجا اجرا میشود
Serial.println(“اتصال سریال برقرار است.”);
} else {
// اتصال سریال غیرفعال است، کد در اینجا اجرا میشود
Serial.println(“اتصال سریال برقرار نیست.”);
}
void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB } } void loop() { //proceed normally }
Serial.available()
تابع Serial.available() در زبان برنامهنویسی Arduino این امکان را میدهد تعداد بایتهای دریافتی در بافر ورودی UART سریال را بدست آورید. این تعداد نشاندهنده تعداد بایتهایی است که در زمان فعلی در حالت دریافت (RX) قرار دارند و آماده برای خواندن توسط برنامه هستند.با استفاده از Serial.available() میتوانید برنامه خود را به گونهای طراحی کنید که اطلاع دقیقی از تعداد دادههایی که دریافت شده است را داشته باشید. این اطلاعات ممکن است برای پردازش دادهها و انجام وظایف خاصی مانند خواندن دقیق تر دادهها و جلوگیری از بازیابی دادههای ناقص یا اشتباهی مفید باشد.در مثال زیر، نحوه استفاده از Serial.available() نمایش داده شده است:
void setup() {
Serial.begin(9600); // تنظیم نرخ بیت سریال به ۹۶۰۰
}
void loop() {
if (Serial.available() > 0) {
// اگر دادهای در بفر ورودی UART سریال وجود داشته باشد
char receivedChar = Serial.read(); // خواندن یک کاراکتر از سریال
Serial.print(“Received: “);
Serial.println(receivedChar);
}
}
در این مثال، برنامه در هر لحظه بررسی میکند که آیا دادهای در بفر ورودی UART سریال وجود دارد یا نه. اگر دادهای وجود داشته باشد، یک کاراکتر از آن خوانده و آن را در خروجی سریال چاپ میکند. این کد به شما اجازه میدهد تا دادههایی که از سریال دریافت میشوند را به طور پویا و زمان واقعی پردازش کنید.توسط تابع SERIAL. AVAILABLE یک عدد بایت کاراکتری را از سریال مانیتور میخواند که در بافر ذخیره شده است. برای تست این دستور کد زیر را در آردوینو کپی کرده و سپس اجرا کنید. برای اجرا سریال مانیتور را باز کرده و سپس عدد ۱ را وارد و اینتر را بزنید. در سریال مانیتور عدد ۱ به عدد ۴۹ تبدیل شده که بر حسب DEC است.
int incomingByte = 0; // for incoming serial data void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps } void loop() { // reply only when you receive data: if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); // say what you got: Serial.print("I received: "); Serial.println(incomingByte, DEC); } }
Serial.availableForWrite()
Serial.availableForWrite()
Serial.begin()
Serial.begin(speed) Serial.begin(speed, config)
Serial.end()
Serial.end()
Serial.find()
- target: کاراکتر یا رشتهای که میخواهید در دادههای ورودی سریال جستجو کنید.
- length (اختیاری): طول دقیقی که باید در دادهها جستجو شود (برای استفاده از آن، نسخه دوم و سوم تابع بالا را استفاده کنید).
Serial.find(target) Serial.find(target, length)
Serial.print()
تابع Serial.print() در زبان برنامهنویسی Arduino برای ارسال دادهها به UART سریال (پورت سریال) برای ارتباط با کامپیوتر یا دیگر دستگاهها به کار میرود. این تابع این امکان را میدهد دادههای مختلف را به صورت متغیرها یا ثابتها از نوعهای مختلف ارسال کنید. سینتکس تابع Serial.print() به صورت زیر است:
Serial.print(data);
Serial.print(data, format);
data: دادهای که میخواهید ارسال کنید. این میتواند یک عدد، یک متغیر، یک رشته (string)، یک کاراکتر، یک متغیر شناور (float) و غیره باشد.
format (اختیاری): فرمت داده برای چاپ. این میتواند “DEC” برای نمایش عدد به صورت دهدهی، “BIN” برای نمایش به صورت باینری و غیره باشد.
برای چاپ و نمایش دیتا در سریال مانیتور از دستور PRINT استفاده میشود.
Serial.print(78) gives "78" Serial.print(1.23456) gives "1.23" Serial.print('N') gives "N" Serial.print("Hello world.") gives "Hello world."
Serial.print(78, BIN) gives "1001110" Serial.print(78, OCT) gives "116" Serial.print(78, DEC) gives "78" Serial.print(78, HEX) gives "4E" Serial.print(1.23456, 0) gives "1" Serial.print(1.23456, 2) gives "1.23" Serial.print(1.23456, 4) gives "1.2345"
روش فراخوانی
Serial.print(val) Serial.print(val, format)
/* Uses a for loop to print numbers in various formats. */ void setup() { Serial.begin(9600); // open the serial port at 9600 bps: } void loop() { // print labels Serial.print("NO FORMAT"); // prints a label Serial.print("\t"); // prints a tab Serial.print("DEC"); Serial.print("\t"); Serial.print("HEX"); Serial.print("\t"); Serial.print("OCT"); Serial.print("\t"); Serial.print("BIN"); Serial.println(); // carriage return after the last label for (int x = 0; x < 64; x++) { // only part of the ASCII chart, change to suit // print it out in many formats: Serial.print(x); // print as an ASCII-encoded decimal - same as "DEC" Serial.print("\t\t"); // prints two tabs to accomodate the label lenght Serial.print(x, DEC); // print as an ASCII-encoded decimal Serial.print("\t"); // prints a tab Serial.print(x, HEX); // print as an ASCII-encoded hexadecimal Serial.print("\t"); // prints a tab Serial.print(x, OCT); // print as an ASCII-encoded octal Serial.print("\t"); // prints a tab Serial.println(x, BIN); // print as an ASCII-encoded binary // then adds the carriage return with "println" delay(200); // delay 200 milliseconds } Serial.println(); // prints another carriage return }
/* Uses a for loop to print numbers in various formats. */ void setup() { Serial.begin(9600); // open the serial port at 9600 bps: } void loop() { // print labels Serial.print("NO FORMAT"); // prints a label Serial.print("\t"); // prints a tab Serial.print("DEC"); Serial.print("\t"); Serial.print("HEX"); Serial.print("\t"); Serial.print("OCT"); Serial.print("\t"); Serial.print("BIN"); Serial.println(); // carriage return after the last label for (int x = 0; x < 64; x++) { // only part of the ASCII chart, change to suit // print it out in many formats: Serial.print(x); // print as an ASCII-encoded decimal - same as "DEC" Serial.print("\t\t"); // prints two tabs to accomodate the label lenght Serial.print(x, DEC); // print as an ASCII-encoded decimal Serial.print("\t"); // prints a tab Serial.print(x, HEX); // print as an ASCII-encoded hexadecimal Serial.print("\t"); // prints a tab Serial.print(x, OCT); // print as an ASCII-encoded octal Serial.print("\t"); // prints a tab Serial.println(x, BIN); // print as an ASCII-encoded binary // then adds the carriage return with "println" delay(200); // delay 200 milliseconds } Serial.println(); // prints another carriage return }
ارتباط STREAM
در آردوینو، کتابخانهٔ Stream یک کلاس پایه برای ارتباطات سریال و دیگر ارتباطات ورودی/خروجی است. این کلاس امکاناتی برای خواندن و نوشتن دادهها از/به منابع مختلف را فراهم میکند، مانند UART سریال، پورتهای I2C و SPI، و حتی فایلها در کامپیوتر از طریق USB.
کلاس Stream یک سری توابع پایه را ارائه میدهد که توسط کلاسهای ارتباطی دیگری مانند HardwareSerial (برای UART سریال) و Wire (برای I2C) اجرا میشود. بنابراین، شما میتوانید از این کلاس به عنوان یک رابط عمومی برای ارتباط با دستگاهها استفاده کنید.تعدادی از توابع مهم کلاس Stream عبارتند از:
- available(): تعداد بایتهای دریافتشده و آماده برای خواندن را برمیگرداند.
- read(): یک بایت از منبع را میخواند و آن را به عنوان یک مقدار صحیح (int) برمیگرداند.
- peek(): بدون خواندن و از بایت بعدی را برمیگرداند.
- flush(): تمام دادههای در حال انتقال را خروجی میدهد و پاک میکند.
- print(): داده را به صورت متغیرها یا ثوابت از نوعهای مختلف نمایش میدهد.
- write(): داده را به منبع خروجی ارسال میکند.
از Stream برای داده های کاراکتری و باینری استفاده میشود. این ارتباط به صورت مستقیم در برنامه نویسی فراخوانی نمیشود و فقط در زمان هایی که به آن نیاز است استفاده میشود. توسط این تابع جریان عملکردهای خواندن را در آردوینو تعریف می شود. هنگام استفاده از هرگونه عملکرد اصلی که از متد read () یا روش مشابه استفاده می کند ، می توانید با خیال راحت فرض کنید که در کلاس Stream فراخوانی می شود. کتابخانه هایی که از stream استفاده میکنند به صورت زیر است.
- Serial
- Wire
- Ethernet
- SD
وسایل مورد نیاز
همین!
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام
بابت این آموزش از شما ممنونم خیلی کامل و دقیق
با سلام
سپاس از همراهی شما کاربر گرامی
خسته نباشید ولی از کجا بفهمیم کدام سنسور i2c و spi است>
با سلام
دیتاشیت سنسورها و پایه های سنسور پروتکل ارتباطی را مشخص میکند.
قدم به قدم کامله واقعا ممنونم
با سلام
کاربر گرامی سپاس از همراهی شما
لطفا آموزش های سریال را کاملتر کنید
با سلام
در این خصوص طی چندین سال گذشته آموزش های جامعی در سایت منتشر شده است. از طریق لینک زیر بررسی کنید.
آموزش ارتباط سریال آردوینو
سلام و خسته نباشید
خیلی کامل و دقیق نوشتید.
با سلام
کاربر گرامی سپاس از همراهی شما
امیدوارم مفید واقع شده باشد.
با سلام مهندس آیا رشته آموزش های کاملتری برای درک عمیق سریال در سایت موجود است؟
با سلام
بله در این خصوص آموزش های زیر را مطالعه کنید.
بخش اول
بخش دوم
بخش سوم
بخش چهارم
بخش پنجم
سلام
برای بررسی داده ها در سریال مانیتور از کلاس های سریال میشه استفاده کرد؟
با سلام
سوال شما شفاف نیست. اما میتوانید داده ها در سریال مانیتور رصد کنید.
ممنونم مهندس پریسا
با سلام
کاربر گرامی سپاس از همراهی شما
سلام
چه زمانی از SERIAL. AVAILABLE استفاده میشه؟
با سلام
توسط تابع SERIAL. AVAILABLE یک عدد بایت کاراکتری را از سریال مانیتور میخواند که در بافر ذخیره شده است
سلام
برای استفاده از ماژول ESP با آردوینو باید از سریال استفاده کنیم؟
با سلام
بله بایستی از سریال استفاده کنید.
سلام
ارتباط سریال برای ماژل های وای فای استفاده میشه ؟
با سلام
بله یکی از قابلیت ها امکان برقراری ارتباط با ماژول های وای فای از طریق ارتباط سریال است.
سلام .
اگه بخواییم بجای کنسول سریال که در آی دی ای مون موجوده ، بخواییم داده رو از طریق همان کابل یو اس بی که به برد وصل میشه ، برای یک میزبان دیگه با زبان برنامه نویسی دیگه ای در کامپیوتر ارسال کنیم ، چطور میشه ؟
مثال میزنم .
می خوام جواب Print بصورت عددی یا کارکتری ، به ویژوال استادیو مایکروسافت ارسال بشه و من بتونم از حاصل دستور Print در یک پروژه ی کامپایلری استفاده کنم . بدون اینکه از سیم بندی های مربوط به RX و TX ( بدون پایه های ۱ و ۲ ) استفاده بشه .
برای ارسال داده از طریق کابل USB به جای کنسول سریال در IDE، روشهای مختلفی وجود دارد که به نوع برد، زبان برنامهنویسی و میزبان مورد نظر شما بستگی دارد. در اینجا چند روش کلی را به همراه مثالهایی برای ویژوال استودیو مایکروسافت ارائه میدهم:
۱٫ استفاده از رابط USB سریال (CDC):
بسیاری از بردها، مانند Arduino، از رابط CDC پشتیبانی میکنند که به شما امکان میدهد از طریق کابل USB با آنها ارتباط برقرار کنید. در این روش، برد شما به عنوان یک دستگاه سریال مجازی در کامپیوتر شما ظاهر میشود و میتوانید از برنامههای ترمینال مانند PuTTY یا Serial Monitor در IDE خود برای ارسال و دریافت داده استفاده کنید.
مثال:
در Arduino، میتوانید از توابع Serial.print() و Serial.println() برای ارسال داده به کامپیوتر استفاده کنید. در ویژوال استودیو، میتوانید از کلاس SerialPort برای دریافت داده از پورت سریال مجازی استفاده کنید.