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

آموزش آردوینو بخش چهاردهم – ارتباط communication در آردوینو

arduino-basic-tutorial-part-fourteen-communication-digispark
نوشته شده توسط پریسا پوربلورچیان

پروتکل های ارتباطی در آردوینو نقش اساسی در ارتباط و ارسال دیتا را برعهده دارند. به واسطه پروتکل های ارتباطی افزایش سرعت در ارسال، کاهش سیم کشی در مدار را داریم که نقاط قوت محسوب می‌شوند. در این آموزش به بررسی دو ارتباط 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 مشخص شده است.

 

جدول ارتباط Serial بردهای آردوینو - دیجی اسپارک

 

    • برد آردوینو 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. AVAILABLE در برنامه نویسی آردوینو - دیجی اسپارک

 

کارکرد سریال مانیتور آردوینو با تابع SERIAL. AVAILABLE - دیجی اسپارک

 

نمایش اعداد در سریال مانیتور آردوینو - دیجی اسپارک

 


Serial.availableForWrite()


تابع Serial.availableForWrite() در زبان برنامه‌نویسی Arduino این امکان را می‌دهد تعداد بایت‌هایی که می‌توانید برای ارسال در بافر خروجی UART سریال استفاده کنید را بدست آورید. این تعداد نشان‌دهنده فضای خالی موجود در بافر خروجی (TX) سریال است و نشان می‌دهد که چه تعداد بایت داده می‌تواند به صورت فعلی از طریق UART سریال ارسال شود. با استفاده از Serial.availableForWrite() می‌توانید برنامه خود را به گونه‌ای طراحی کنید که بدانید چه مقدار فضای خالی برای ارسال داده در UART سریال دارید تا جلوگیری از ارسال داده‌های بیش از حد و پر شدن بافر خروجی کنید. این کار می‌تواند در جلوگیری از از دست رفتن داده‌ها و بروز مشکلاتی که به دلیل پر شدن بافر ممکن است رخ دهد، مفید باشد.
Serial.availableForWrite()

 


Serial.begin()


 برای مشخص شدن بادریت در سریتال مانیتور از این دستور استفاده می‌شود.
Serial.begin(speed)
Serial.begin(speed, config)

 


Serial.end()


برای قطع ارتباط سریال از این دستور استفاده می‌شود.
Serial.end()

 


Serial.find()


تابع Serial.find() در زبان برنامه‌نویسی Arduino برای جستجوی و جابجایی مکانی خاص در داده‌هایی که از UART سریال دریافت می‌شوند، استفاده می‌شود. این تابع این امکان را می‌دهد تا در جریان داده‌های ورودی سریال به دنبال یک رشته (string) یا یک کاراکتر خاص بگردید و مکان آن را در داده‌ها تعیین کنید. سینتکس تابع Serial.find() به صورت زیر است:
int Serial.find(char target);
int Serial.find(char target, size_t length);
int Serial.find(const char* target);
int Serial.find(const String& target);
  • target: کاراکتر یا رشته‌ای که می‌خواهید در داده‌های ورودی سریال جستجو کنید.
  • length (اختیاری): طول دقیقی که باید در داده‌ها جستجو شود (برای استفاده از آن، نسخه دوم و سوم تابع بالا را استفاده کنید).
این تابع وقتی یک تطابق پیدا کند، شماره اندیس (مکان) اولین کاراکتر یا رشته مطابق را در داده‌های ورودی سریال برمی‌گرداند. اگر هیچ تطابقی پیدا نشود، -۱ را برمی‌گرداند. دریافت داده‌هایی تا زمانی که کاراکتر خاص “@” یافته شود:
char foundChar = Serial.find(‘@’);
if (foundChar != -1) {
  Serial.print(“کاراکتر ‘@’ در مکان: “);
  Serial.println(foundChar);
}
جستجو برای رشته “Hello” و چاپ مکان آن:
cpp
Copy code
if (Serial.find(“Hello”) != -1) {
  Serial.println(“رشته ‘Hello’ یافته شد.”);
}
این تابع برای پردازش داده‌هایی که از سریال دریافت می‌شوند و تشخیص الگوها یا داده‌های مشخص در آنها مفید است.
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” برای نمایش به صورت باینری و غیره باشد.

ارسال یک عدد به UART سریال:
int sensorValue = 42;
Serial.print(“مقدار سنسور: “);
Serial.println(sensorValue);
 
ارسال یک رشته (string) به UART سریال:
!”;String message = “hello
Serial.println(message);
 
ارسال عدد اعشاری به UART سریال:
float temperature = 25.5;
Serial.print(“دما: “);
Serial.println(temperature, 1); // نمایش یک رقم اعشار
تابع Serial.print() به شما امکان می‌دهد داده‌های مختلف را به UART سریال ارسال کرده و برای ارتباط با دستگاه‌های خارجی یا نمایش اطلاعات بر روی ترمینال کامپیوتر استفاده شود.

برای چاپ و نمایش دیتا در سریال مانیتور از دستور 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

 


وسایل مورد نیاز


آردوینو 

همین!

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

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

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۴ دیدگاه

    • با سلام
      دیتاشیت سنسورها و پایه های سنسور پروتکل ارتباطی را مشخص می‌کند.

    • با سلام
      توسط تابع SERIAL. AVAILABLE یک عدد بایت کاراکتری را از سریال مانیتور میخواند که در بافر ذخیره شده است

    • با سلام
      بله یکی از قابلیت ها امکان برقراری ارتباط با ماژول های وای فای از طریق ارتباط سریال است.

  • سلام .
    اگه بخواییم بجای کنسول سریال که در آی دی ای مون موجوده ، بخواییم داده رو از طریق همان کابل یو اس بی که به برد وصل میشه ، برای یک میزبان دیگه با زبان برنامه نویسی دیگه ای در کامپیوتر ارسال کنیم ، چطور میشه ؟
    مثال میزنم .
    می خوام جواب Print بصورت عددی یا کارکتری ، به ویژوال استادیو مایکروسافت ارسال بشه و من بتونم از حاصل دستور Print در یک پروژه ی کامپایلری استفاده کنم . بدون اینکه از سیم بندی های مربوط به RX و TX ( بدون پایه های ۱ و ۲ ) استفاده بشه .

    • برای ارسال داده از طریق کابل USB به جای کنسول سریال در IDE، روش‌های مختلفی وجود دارد که به نوع برد، زبان برنامه‌نویسی و میزبان مورد نظر شما بستگی دارد. در اینجا چند روش کلی را به همراه مثال‌هایی برای ویژوال استودیو مایکروسافت ارائه می‌دهم:

      ۱٫ استفاده از رابط USB سریال (CDC):

      بسیاری از بردها، مانند Arduino، از رابط CDC پشتیبانی می‌کنند که به شما امکان می‌دهد از طریق کابل USB با آنها ارتباط برقرار کنید. در این روش، برد شما به عنوان یک دستگاه سریال مجازی در کامپیوتر شما ظاهر می‌شود و می‌توانید از برنامه‌های ترمینال مانند PuTTY یا Serial Monitor در IDE خود برای ارسال و دریافت داده استفاده کنید.
      مثال:

      در Arduino، می‌توانید از توابع Serial.print() و Serial.println() برای ارسال داده به کامپیوتر استفاده کنید. در ویژوال استودیو، می‌توانید از کلاس SerialPort برای دریافت داده از پورت سریال مجازی استفاده کنید.