در آموزش قبل، ارتباط رابطهای I2C و SPI بین دو برد آردوینو را یاد گرفتیم. در این آموزش قصد داریم بجای یکی از بردهای آردوینو از یک برد Blue Pill به نام STM32F103C8 استفاده کنیم و این برد را با استفاده از پروتکل رابط I2C به یک برد آردوینو متصل کنیم.
برد STM32 نسبت به یک برد آردوینو امکانات بیشتری دارد. پس خوب است تا نحوه ارتباط بین دو برد STM32 و آردوینو با استفاده از دو رابط SPI و I2C را یاد بگیریم. در این آموزش برقراری ارتباط با استفاده از رابط I2C را آموزش میدهیم و در آموزش بعدی با رابط SPI آشنا خواهیم شد.
مروری بر عمکرد برد STM32F103C8 I2C
با مقایسه I2C (مدارهای مجتمع) در برد Blue Pillمدل STM32F103C8 با برد آردوینو Uno، میبینیم که آردوینو دارای میکروکنترلر ATMEGA328 و STM32F103C8 دارای ARM Cortex-M3 میباشد. STM32 دارای دو رابط I2C میباشد، در حالی که برد آدوینو Uno فقط یک رابط I2C دارد و نکته دیگر اینکه STM32 سریعتر میباشد.
پینهای I2C در STM32F103C8
SDA: PB7 یا PB9، PB11
SCL: PB6 یا PB8، PB10
پینهای I2C در آردوینو
SDA: پین A4
SCL: پین A5
تجهیزات موردنیاز:
برد STM32F103C8
برد آردوینو Uno
(2-Nos) LED
Push Bottom
مقاومت ([10k-2 & 2.2k-2]4-Nos)
تخته مدار
سیمهای اتصال
نمودار مدار و اتصالات
جدول زیر اتصالات بین برد STM32 و آردوینو Uno برای رابط I2C را نشان میدهد. این مدار فقط به دو سیم نیاز دارد.
نکته مهم:
فراموش نکنید که GND بردهای آردوینو و STM32 را بهم متصل کنید.
سپس یک مقاومت Pull down 10k را به طور جداگانه به پینهایpush bottom هر دو برد وصل کنید.
STM32F103C8
Arduino
Pin Description
B7
A4
SDA
B6
A5
SCL
GND
GND
Ground
در این آموزش برد STM32F103C8 را به عنوان برد master و آردوینو را به عنوان برد slave در نظر گرفتهایم. هر دو برد به طور جداگانه یک LED و یک push bottom دارند.
برای نشان دادن اتصال I2C در برد STM32، LED برد STM32 را با استفاده از مقدارpush bottom آردوینو کنترل میکنیم و LED برد آردوینو را با استفاده از مقدارpush bottom برد STM32 کنترل میکنیم. این مقادیر با استفاده از رابط I2C ارسال میشود.
برنامهنویسی I2C در STM32
برنامهنویسی این برد نیز همانند برد آردوینو است و در برنامهنویسی STM32F103C8 هم از کتابخانه <wire.h> استفاده میکنیم. این برد میتواند با استفاده از پورت USB و بدون استفاده از پروگرمر FTDI برنامهریزی شود. در این آموزش دو برنامه یکی برای STM32 که برد master بوده و یکی هم برای برد آردوینو که برد slave میباشد، ارائه شده است.
توضیحات برنامهنویسی برد master STM32
ببینیم در STM32 که برد master است چه اتفاقی میافتد:
اول از همه باید کتابخانههای Wire و softwire را برای استفاده از توابع ارتباطی I2C در برد STM32F103C8 فراخوانی میکنیم.
2. ()In void setup
ارتباط سری را در نرخ Baud با مقدار ۹۶۰۰ شروع میکنیم.
سپس اتصال I2C در پین (B6, B7) را شروع میکنیم.
3. () In Void Loop
ابتدا دادهها را از برد slave آردوینو دریافت میکنیم، سپس با استفاده از تابع () requestFrom و 8 آدرس slave، یک بیت را درخواست میکنیم.
مقدار دریافت شده با استفاده از تابع () Wire.read خوانده میشود.
LED برد master براساس مقدار دریافت شده از برد slave با استفاده از digitalwrite در پین PA1، روشن و یا خاموش میشود و همچنین serial print برای چاپ مقدار در مانیتورهای سریال استفاده شده است.
سپس باید مقدار وضعیت پین PA0 را بخوانیم که در واقع push button برد master است.
بعد مقدار پین را براساس لاجیک ارسال کنید، بنابراین اگر از شرط استفاده کنیم و سپس انتقال را با برد slave با مقدار 8 به عنوان آدرس شروع میکنیم و سپس مقدار را با توجه به مقدار ورودی push button مینویسیم.
توضیحات برنامهنویسی برد آردوینو Slave
اول از همه ما باید کتابخانه Wire را برای استفاده از توابع ارتباطی I2C فراخوانی کنیم.
2. ()In void setup
ارتباط سری را در نرخ Baud با مقدار ۹۶۰۰ شروع میکنیم.
سپس اتصال I2C در پین (A4, A5) را با آدرس slave 8 شروع میکنیم. در اینجا تعیین آدرس slave مهم است.
سپس باید در زمانی که slave مقدار ارسال شده از master را دریافت میکند تابع Wire.onReceive را فراخوانی کنیم و زمانی master از slave مقدار درخواست میکند، تابع Wire.onRequest را فراخوانی میکنیم.
3. بنابراین ما دو تابع داریم یکی برای رویداد درخواست و دیگری برای رویداد دریافت
رویداد درخواست
این تابع زمانی اجرا میشود که برد STM32 که برد master است از برد slave درخواست میکند تا مقدار را ارسال کند. این تابع یک مقدار ورودی را از push bottom برد آردوینو دریافت میکند و با توجه به مقدار push button یک بایت (1 یا 0) را با استفاده از تابع Wire.write() به برد master ارسال میکند.
رویداد دریافت
این تابع زمانی اجرا میشود که master با استفاده از آدرس slave (8) دیتا را به برد slave ارسال میکند. این تابع مقدار دریافتی از برد master را میخواند و آن را در متغیری از نوع بایت ذخیره میکند. سپس بر اساس مقدار دریافتی از لاجیک if برای روشن و یا خاموش کردن LED برد slave استفاده میکند. اگر مقدار دریافتی 1 باشد سپس LED روشن میشود و در صورتی که 0 باشد LED خاموش میشود.
خروجی
زمانی که Push bottom برد master را فشار میدهیم، LED متصل شده برروی برد آردوینو slave روشن (سفید) میشود.
2. زمانی که Push bottom برد slave را فشار میدهیم، LED متصل شده برروی برد master روشن (قرمز) میشود و زمانی که دکمه را رها کنید LED خاموش میشود.
3. اگر push bottom هر دو برد master و slave را به طور همزمان فشار دهیم، هر دو LED همزمان روشن میشوند و تا زمانی که دکمه را فشار دهید روشن میمانند.
ارتباط I2C در STM32 بدین صورت انجام میشود. اکنون میتوانید هر سنسور I2C را با برد STM32 متصل کنید.