کتابخانه Wire.h به شما امکان برقراری ارتباط با دستگاه های I2C / TWI را می دهد. در برد های آردوینو، SDA (data line) و SCL (clock line) در هدرهای پین نزدیک به پین AREF قرار دارند. Arduino Due دارای دو رابط I2C / TWI SDA1 و SCL1 نزدیک پین AREF است و دیگری رابط مربوط به پایه های ۲۰ و ۲۱ است. همانطور که ذکر شد هر برد آردوینو دارای پین های مربوط به i2c است که با استفاده از این کتابخانه قادر خواهیم بود، دیوایس هایی با رابط i2c را آدرس دهی و راهاندازی کنیم. I2C یک رابط دو سیمه با استفاده از پین های SDA و SCL برای برقراری ارتباط از طریق رابط سریال است. I2C از یک مدل چند Master، چند Slave استفاده می کند. I2C یک رابط مشترک بین میکروکنترلر و تجهیزات جانبی مانند سنسورها و نمایشگرها است. I2C در LCD های سگمنتی و انواع مختلف سنسورها رایج است. سرعت I2C نسبت به پروتکل های دیگر کمتر است اما هنوز در برقراری ارتباط با چندین ماژول در یک رابط بسیار موثر است. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
نصب کتابخانه Wire.h
کتابخانه Wire.h از کتابخانه های پیشفرض و بیسیک آردوینو است و با نصب نرمافزار Arduino IDE در دسترس و قابل فراخوانی در کد شما خواهد بود. در ادامه برای دانلود نرمافزار Arduino IDE از لینک استفاده کنید و نسخه متناسب با OS خود را از سایت رسمی دانلود کنید. همچنین در صورت نیاز میتوانید با استفاده از این لینک به repository آنلاین این کتابخانه در Github دسترسی داشته باشید.
اتصالات در برد های مختلف
یک گذرگاه I2C به دو پین برای برقراری ارتباط نیاز دارد، SCL برای سیگنال ساعت و SDA برای داده ها. از آنجا که آردوینوهای قدیمی اتصالات جداگانه ای برای این دو خط ندارند، از خط A4 و A5 در این برد ها استفاده می شود، در جدول زیر تعدادی از این نمونه را مشاهده میکنید.
Uno, Ethernet |
A4 (SDA), A5 (SCL) |
Mega2560 |
۲۰ (SDA), 21 (SCL) |
Leonardo |
۲ (SDA), 3 (SCL) |
Due |
۲۰ (SDA), 21 (SCL), SDA1, SCL1 |
فراخوانی کتابخانه
کتابخانه Wire از یک بافر ۳۲ بایت استفاده می کند، بنابراین هر گونه ارتباط باید در این محدوده باشد. برای استفاده از قبلیت های این کتابخانه ابتدا باید کتابخانه را در کد خود قبل بخش Setup مانند دیگر کتابخانه ها فراخوانی کنید. این کتابخانه در ادیتور ها و همچنین Arduino IDE با نمام Wire.h شناسایی میشود. با استفاده در include قادر به فراخوانی کتابخانه خواهیم بود.
#include <Wire.h>
معرفی ساختمان کتابخانه
این کتابخانه دارای تعداد توابع محدودی است اما همین تعداد محدود برای برقراری ارتباط I2c با دستگاه ها و ماژول های هدف کافی است و در سریع ترین زمان ممکن ارتباط I2c را برای ما برقرار میکند. این کتابخانه دارای توابع زیر است.
• begin()
• requestFrom()
• beginTransmission()
• endTransmission()
• write()
• available()
• read()
• onReceive()
• onRequest()
شما نه تنها می توانید ماژول های دارای I2C، بلکه چندین آردوینو را به گذرگاه I2C متصل کنید. هر دستگاهی که به bus متصل است آدرس خاص خود را دارد. از آنجا که هر آدرس ۷ بیتی است، حداکثر ۱۱۲ دستگاه می توانند به یک گذرگاه I2C متصل شوند البته ۱۶ آدرس از ۱۲۸ آدرس ممکن توسط سخت افزار رزرو شده باشند.
مستندات عملکرد اعضا
- ;()begin
این تابع باعث شروع کار کتابخانه Wire است و ماژول مدنظر را به عنوان Master یا Slave به باس I2C اضافه میکند. به طور معمول فقط یک بار باید این تابع فراخوانی شود.
Wire.begin();
- ;()requestFrom
توسط Master برای درخواست Bytes از دستگاه Slave استفاده می شود. سپس می توان بایت ها را با توابع ;()available و ;()read دریافت کرد. اگر مقدار false باشد، ()requestFrom پس از درخواست، پیام راه اندازی مجدد را ارسال می کند. این امر از درخواست دیوایس اصلی دیگر بین پیام ها جلوگیری می کند. این امکان را برای یک دستگاه اصلی فراهم می کند تا هنگام کنترل، چندین درخواست ارسال کند.
Wire.requestFrom(2, 6);
- ;()beginTransmission
این تابع انتقال داده را به دستگاه Slave I2C شروع میکند. همچنین در انتها باید این تابع را پایان دادن فراخوانی کنیم. ;()endTransmission.
;()Wire.beginTransmission
- ;()endTransmission
پس از فراخوانی تابع ;()Wire.beginTransmission برای پایان دادن به روند کار این تابع، از تابع معرفی شده استفاده میکنیم.
Wire.endTransmission(); ;Wire.endTransmission(stop)
- ;()write
با استفاده از این تابع داده ها را از دستگاه Slave در پاسخ به درخواست Master ذخیره میکند، یا bytes را برای انتقال از Msater به Slave در صف قرار می دهد، این موارد در میان call های ()Transmission و ()endTransmission، کد پایین یک نمونه از عملکرد این تابع است.
#include <Wire.h> byte val = ۰; void setup() { Wire.begin(); } void loop() { Wire.beginTransmission(44); Wire.write(val); Wire.endTransmission(); val++; if(val == ۶۴) { val = ۰; } delay(500); }
- ;()available
تعداد بایت های موجود برای بازیابی را با ;()read برمی گرداند. این تابع را باید بعد از فراخوانی یک Master برای درخواست ()From یا در Slave با هندلر ()onReceive فراخوانی کنید.
;()Wire.available
- ;()read
یک بایت را که از دستگاه Slave به Master منتقل شده است می خواند پس از استفاده از تابع ()requestFrom.
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Wire.requestFrom(2, 6); while(Wire.available()) { char c = Wire.read(); Serial.print(c); } delay(500); }
- ;()setClock
این عملکرد فرکانس ساعت را برای ارتباطات I2C تنظیم می کند. دستگاه های Salve I2C حداقل فرکانس ساعت کاری ندارند، با این وجود ۱۰۰KHz معمولا خط پایه این موارد است.
;Wire.setClock(100000y)
قطعات سازگار با کتابخانه
با استفاده از این کتاخانه قادر خواهید بود در تمام برد های پشتیبانی شده توسط Arduino IDE رابط I2c را راهاندازی کنید، و با تمام ماژول هایی که از این رابط برای برقراری ارتباط با MCU استفاده میکنند پروژه خود راهاندازی کنید.
جمع بندی
ارتباطات از طریق I2C پیچیده تر از رابط های UART یا SPI است. ارسال سیگنال باید از پروتکل خاصی برای دستگاه های موجود در bus تبعیت کند تا آن را به عنوان ارتباطات معتبر I2C تشخیص دهد. خوشبختانه، اکثر دستگاه ها از تمام جزئیات دقیق شما مراقبت می کنند و به شما این امکان را می دهند تا بر داده هایی که می خواهید مبادله کنید تمرکز کنید. و این کتابخانه به ما این امکان را داد تا بتوانیم در سریع ترین زمان ممکن این ارتباط را برقرار کنیم، همچنین با استفاده از توابع کاربردی این ارتباط را در جزئیات کنترل کنیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام
من از ماژول pcf8591 استفاده می کنم قسمتی از برنامه شامل wire.h میشود که باید آنرا include کنم ولی VS error میدهد و میگوید که نمی تواند Wire.h را باز کند.
با سلام، پیشنهاد میکنم برای راهاندازی اولیه ماژول از کد های پیشفرض و موجود مخصوص ماژول بدون تغییر استفاده کنید. این مشکلتون ممکنه از ورژن کتابخانه یا وجود دو فایل از کتابخانه با ورژن های متفاوت باشه.
با سلام بنده از برد oled ssd1306 با اردینو استفاده میکنم هنگام آپلود خطای wire.h میدهد نصب کردم از خود اردینو ولی باز ارور میدهد از کجا wire را به کتابخانه اضافه کنم ممنون
با سلام
متن ارور را ارسال کنید تا بررسی شود.
با سلام ببخشید کتابخانه wire.h را از برنامه اردینو جستجو میکنم برای oled ssd ولی این کتابخانه نیست به چیز مشابه میاره ، ابن کتابخانه را چطوری نصب کنم بعدش oled را راه اندازی میکنم ارور میده که این کتابخانه wire .h نیست ممنون
با سلام
کتابخانه wire به صورت پیشفرض نصب است و نیازی به نصب ندارد. ارور را ارسال کنید تا بررسی کنیم. روش رفع عیب را اشتباها دنبال میکنید.
سلام با تشکر
واسه من ارور exit status1 رو میده .
با سلام
کاربر گرامی ارور کامل را ارسال کنید تا بررسی شود.