پرش به محتوا

انواع پروتکل های ارتباطی آردوینو (SPI, I2C, UART, Parallel)

همزمان با اختراع ترانزیستور و پیشرفت‌های بعد از آن، متخصصان به دنبال روش‌های سریع، کارآمد و یکسان برای ایجاد ارتباط بین دستگاه‌ها بوده‌اند. با گذر زمان پروتکل‌های ارتباطی ایجاد شدند که با توجه به اجزای متصل و پیچیدگی آنها در موارد مختلف مورد استفاده‌ قرار میگیرند. به همین خاطر آشنایی با انواع پروتکل ارتباطی سریال در آردوینو ، شناخت عملکرد هرکدام از آنها و توانایی انجام کدنویسی ها ضرورت دارد.در این مطلب آموزشی با 3 مورد از مهتمرین پروتکل های ارتباطی شامل UART، I2C و SPI آشنا خواهید شد. برخی از این پروتکل ها چند ده سال قدمت دارند و هنوز در انواع میکروکنترلر و دستگاه های مختلف مورد استفاده‌ قرار میگیرند.
پروتکل ارتباطی سریال در آردوینو

پین های پروتکل ارتباطی سریال در آردوینو​

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

 پروتکل های ارتباطی UART، I2C و SPI و پین های آن در آردوینو به صورت زیر است:

پروتکل ارتباطی آردوینو

I2C

I2C یک پروتکل سریال سنکرون مشابه SPI است که مزایای بیشتری را ارائه‌ کرده‌ است. در این پروتکل ارتباطی میتوانید چندین Master و Slave داشته‌ باشید و آدرس دهی را ساده‌ تر انجام دهید. در این روش از دو سیم (متصل به مقاومت پول‌آپ) استفاده‌ میشود و در ولتاژهای مختلف و بدون نیاز به انتخاب چیپ ارتباط برقرار میشود.

پروتکل ارتباطی آردوینو

I2C بیشتر در اینترنت اشیا و تجهیزات صنعتی یا دستگاه های الکترونیکی مورد استفاده قرار میگرد. در این پروتکل از پین SDA برای ارسال و دریافت داده‌ و پین SCL به عنوان خط کلاک سریال استفاده‌ میشود.

پروتکل ارتباطی آردوینو

در تصویر بالا عملکرد کلی پروتکل قابل مشاهده‌ است. برای شروع یک بیت صفر از پین SDA مستر ارسال شده‌ و سپس آدرس 7 بیتی برای مشخص کردن اسلیو ارسال میگردد. همچنین یک بیت برای مشخص کردن خواندن یا نوشتن فرستاده‌ میشود.

پس از ارسال بیت های گفته‌ شده‌، اسلیو یک بیت جهت تایید موارد قبل به سمت مستر ارسال میکند. حالا اسلیو آماده‌ خواندن دیتای SCL و SDA و بررسی اطلاعات ارسالی است. در ادامه‌ با ارسال 8 بیت دیگر مشخص خواهد شد که کدام رجیستر (حافظه) مورد استفاده قرار خواهد گرفت.

زمانی که آدرس دریافت شد، اسلیو حالا میتواند رجیستر را انتخاب کند و پس از همه این موارد دیتای مورد نظر ارسال میگردد. بعد از ارسال دیتا، یک بیت تایید برای مستر ارسال میشود و در نهایت با بیت توقف (یک) فرایند ارسال داده‌ به پایان خواهد رسید.

کدنویسی

حالا که با پروتکل I2C و عملکرد آن آشنا شدیم، لازم است کدنویسی را آغاز کنیم. اگر میخواهید دو میکروکنترلر را به یکدیگر متصل کنید، این پروتکل اغلب مناسب ترین گزینه‌ است. برای استفاده‌ از این پروتکل ارتباطی در محیط کدنویسی آردوینو باید از کتابخانه Wire.h استفاده‌ کنید.

با کد های زیر، مستر را راه اندازی کنید:

				
					#include 
