آردوینو آردوینو Arduino Uno اینترنت اشیا IOT نمایشگر LCD پروژه های آردوینو

ارتباط بین چند برد آردوینو در فواصل طولانی با پروتکل RS485

RS485-protocol-with-arduino-and-lcd-digispark
نوشته شده توسط علی زاهدی

تمامی ارتباط‌های سریال از جمله RS485 ,RS232 و… زیر شاخه‌هایی از استاندارد EIA/TIA هستند. که توسط مجمع EIA در سال ۲۰۱۱ لغو شد. در این استاندارد پارامترهایی مانند: طول کابل، جنس کابل، نحوه‌ی اتصال وسایل بهم دیگر، سرعت انتقال اطلاعات و نحوه‌ی ارسال آن درنظر گرفته شده است. بر اساس آن استاندارد TIA به چهار ارتباط RS232, RS422, RS432, RS485 تقسیم می‌شود. در این آموزش قصد داریم تا با استفاده از دو عدد ماژول Max485 ارتباط یک طرفه با پروتکل RS485 در فواصل طولانی بین دو برد آردوینو را برقرار کنیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 

 


ارتباط سریال RS485


پورت‌های موازی در میکروکنترلرهای AVR توانایی انتقال ۸ بیت دیتا در هر لحظه را دارند. انتقال اطلاعات توسط این پورت‌ها به دلیل اینکه در فواصل طولانی دچار نویز زیادی می‌شود. قابلیت اطمینان کمی دارد. پورت سریال توانایی انتقال یک بیت دیتا در هر لحظه را دارد. در این پورت دیتاها بصورت دنبال هم ارسال و دریافت می‌شوند. درچنین حالتی یک بایت از اطلاعات بصورت هشت بیت یکی پس از دیگری ارسال می‌شود. نحوه ارسال هشت بیت به این صورت می باشد که قبل از ارسال هر بایت دیتا، پورت سریال ابتدا یک بایت “Start” ارسال می‌کند، که این بایت صرفاٌ یک بیت با مقدار صفر می‌باشد. پس از ارسال هر بایت دیتا، پورت سریال یک بایت “Stop” ارسال می‌کند و این به معنای خاتمه ارسال دیتا است. برای کنترل خطا ممکن است، از یک بیت اضافه به نام parity نیز استفاده شود. پروتکل RS485 این قابلیت را دارد که بصورت شبکه به یکدیگر متصل شوند. برای درک بیشتر این موضوع به تصویر زیر توجه فرمایید.

 

 


اتصالات پروژه RS485


در این آموزش برای ارتباط با استفاده از پروتکل RS485 برد آردوینو UNO بعنوان Master و برد آردوینو NANO بعنوان Slave تعریف شده‌اند. برای راه اندازی کافیست اتصالات را مانند نقشه شماتیک زیر برقرار کنید. پین های DE و RE در هر دو ماژول به یکدیگر متصل شده‌اند. و همچنین توجه داشته باشد که سیمی که به پایه های A و B ماژول ها وصل می‌شود، بایستی سیم بهم تایده شده باشد.

 

 


کدنویسی پروژه پروتکل RS485


پس از بستن اتصالات بصورت صحیح ابتدا کد زیر را کپی کرده و داخل نرم افزار آردوینو Paste کنید. سپس بر روی برد آردوینو UNO انتقال دهید.

//Master Code (Arduino UNO)
//Serial Communication Between Arduino using RS-485

int enablePin = 8;
int pushval = A0;
int potval= 0;
void setup()
 {
    Serial.begin(9600);  //initialize serial at baudrate 9600:
    pinMode(enablePin, OUTPUT);
    pinMode(pushval, INPUT);
    delay(10);
    digitalWrite(enablePin, High);  //(always high as Master Write data to Slave)
 } 
void loop()
 {
    potval = analogRead(pushval);
    Serial.println(potval);  //Serial Write POTval to RS-485 Bus
    delay(100);
 }

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

//SLAVE CODE (Aeduino NANO)
//Serial Communication Between Two Arduinos using RS-485

