تمامی ارتباطهای سریال از جمله 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 و مقدار تبدیل شده در سطر دوم نمایش داده میشود.
قطعات مورد نیاز پروژه
- برد آردوینو UNO
- برد آردوینو NANO
- ماژول MAX485
- نمایشگر Lcd 2*16
- پتانسیومتر
- led
- کابل فلت
- کابل دو رشته بهم تابیده شده
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام
حداکثر تا چه مسافتی می توان از این پروتکل استفاده کرد ؟
باسلام
درصورتی که جنس سیم مناسب باشد ، با کاهش باودریت میتوانید تا ۱٫۲ کیلومتر از این مدار استفاده نمایید.
سپاسگزارم …
با تشکر از توجه شما
واقعا ممنون عالی بود.کمتر سایتی رو مثل سایت شما .میشه پیدا کرد که مطالب رو روان انقال بدن و از پرت و پلاگویی کم کنن.
من یک سوالی داشتم راهنمایی بفرمایید.اگربخواهیم تعدادی حدود ۳۰ عدد شیفت رجیستر ۷۴۵۹۵ رو با RS485 در یک سطر ولی با مسافت مثلا ۴ متر از هم متصل کنیم وداده ها رو سریال بدیم و مواری دریافت کنیم.باید به چه شکل کار کنیم.ایا به صورت سیگنال های TTL )0,5)شدنیه؟ ون
از کمکتون ممنونم.
با سلام از توجه شما سپاس گزارم
برای این مورد بایستی دیتاشیت هردو ایسی های MAX-485 و ۷۴hc595 بررسی شود.
سلام توضیحات بسیار جامع است. لطفا از سری آموزش هایی که تحلیلی است بیشتر منتشر کنید تا یاد بگیریم.
با سلام از توجه شما سپاس گزارم
حتما برای آموزش بعدی در نظر خواهیم داشت.
سلام اگه بخوای سه تا پتانسیومتر وصل کنی به آردوینو مستر از اون طرف سه تا ال ای دی نورشو کم زیاد کنی بدون نویز باید چیکار کرد ؟
با سلام
برای این کار بایستی مقادیر سه پتاسیومتر را بصورت یک رشته با قالب مشخص از طریق سریال ارسال نمایید. برای مثال:
sprintf(buffer,”%03d,%03d,%03d”,pot1,pot2,pot3);
سپس این رشته را داخل فرستنده ارسال نمایید و داخل گرنده بصورت تک تک کارکتر هارا دریافت کرده و به int تبدیل کنید.
سلام اگه بخوام چند تا سنسور رو از طریق ماژول rs485 رو با یه میکرو ارتباط بدم،باید چکار کنم؟ ماژول ها با هم موازی میشن؟ میشه در مورد پینها راهتمایی کنید؟
با سلام
خیر برای هر ماژول بایستی یک ماژول max485 استفاده شود. سیم های A و B همه ی ماژول ها با یک دیگر موازی میشود.
digitalWrite(enablePin, High); //(always high as Master Write data to Slave) ارور میده موقع کامپایل!!!!
با سلام
کد را به صورت کامل کپی کردید؟
سلام ممنون از مثال خوبتون توی شبکه مد باس id و بیت خطا هم باید در نظر گرفته بشه در مثال شما این موضوع وجود نداره .اگر بخواهیم یک شبکه با تعداد بیش از یک slave داشته باشیم که توسط یک master کنترل میشن چی کار باید کرد ؟؟؟؟؟و اینکه در این مثال شما از چه پورتکل ارتباطی روی شبکه rs485 استفاده شده .modbus.asciiیا ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
با سلام
این آموزش صرفا برای راه اندازی این پروتکل بین ۲ برد آردوینو نوشته شده است. سعی میکنم در آموزش های جدید مواردی که فرمودین را توضیح دهم.
سلام ممنون از مطلب خوبتون
ی سوال اینکه چطور میشه از این پروتکل استفاده کرد که فقط یک مستر نداشته باشیم. مثلا چندین تجهیز بتونن با همدیگه ارتباط بگیرند و تجهیز مستر وجود نداشته باشه.
مثال عملی اش هم میشه همین سیستم های برق هوشمند ساختمانی که هر کدوم از تجهیزات میتونه با یکی دیگه ارتباط بگیره. هم ارسال و هم دریافت
تشکر
با سلام
برای اطلاع از این موضوع بایستی درباره مد های کاری مختلف این پروتکل مطالعه کنید. شاید در مد مشخصی این مورد امکان پذیر باشد.