#define IC2_CLIENT 0x23
void setup() {
  Wire.begin();
  Serial.begin(9600);
}
void loop() {
  Wire.beginTransmission(IC2_CLIENT);
  Wire.write("Server Request");
  Wire.endTransmission();
  delay(3000);
}

				
			

از سمت دیگر اسلیو منتظر ارسال دیتا بوده‌ و آنها را در خروجی سریال پرینت میکند. کدهای زیر مربوط به بخش اسلیو است:

				
					#include 
#define MY_I2C_ADDRESS 0x23
void setup() {
  Wire.begin(MY_I2C_ADDRESS);
  Serial.begin(9600);
}
void loop() {
  if (Wire.available()) {
    char c = Wire.read();
    Serial.print(c);
  }
}

				
			

در این بخش تنها یک مثال از نحوه‌ استفاده‌ از این کتابخانه‌ آورده‌ شده‌ است. البته‌ که امکانات این کتابخانه گسترده‌ تر است و امکان اجرای دیگر روش های ارسال داده‌ وجود دارد.

SPI

SPI یکی دیگر از پروتکل ارتباطی سریال در آردوینو است که محبوبیت زیادی داشته‌ و برای ارسال داده‌ های سریع استفاده‌ میشود. به‌ کمک این پروتکل ارتباطی که دارای 4 سیم است، میتوانید داده‌ ها را با سرعت 20 مگابیت برثانیه انتقال دهید.

پین های مورد استفاده در پروتکل ارتباطی SPI شامل موارد زیر است:

  • SCK: خط کلاک سریال
  • MISO: خروجی مستر و ورودی اسلیو
  • MOSI: ورودی مستر و خروجی اسلیو
  • SS/CS: انتخاب چیپ

در تصویر بالا نحوه اتصال مستر و اسیلو را میتوانید مشاهده‌ کنید. عملکرد MISO و MOSI مثل Tx و Rx در پرتکل ارتباطی UART است که در ادامه بررسی میشود. از این پین‌ها برای ارسال و دریافت دیتا استفاده میشود و پین SCK نیز مشخص میکند که کدام اسیلو با مستر در ارتباط باشد.

از آنجایی که SPI یک پروتکل سنکرون است، یک ساعت داخلی لازم است تا از همزمان بودن فرکانس کاری مستر و اسلیو مطمئن شویم. به‌ این ترتیب لازم نیست بادریت این دو دستگاه‌ به اشتراک گذاشته‌ شود.

پروتکل ارتباطی آردوینو

شروع پروتکل ارتباطی با انتخاب دستگاه اسیلو توسط مستر صورت میگیرد. به این صورت که سیگنال صفر از طریق پین SS/CK از مستر ارسال میشود و اسلیو این سیگنال Low را دریافت میکند. حالا اسلیو آماده است دیتای SCK و MOSI را دریافت کند و این با ارسال بیت 1 از سمت مستر شروع میشود.

هر دو پین MOSI و MISO عملکرد دو طرفه‌ دارند و ارسال و دریافت داده‌ از طریق آنها انجام میشود. قابلیت های فوق العاده این پروتکل ارتباطی باعث شده در دستگاه‌ های مختلف از آن استفاده‌ شود. در دستگاه هایی مثل کارت حافظه دیجیتال، مبدل های ADC، نمایشگر LCD و… از پروتکل SPI استفاده شده‌ است. این پروتکل دارای ارتباط full-duplex بوده و میزان مصرف انرژی آن نسبت به دیگر روش ها کمتر است.

تست عملی مدار پروتکل ارتباطی SPI

حالا لازم است ارتباط بین دو بورد آردوینو را از طریق پروتکل SPI اجرا کنیم و کدنویسی آن را انجام دهیم. در تصویر زیر نحوه ایجاد ارتباط SPI بین دو برد آردوینو یونو و شماتیک پروژه را میتوانید مشاهده‌ کنید.

پروتکل ارتباطی آردوینو

