اگرچه برای اکثر پروژهها، آردوینو یونو یا آردوینو مگا برای طراحی پروژههای سطح پیشرفته مانند ماشینهای CNC، چاپگرهای سه بعدی و غیره کافی است. شرایطی پیش میآید که تنها آردوینو یونو یا آردوینو مگا یا هر برد آردوینو دیگری برای طراحی کافی نیست. پروژه خود را به مرحله تکمیلی برسانید، سپس در وضعیتی این چنینی میتوانید چندین برد آردوینو را به صورت سریال متصل کنید.
پس از خواندن این مقاله، نحوه استفاده از توابع مختلف برای اتصال دو آردوینو را خواهید آموخت. ما در این مقاله از جم ترونیک با اصول اولیه شروع می کنیم و بعد از اینکه مفهوم اولیه ارتباط سریال را آموختید، آن را به سطح بعدی میآوریم و کارهای سطح پیشرفته مثل اتصال دو آردوینو را انجام میدهیم.
پروتکل Inter-Integrated Circuit یک پروتکل ارتباطی است که آنرا با نامهای دیگری مانند IIC و I2C و… نیز نمایش میدهند. این پروتکل به طور گسترده در میکروکنترلرها کاربرد دارد. در این ارتباط Master ها و Slave ها از طریق دو سیم با هم در ارتباط هستند:
در پروتکل I2C دو نوع تجهیز برای اتصال دو آردوینو به باس I2C وجود دارد: Master و Slave. در این ارتباط هم میتوان چند Slave متفاوت را به یک عدد Master مانند یک میکروکنترلر متصل کرد و هم میتوان یک Slave را از طریق چند Master مختلف کنترل و مانیتور نمود اما در هر لحظه فقط یک Master میتواند فعال باشد.
هر Master میتواند انتخاب کند که با کدام یک از Slave ها میخواهد ارتباط برقرار کند. اتصال دو آردوینو از طریق آدرسهای 7 بیتی Slave ها (در بعضی موارد 10 بیت) مشخص میشود. پس تقریبا میتوان حدود 128 عدد تجهیز Slave را به باس I2C متصل کرد. بنابراین هر Slave آدرس مخصوص خود را دارد و در ضمن آدرسی برای Master ها اختصاص داده نشده است.
قبل از ورود به بحث چگونگی برقراری ارتباط I2C بین دو بورد Arduino، لازم است که اول کتابخانههای مربوط به wire را در IDE بررسی کنیم. کتابخانهی wire.h که در کد استفاده میکنیم، برای استفاده از توابعی است که در ادامه میآیند.
(Wire.begin(address:
کاربرد: استفاده برای ایجاد ارتباط میان دیوایسهای درگیر در ارتباط I2C. به این ترتیب دیوایس مورد نظر که آدرس آن مشخص میشود، برای پیوستن به I2C Bus مقداردهی اولیه خواهد شد.
آرگومان این تابع یک آدرس ۷ بیتی است که همانطور که گفتیم مشخص کنندهی Slaveهاست. چنانچه در فیلد آدرس چیزی ننویسیم، دیوایس مربوط به عنوان Master به باس ارتباط سریال ملحق خواهد شد.
()Wire.read:
کاربرد: برای خواندن بایت دریافت شده از سوی Master یا یکی از Slaveها. اگر داده از سوی slave به master ارسال شده باشد، قبل از این دستور، تابع ()requestFrom وجود دارد.
()Wire.write:
کاربرد: برای نوشتن داده در Master و یا Slave؛ اگر Slave بخواهد در Master چیزی بنویسد، تابع ()Wire.RequestFrom در Master فراخوانی شده است. اگر Master بخواهد در Slave چیزی بنویسد، ابتدا تابع ()Wire.beginTransmission فراخوانی میشود، سپس تابع ()Wire.write و پس از آن ()Wire.endTransmission خود تابع ()Wire.write میتواند به صورتهای زیر نوشته شود. (Wire.write(value: مقدار value همان بایتی است که قرار است نوشته شود. (Wire.write(string: رشتهای از بایتهای متوالی که ارسال و نوشته میشوند. (Wire.write(data, length: آرایهای از دادهها به صورت بایت به بایت و length تعداد این بایتها را مشخص میکند.
(Wire.beginTransmission(address:
کاربرد: این تابع ارتباط I2C با Slave که برای اتصال دو آردوینو، آدرس آن مشخص شده است را آغاز خواهد کرد.
پس از آغاز ارتباط دیتایی که قرار است مبادله شود در صف ارسال قرار میگیرد و تابع ()write مورد استفاده قرار خواهد گرفت. در انتهای تبادل نیز تابع ()endTransmission فراخوانی خواهد شد. آدرس نیز همانطور که قبلتر هم گفتیم یک آدرس ۷ بیتی است.
()Wire.endTransmission:
کاربرد: این تابع ارتباطی را که قبلتر توسط ()beginTransmission شروع شده است را خاتمه خواهد داد.
()Wire.onRequest:
کاربرد: کاربرد این تابع در اتصال دو آردوینو زمانی است که Master بخواهد از یکی از Slaveها با استفاده از تابع ()Wire.requestFrom درخواست داده کند. Slave مذکور با استفاده از تابع ()Wire.write داده را ارسال خواهد نمود.
()Wire.onReceive:
کاربرد در اتصال دو آردوینو: زمانی که Slave از Master داده دریافت کرده باشد، فراخوانی میشود. برای خواندن دادهی دریافتی نیز از تابع ()Wire.read استفاده میشود.
(Wire.requestFrom(address,quantity:
این تابع در Master و برای گرفتن داده از یک Slave استفاده میشود. پس از دریافت دادهی مورد نظر با استفاده از تابع ()Wire.read خوانده خواهد شد. آدرس همان آدرس ۷ بیتی Slave مورد خطاب است و quantity تعداد بایتهای مورد درخواست است.
برای درک هرچه بهتر اتصال دو آردوینو با استفاده از هر 2 بخش Master و Slave، کافی است که این کد را در پروژه خود اجرا کنید:
Master Arduino Programming //I2C MASTER CODE //I2C Communication between Two Arduino //Circuit Digest //Pramoth.T #include<Wire.h> //Library for I2C Communication functions #include<LiquidCrystal.h> //Library for LCD display function LiquidCrystal lcd(2, 7, 8, 9, 10, 11); //Define LCD Module Pins (RS,EN,D4,D5,D6,D7) void setup() { lcd.begin(16,2); //Initilize LCD display lcd.setCursor(0,0); //Sets Cursor at first line of Display lcd.print("Circuit Digest"); //Prints CIRCUIT DIGEST in LCD lcd.setCursor(0,1); //Sets Cursor at second line of Display lcd.print("I2C 2 ARDUINO"); //Prints I2C ARDUINO in LCD delay(5000); //Delay for 5 seconds lcd.clear(); //Clears LCD display Serial.begin(9600); //Begins Serial Communication at 9600 baud rate Wire.begin(); //Begins I2C communication at pin (A4,A5) } void loop() { Wire.requestFrom(8,1); // request 1 byte from slave arduino (8) byte MasterReceive = Wire.read(); // receive a byte from the slave arduino and store in MasterReceive int potvalue = analogRead(A0); // Reads analog value from POT (0-5V) byte MasterSend = map(potvalue,0,1023,0,127); //Convert digital value (0 to 1023) to (0 to 127) Wire.beginTransmission(8); // start transmit to slave arduino (8) Wire.write(MasterSend); // sends one byte converted POT value to slave Wire.endTransmission(); // stop transmitting lcd.setCursor(0,0); //Sets Currsor at line one of LCD lcd.print(">> Master <<"); //Prints >> Master << at LCD lcd.setCursor(0,1); //Sets Cursor at line two of LCD lcd.print("SlaveVal:"); //Prints SlaveVal: in LCD lcd.print(MasterReceive); //Prints MasterReceive in LCD received from Slave Serial.println("Master Received From Slave"); //Prints in Serial Monitor Serial.println(MasterReceive); delay(500); lcd.clear(); } Slave Arduino Programming //I2C SLAVE CODE //I2C Communication between Two Arduino //CircuitDigest //Pramoth.T #include<Wire.h> //Library for I2C Communication functions #include<LiquidCrystal.h> //Library for LCD display function LiquidCrystal lcd(2, 7, 8, 9, 10, 11); //Define LCD Module Pins (RS,EN,D4,D5,D6,D7) byte SlaveReceived = 0; void setup() { lcd.begin(16,2); //Initilize LCD display lcd.setCursor(0,0); //Sets Cursor at first line of Display lcd.print("Circuit Digest"); //Prints CIRCUIT DIGEST in LCD lcd.setCursor(0,1); //Sets Cursor at second line of Display lcd.print("I2C 2 ARDUINO"); //Prints I2C ARDUINO in LCD delay(5000); //Delay for 5 seconds lcd.clear(); //Clears LCD display Serial.begin(9600); //Begins Serial Communication at 9600 baud rate Wire.begin(8); //Begins I2C communication with Slave Address as 8 at pin (A4,A5) Wire.onReceive(receiveEvent); //Function call when Slave receives value from master Wire.onRequest(requestEvent); //Function call when Master request value from Slave } void loop(void) { lcd.setCursor(0,0); //Sets Currsor at line one of LCD lcd.print(">> Slave <<"); //Prints >> Slave << at LCD lcd.setCursor(0,1); //Sets Cursor at line two of LCD lcd.print("MasterVal:"); //Prints MasterVal: in LCD lcd.print(SlaveReceived); //Prints SlaveReceived value in LCD received from Master Serial.println("Slave Received From Master:"); //Prints in Serial Monitor Serial.println(SlaveReceived); delay(500); lcd.clear(); } void receiveEvent (int howMany) //This Function is called when Slave receives value from master { SlaveReceived = Wire.read(); //Used to read value received from master and store in variable SlaveReceived } void requestEvent() //This Function is called when Master wants value from slave { int potvalue = analogRead(A0); // Reads analog value from POT (0-5V) byte SlaveSend = map(potvalue,0,1023,0,127); // Convert potvalue digital value (0 to 1023) to (0 to 127) Wire.write(SlaveSend); // sends one byte converted POT value to master }
آردوینو، یک قطعه الکترونیکی تکبردی است که معمولاً برای هدایت سنسورها و تغییر اندازه در موتورها و سایر گجتهای مورد استفاده قرار میگیرد. امکان اتصال دو آردوینو با استفاده از پروتکل I2C امکان و اجرای چندین کد اختصاصی امکانپذیر است. در این مقاله به نحوه اتصال دو آردوینو پرداختیم و انواع قطعات مورد نیاز برای این کار را معرفی کردیم.
شما میتوانید با استفاده از خدمات و قابلیتهای فروشگاه آنلاین جم ترونیک تمامی قطعات و بردهای مورد نیاز آردوینو را خریداری کنید. ضمناً وبلاگ جم ترونیک، امکان آموزش آنلاین و ساده تمامی پروژههای مبتنی بر گجتهای الکترونیکی را در اختیار علاقهمندان قرار داده است.