#include <LiquidCrystal.h>  //Include LCD library for using LCD display functions

int enablePin = 8;
int ledPin = 10;

LiquidCrystal lcd(2,3,4,5,6,7);  //Define LCD display pins RS,E,D4,D5,D6,D7

void setup()
{
	lcd.begin(16,2);
	lcd.print("DigiSpark");
	lcd.setCursor(0,1);
	lcd.print("RS485 ARDUINO");
	delay(3000);
	lcd.clear();
	Serial.begin(9600);  //initialize serial at baudrate 9600
	pinMode(ledPin,OUTPUT);
	pinMode(enablePin,OUTPUT);
	delay(10);
	digitalWrite(enablePin,LOW);  //(Pin 8 always LOW to receive value from Master)
}

void loop()
{
	while(Serial.availabe())  //While have data at Serial port this loop executes
	{
		lcd.clear();
		int pwmval = Serial.parseInt();  //Receive INTEGER value from Master throught RS-485
		int convert = map(pwmval,0,1023,0,255);  //Map those value from (0-1023) t (0-255)
		atalogWrite(ledPin,convert);  //PWM write to LED
		lcd.setCursor(0,0);
		lcd.print("PWM FROM MASTER");
		lcd.setCursor(0,1);
		lcd.print(convert);  //Displays the PWM value
		delay(100); 	
	}
}

 


تحلیل کد پروژه


تحلیل کد RS485 Master