پیاده‌ سازی این مدار روی برد بورد به شکل زیر خواهد بود:

پروتکل ارتباطی آردوینو

کدنویسی بخش مستر

در این پروژه از کتابخانه SPI استفاده‌ شده‌ است:

				
					#include
				
			

در بخش void setup() تنظیمات زیر را انجام دهید:  

ارتباط سریال با باودریت 115200 صورت میگیرد:

				
					Serial.begin(115200);
				
			

LED به پین 7 برد آردوینو و و کلید به پین 2 آن وصل شده‌ است. به همین خاطر باید ورودی و خروجی ها را به صورت زیر تنظیم کنید:

				
					pinMode(ipbutton,INPUT);
pinMode(LED,OUTPUT);
				
			

حالا ارتباط SPI را باید شروع کنیم:

				
					SPI.begin();
				
			

در ادامه برای ارتباط SPI لازم است Clockdivider را تنظیم کنید و آن از تقسیم کننده‌ 8 استفاده‌ کنیم:

				
					SPI.setClockDivider(SPI_CLOCK_DIV8);
				
			

سپس پین SS را HIGH مقدار دهی کنید، به این خاطر که انتقال به بورد آردوینو اسلیو شروع نشده است:

				
					digitalWrite(SS,HIGH);
				
			

تنظیمات بخش void loop()

ابتدا باید وضعیت کلید متصل به آردوینو مستر را بررسی کنیم تا در صورتی که فشرده شده بود، اطلاعات به آردوینو اسلیو ارسال گردد:

				
					buttonvalue = digitalRead(ipbutton);
				
			

یک شرط تعریف کرده ایم و بر اساس وضعیت کلید متغیر x را مقدار دهی کرده ایم:

				
					if(buttonvalue == HIGH)               
  {
    x = 1;
  }
  else
  {
    x = 0;
  }
				
			

ss مربوط به Slave select است و قبل از ارسال داده باید آن را روی Low قرار بدهیم. با دستور زیر این کار انجام میشود:

				
					digitalWrite(SS, LOW);
				
			

کد زیر را میتوان از بخش های مهم پروژه‌ دانست. در اینجا مقدار ذخیره‌ شده‌ در متغیر Mastersend را به سمت آردوینو دیگر یعنی اسلیو ارسال میکنیم. علاوه‌ بر آن مقداری که از سمت اسلیو فرستاده‌ شده‌ را دریافت میکنیم و آن را در متغیر Mastereceive ذخیره‌ میکنیم.

				
					Mastereceive=SPI.transfer(Mastersend); 
				
			

در ادامه با توجه به مقدار متغیر Mastereceive و وضعیت کلید بخش اسلیو باید LED سمت مستر روشن یا خاموش شود. با دستور زیر این کار انجام میشود:

				
					if(Mastereceive == 1)                   
  {
    digitalWrite(LED,HIGH);        //Sets pin 7 HIGH
    Serial.println("Master LED ON");
  }
  else
  {
   digitalWrite(LED,LOW);         //Sets pin 7 LOW
   Serial.println("Master LED OFF");
  }
				
			

همچنین در این پروژه از serial.println() استفاده کرده ایم و نتیجه را در سریال آردوینو نمایش داده ایم. در ادامه با کدنویسی بخش اسلیو آشنا خواهید شد.

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

کد نهایی دیوایس Master

				
					//SPI MASTER (ARDUINO)

//SPI COMMUNICATION BETWEEN TWO ARDUINO 

#include                         //Library for SPI 

#define LED 7           
#define ipbutton 2

int buttonvalue;
int x;

void setup (void)
{
  Serial.begin(115200);                   //Starts Serial Communication at Baud Rate 115200 
  pinMode(ipbutton,INPUT);                //Sets pin 2 as input 
  pinMode(LED,OUTPUT);                    //Sets pin 7 as Output
  
  SPI.begin();                            //Begins the SPI commnuication
  SPI.setClockDivider(SPI_CLOCK_DIV8);    //Sets clock for SPI communication at 8 (16/8=2Mhz)
  digitalWrite(SS,HIGH);                  // Setting SlaveSelect as HIGH (So master doesnt connnect with slave)
}

void loop(void)
{
  byte Mastersend,Mastereceive;          
  buttonvalue = digitalRead(ipbutton);   //Reads the status of the pin 2
  if(buttonvalue == HIGH)                //Logic for Setting x value (To be sent to slave) depending upon input from pin 2
  {
    x = 1;
  }
  else
  {
    x = 0;
  }
  digitalWrite(SS, LOW);                  //Starts communication with Slave connected to master
  Mastersend = x;   
  Mastereceive=SPI.transfer(Mastersend); //Send the mastersend value to slave also receives value from slave
  if(Mastereceive == 1)                   //Logic for setting the LED output depending upon value received from slave
  {
    digitalWrite(LED,HIGH);              //Sets pin 7 HIGH
    Serial.println("Master LED ON");
  }
  else
  {
   digitalWrite(LED,LOW);               //Sets pin 7 LOW
   Serial.println("Master LED OFF");
  }
  delay(1000);
}
				
			

کدنویسی بخش اسلیو

از کتابخانه SPI در این پروژه استفاده شده است:

				
					#include
				
			

کدنویسی بخش void setup() به صورت زیر است:

باودریت را روی 115200 قرار داده ایم:

				
					Serial.begin(115200);
				
			

LED به پین 7 برد آردوینو و و کلید به پین 2 آن وصل شده است. به همین خاطر باید ورودی و خروجی ها را به صورت زیر تنظیم کنید:

				
					pinMode(ipbutton,INPUT);
pinMode(LED,OUTPUT);
				
			

کد زیر بسیار مهم است:

				
					pinMode(MISO,OUTPUT);
				
			

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

سپس در ادامه‌ با مقداردهی رجیسترهای کنترل SPI این بخش را فعال کرده‌ ایم:

				
					SPCR |= _BV(SPE);
				
			

سپس وقفه را برای ارتباط SPI روشن کرده ایم. اگر دیتا از سمت مستر ارسال شده باشد، روتین وقفه فراخوانی میشود و مقدار ارسال شده از SPDR  یا (SPI data Register) خوانده میشود.

				
					SPI.attachInterrupt();
				
			

مقداری که از master و SPDR دریافت کرده ایم را در متغیر Slavereceived ذخیره میکنیم. این کار در تابع روتین وقفه و به صورت زیر انجام میشود:

				
					ISR (SPI_STC_vect)
{
  Slavereceived = SPDR;                  
  received = true;                       
}
				
			

حالا در حلقه لوپ باید LED مربوط به بورد اسلیو را با توجه مقدار ذخیره شده در Slavereceived روشن یا خاموش کنیم.

				
					  if (Slavereceived==1)
    {
     digitalWrite(LEDpin,HIGH); //Sets pin 7 as HIGH LED ON
     Serial.println("Slave LED ON");
     }
else
     {
     digitalWrite(LEDpin,LOW);     //Sets pin 7 as LOW LED OFF
     Serial.println("Slave LED OFF");
     }
				
			

سپس وضعیت کلید مربوط به آردوینو اسلیو را خوانده و آن را در متغیر Slavesend ذخیره میکنیم. در ادامه با مقدار دهی رجیستر SPDR وضعیت کلید را به آردوینو مستر ارسال میکنیم.

				
					 buttonvalue = digitalRead(buttonpin); 
  if (buttonvalue == HIGH)              
      {
        x=1;
      }
else
      {
        x=0;
      }
Slavesend=x;        
SPDR = Slavesend;
				
			

کد نهایی دیوایس Slave

				
					//SPI SLAVE (ARDUINO)

//SPI COMMUNICATION BETWEEN TWO ARDUINO 

#include
    
#define LEDpin 7
#define buttonpin 2