در کد مربوط به برد آردوینو (UNO (Masterابتدا متغیری بنام enablePin تعریف شده است که مقدار آن برابر ۸ می‌باشد، این متغیر مربوط به پایه DE و RE ماژول MAX485 می‌باشد، زمانی که این پایه HIGH باشد ماژول در حالت فرستنده قرار دارد و زمانی که پایه LOW باشد ماژول درحالت گیرنده قرار می‌گیرد. سپس متغیر هایی برای خواندن مقدار پتانسیومتر تعریف شده است. در تابع setup ابتدا پورت سریال آردوینو با باودریت ۹۶۰۰ فعال شده است. سپس پایه شماره ۸ آردوینو بعنوان خروجی و پایه A0 بعنوان ورودی تعریف شده است. سپس ماژول MAX485 را در حالت فرستنده قرار داده می‌شود. در تابع loop هر ۱۰۰ میلی ثانیه مقدار پتانسیومتر خوانده میشود و از طریق Usart ارسال میگردد.

تحلیل کد RS485 Slave

در کد مربوط به برد (NANO (Slave ابتدا کتابخانه مربوط به LCD کاراکتری به کد اضافه میگردد و سپس همانند Master متغیری با نام enablePin تعریف شده است. متغیری برای تعریف خروجی LED تعریف می‌شود. در ادامه پایه های LCD به آنها متصل است همانند ترتیب نامبرده شده داخل تابع مربوطه قرار داده می‌شود. داخل تابع setup ابتدا مقدار دهی اولیه LCD انجام شده سپس یه مدت ۳ ثانیه در سطر اول عبارت “DigiSpark” و در سطر دوم عبارت “RS485 ARDUINO” نمایش داده می‌شود. پس از آن پورت سریال با باودریت ۹۶۰۰ شروع به کار می‌کند. سپس پایه های شماره ۸ و ۱۰ آردوینو بعنوان خروجی تعریف می‌شود. در تابع loop با هر بار دریافت از پورت سریال ابتدا مقدار دریافت شده بصورت عدد صحیح داخل متغیر pwmval ذخیره می‌شود. بع دلیل این که مبدل آنالوگ به دیجیتال برد آردینو ۱۰ بیتی میباشد مقدار دریافتی بین ۰ تا ۱۰۲۳ می‌باشد، اما برای انتقال این مقدار به خروجی بایستی مقدار دریافت شده به عدد ۸ بیتی تبدیل شود. با استفاده از دستور زیر مقدار ۰ تا ۱۰۲۳ را به ۰ تا ۲۵۵ تبدیل می‌کنیم.

int convert = map(pwmval,0,1023,0,255); //Map those value from (0-1023) t (0-255)

در ادامه مقدار تبدیل شده بصورت آنالوگ بر روی خروجی قرار می‌گیرد. سپس عبارت “PWM FROM MASTER” در سطر اول LCD و مقدار تبدیل شده در سطر دوم نمایش داده می‌شود.

 

 


قطعات مورد نیاز پروژه


  1. برد آردوینو UNO
  2. برد آردوینو NANO
  3. ماژول MAX485
  4. نمایشگر Lcd 2*16
  5. پتانسیومتر
  6. led
  7. کابل فلت
  8. کابل دو رشته بهم تابیده شده

 

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

 

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

 

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

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

۱۷ دیدگاه

  • واقعا ممنون عالی بود.کمتر سایتی رو مثل سایت شما .میشه پیدا کرد که مطالب رو روان انقال بدن و از پرت و پلاگویی کم کنن.
    من یک سوالی داشتم راهنمایی بفرمایید.اگربخواهیم تعدادی حدود ۳۰ عدد شیفت رجیستر ۷۴۵۹۵ رو با RS485 در یک سطر ولی با مسافت مثلا ۴ متر از هم متصل کنیم وداده ها رو سریال بدیم و مواری دریافت کنیم.باید به چه شکل کار کنیم.ایا به صورت سیگنال های TTL )0,5)شدنیه؟ ون
    از کمکتون ممنونم.

    • با سلام از توجه شما سپاس گزارم
      برای این مورد بایستی دیتاشیت هردو ایسی های MAX-485 و ۷۴hc595 بررسی شود.

  • سلام توضیحات بسیار جامع است. لطفا از سری آموزش هایی که تحلیلی است بیشتر منتشر کنید تا یاد بگیریم.

  • سلام اگه بخوای سه تا پتانسیومتر وصل کنی به آردوینو مستر از اون طرف سه تا ال ای دی نورشو کم زیاد کنی بدون نویز باید چیکار کرد ؟

    • با سلام
      برای این کار بایستی مقادیر سه پتاسیومتر را بصورت یک رشته با قالب مشخص از طریق سریال ارسال نمایید. برای مثال:
      sprintf(buffer,”%03d,%03d,%03d”,pot1,pot2,pot3);
      سپس این رشته را داخل فرستنده ارسال نمایید و داخل گرنده بصورت تک تک کارکتر هارا دریافت کرده و به int تبدیل کنید.

  • سلام اگه بخوام چند تا سنسور رو از طریق ماژول rs485 رو با یه میکرو ارتباط بدم،باید چکار کنم؟ ماژول ها با هم موازی میشن؟ میشه در مورد پینها راهتمایی کنید؟

    • با سلام
      خیر برای هر ماژول بایستی یک ماژول max485 استفاده شود. سیم های A و B همه ی ماژول ها با یک دیگر موازی می‌شود.

  • سلام ممنون از مثال خوبتون توی شبکه مد باس id و بیت خطا هم باید در نظر گرفته بشه در مثال شما این موضوع وجود نداره .اگر بخواهیم یک شبکه با تعداد بیش از یک slave داشته باشیم که توسط یک master کنترل میشن چی کار باید کرد ؟؟؟؟؟و اینکه در این مثال شما از چه پورتکل ارتباطی روی شبکه rs485 استفاده شده .modbus.asciiیا ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

    • با سلام
      این آموزش صرفا برای راه اندازی این پروتکل بین ۲ برد آردوینو نوشته شده است. سعی میکنم در آموزش های جدید مواردی که فرمودین را توضیح دهم.

  • سلام ممنون از مطلب خوبتون
    ی سوال اینکه چطور میشه از این پروتکل استفاده کرد که فقط یک مستر نداشته باشیم. مثلا چندین تجهیز بتونن با همدیگه ارتباط بگیرند و تجهیز مستر وجود نداشته باشه.
    مثال عملی اش هم میشه همین سیستم های برق هوشمند ساختمانی که هر کدوم از تجهیزات میتونه با یکی دیگه ارتباط بگیره. هم ارسال و هم دریافت
    تشکر

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