volatile boolean received;
volatile byte Slavereceived,Slavesend;

int buttonvalue;
int x;

void setup()
{
  Serial.begin(115200);

  pinMode(buttonpin,INPUT);               // Setting pin 2 as INPUT
  pinMode(LEDpin,OUTPUT);                 // Setting pin 7 as OUTPUT
  pinMode(MISO,OUTPUT);                   //Sets MISO as OUTPUT (Have to Send data to Master IN 

  SPCR |= _BV(SPE);                       //Turn on SPI in Slave Mode
  received = false;
  SPI.attachInterrupt();                  //Interuupt ON is set for SPI commnucation
}
ISR (SPI_STC_vect)                       //Inerrrput routine function 
{
  Slavereceived = SPDR;         // Value received from master if store in variable slavereceived
  received = true;                        //Sets received as True 
}
void loop()
{ 
  if(received)                            //Logic to SET LED ON OR OFF depending upon the value recerived from master
   {
  if (Slavereceived==1) 
      {
        digitalWrite(LEDpin,HIGH);         //Sets pin 7 as HIGH LED ON
        Serial.println("Slave LED ON");
      }else
      {
        digitalWrite(LEDpin,LOW);        //Sets pin 7 as LOW LED OFF
        Serial.println("Slave LED OFF");
      }
      buttonvalue = digitalRead(buttonpin);  // Reads the status of the pin 2
      if (buttonvalue == HIGH)               //Logic to set the value of x to send to master
      {
        x=1;
      }else
      {
        x=0;
      }
  Slavesend=x;
  SPDR = Slavesend;                           //Sends the x value to master via SPDR 
  delay(1000);
}
}
				
			

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

عملکرد پروژه به صورت زیر است:

  • زمانی که کلید مربوط به بخش مستر را فشار دهید، LED سفید رنگ بورد اسلیو روشن خواهد شد.
  • هنگامی که کلید مربوط به Slave را فشار دهید، LED قرمز رنگ بورد مستر روشن خواهد شد.

در تصویر زیر عملکرد پروژه آورده شده است:

پروتکل ارتباطی آردوینو

UART

پروتکل UART یکی از قدیمی ترین و در عین حال از مطمئن ترین پروتکل های ارتباطی سریال به شمار میرود. این پروتکل ارتباطی هنوز کاربرد گسترده در صنعت دارد (عملکرد پروتکل RS232) و با استفاده از دو پین Tx و Rx ارسال و دریافت دیتا صورت میگیرد.

زمانی که فرستنده‌ و گیرنده‌ با 5 مورد تنظیمات زیر هماهنگ شده‌ باشند، ارسال و دریافت دیتا موفقیت آمیز خواهد بود:

  • سرعت: باید مشخص کنید دیتا با چه سرعتی انتقال خواهد یافت.
  • طول داده‌: تعداد بیت های مشخص شده‌ که گیرنده‌ در رجیسترهای خود آنها را ذخیره‌ میکند.
  • بیت شروع: با استفاده‌ از یک سیگنال پایین زمان شروع ارسال داده‌ به‌ گیرنده‌ اطلاع داده‌ میشود.
  • Stop Bit: با استفاده‌ از یک سیگنال بالا زمان ارسال آخرین بیت به گیرنده‌ اطلاع داده‌ میشود. این بیت را مهمترین بیت میدانیم.
  • بیت برابری: به‌ کمک یک بیت صفر یا یک، از صحیح بودن دیتای ارسال شده مطمئن میشویم.

سرعت انتقال دیتا

از آنجایی که UART یک پروتکل ارتباطی آسنکرون است، در آن از کلاک مخصوص برای تنظیم سرعت انتقال داده‌ استفاده‌ نشده‌ است. به جای کلاک از باودریت (اغلب 9600 بیت در ثانیه) برای تنظیم زمان بندی ارسال داده‌ و بیت استفاده‌ شده‌ است.

محاسبه‌ سرعت انتقال یک بیت دیتا به صورت زیر است:

1/9600 = 104 میکروثانیه

در واقع دستگاه برای ارسال بیت بعدی لازم است 104 میکروثانیه‌ را اندازه‌ گیری و شمارش کند.

پس از اتصال دستگاه ها و ایجاد ارتباط UART بین آنها، سیگنال پیشفرض همیشه به سمت 1 افزایش می یابد. پس از تشخیص سیگنال فرکانس صفر توسط گیرنده باید 104 میکروثانیه شمارش شود. علاوه بر 104 میکروثانیه قبل از ذخیره سازی بیت ها در رجیستر 52 میکروثانیه دیگر نیز شمارش میشود.

از قبل توافق شده بود که دیتا هشت بیت باشد و پس از ذخیره‌سازی، برابری و بررسی زوج و فرد بودن داده باید آغاز شود. پس از چک کردن برابری یک بیت توقف (1) ارسال میشود و صحت دیتای ارسالی تایید میشود.

کدنویسی

در پروتکل ارتباطی UART تنها از 2 سیم استفاده‌ شده‌ و مینیمالیست بودن این پروتکل باعث شده‌ در سیم کارت ها و خودروها استفاده‌ شود. در بخش قبل با سیم کشی و عملکرد این پروتکل آشنا شدید و حالا میخواهیم آن را راه‌ اندازی کنیم.

قبل از هرچیز باودریت را تعریف کنید تا تعداد کاراکترهای قابل ارسال مشخص گردد. حالا میتوانید داده‌ های مبتنی بر کاراکتر را بخوانید و بنویسید. در کدهای زیر ابتدا باودریت را روی 9600 قرار داده‌ ایم و سپس  “Hello UART”را به کلاینت ارسال کرده‌ ایم. در ادامه کدنویسی منتظر دریافت داده‌ های ارسالی بوده‌ و آنها را در متغیر msg ذخیره‌ میکنیم.

				
					#include 
#include string msg;
bool only_once = true;void setup() {
  Serial.begin(9600);
}void loop() {
  (if only_once) {
    only_once = false;
    Serial.send("Hello Client");
  }  if (Serial.available()) {
    char c;
    while (c = Serial.read()) {
      msg += c;
    }
  }
}

				
			

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

اگر مبتدی هستید جدول زیر کمک کننده خواهد بود:

 

UART

I2C

SPI

پیچیدگی

ساده

ارتباط ساده چندین دستگاه

پیچیدگی بالا زمان افزایش تعداد دستگاه ها

سرعت

آهسته

کمی سریع

سریع ترین

تعداد دستگاه ها

تا 2 دستگاه

تا 128 دستگاه اما پیچیدگی بالا

1 مستر و 5 اسلیو

تعداد سیم ها

1

2

4

ارتباط همزمان

هزمان (فول دوبلکس)

نیمه همزمان (هالف دوبلکس)

همزمان (فول دوبلکس)

تعداد مستر و اسلیو

عدم وجود چندین مستر و اسلیو

چند مستر و اسلیو

1 مستر و چندین اسلیو

موازی (Parallel)

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

گاهی اوقات ممکن است همه پروتکل های ارتباطی برد آردوینو خود را استفاده‌ کرده‌ باشد و بازهم نیاز به انتقال دیتا وجود داشته‌ باشد. پروتکل ارتباطی موازی در اینجا کمک کننده‌ خواهد بود اما خصوصیات این پروتکل ارتباطی محدود به این مورد نیست. اگر میخواهید بردهای آردوینو خود را در مسافت های کوتاه‌ به هم متصل کنید، استفاده از پورت های ورودی/ خروجی گزینه ایده‌آلی خواهد بود.

در صورتی که لازم است برد آردوینو خود را با فاصله از هم قرار دهید، پروتکل های ارتباطی سریال گزینه بهتری است. با روش موازی میتوان چندین بیت را در یک زمان انتقال داد اما در روش سریال محدودیت بسیار زیاد است. این روش از باس دیتا، برای انتقال اطلاعات استفاده‌ میشود و اغلب 8 تا 16 پین از میکروکنترلر به این ارتباط اختصاص می یابد. در این پروتکل دیتا به صورت 0 و 1 و در حجم گسترده‌ تر انتقال داده‌ میشود.

پروتکل ارتباطی آردوینو

از مهمترین مزایای این پروتکل میتوان به سرعت بالا، سادگی بیشتر و امکان پیاده‌ سازی راحت تر اشاره‌ کرد. با این وجود نیاز به ورودی و خروجی های متعدد از معایب این پروتکل ارتباطی است. به دلیل این که در بیشتر پروژه‌ ها پین های میکروکنترلر ارزشمند هستند، اغلب سراغ پروتکل سریال میرویم. در ادامه یک نمونه کدنویسی ایجاد ارتباط بین دو آردوینو به صورت Parallel آورده‌ شده‌ است.

کدنویسی مستر

همانطور که اشاره شد، میتوانید دو برد آردوینو خود را با استفاده از روش موازی به یکدیگر وصل کنید. در نمونه کد زیر از پورت A و در ادامه پین های Rx , Tx برای این کار استفاده شده است.

				
					byte i = 0;
int intpin = 44;
int rcv_ready = 45;

void setup() {
  DDRA = B11111111; // Output
  DDRC = B11111111; // Output
  pinMode(intpin, OUTPUT);
  pinMode(rcv_ready, INPUT);
}

void loop() {
  transmit();
}

void transmit() {
  PORTA = i++;
  PORTC = i;
  digitalWrite(intpin, HIGH);
  while (rcv_ready == LOW) {}
  digitalWrite(intpin, LOW);
  
  delay(500);
}

				
			

کد بالا دو پورت DDRA و DDRC را B11111111 مقدار دهی کرده‌ ایم. پین اینتراپت را 44 تنظیم کرده‌ ایم و پین 45 را به عنوان ورودی قرار داده‌ ایم. همچنین حلقه لوپ transmit را فراخوانی کرده ایم. در این تابع پورت های A و C مقدار دهی شده اند و پس از آن سیگنال را toggle میکنیم تا ارسال پیام جدید اطلاع داده شود.

در بخش اسلیو پین ورودی این سیگنال را دریافت کرده و فرایند ذخیره سازی دیتا را آغاز میکند.

کدنویسی اسلیو

				
					byte x = 0;
byte y = 0;
int rcv_ready = 45;

void setup() {
  DDRA = B00000000; // Input
  DDRC = B00000000; // Input
  Serial.begin(19200);
  attachInterrupt(5, blink, RISING);
  pinMode(rcv_ready, OUTPUT);
  digitalWrite(rcv_ready, LOW);
}

void loop() {}

void blink() {
  x = PINA;
  y = PINC;
  delay(100);
  digitalWrite(rcv_ready, HIGH);
  delay(100);
  digitalWrite(rcv_ready, LOW);
  Serial.print(x);
  Serial.print(" , ");
  Serial.println(y);
}

				
			

برای کدنویسی بخش اسلیو پورت های DDRA و DDRC را به عنوان ورودی و از طریق B00000000 مقدار دهی کرده‌ ایم. باودریت روی 19200 تنظیم شده‌ است و این با باودریت مستر مطابقت دارد.

در این کدنویسی وقفه روی 5 قرار گرفته که مربوط به پین 18 است و در یک وقفه چمشک (تابع Blink) خواهد زد. سپس ادامه مقادیر پورت A و C را میخوانیم و مقادیر خوانده شده را روی سریال آردوینو نمایش میدهیم. تایید دریافت صحیح دیتا از طریق پین 45 به آردوینو مستر اطلاع داده‌ میشود. 

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

اشتراک گذاری این نوشته

شاید این مطالب براتون جذاب باشه!

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

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

تماس با ما

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید

ورود به حساب کاربری