آموزش برقراری ارتباط I2C بین آردوینو و STM32
![](/wp-content/uploads/2020/07/آموزش-برقراری-ارتباط-I2C-بین-آردوینو-و-STM32.jpg)
محتویات
- کنترل دو طرفه بین برد آردوینو و STM32
- بررسی اجمالی I2C در آردوینو و STM32
- پین های I2C در STM32
- پین I2C در آردوینو
- مدار ارتباط I2C بین آردوینو و STM32
- قطعات مورد نیاز
- برنامه نویسی I2C در آردوینو و STM32
- توضیحات برنامه نویسی STM32
- کد کامل STM32
- توضیح برنامه نویسی آردوینو
- درخواست request
- دریافت Receive
- کد کامل آردوینو
سلام. آموزش برقراری ارتباط I2C بین آردوینو و STM32 را آماده کردیم.
کنترل دو طرفه بین برد آردوینو و STM32
در آموزش های قبلی ما در مورد ارتباط SPI و I2C بین دو برد Arduino یاد گرفته ایم. در این آموزش ما یک برد Arduino را به برد Blue Pill متصل خواهیم کرد و ارتباط بین دو برد آردوینو و STM32 از طریق I2C میباشد. برای نمایش کارکردن مدار، ما یک دکمه و یک ال ای دی به هر کدام از بردهای آردوینو و STM32 متصل میکنیم. با فشردن هر دکمه، ال ای دی در برد دیگر روشن خواهد شد.
فیلم زیر به شما در درک نحوه کار ارتباط I2C بین آردوینو و STM32 کمک میکند.
- هنگامی که دکمه را در STM32 فشار می دهیم ، ال ای دی متصل به Ardiono روشن می شود.
- حالا وقتی دکمه را در سمت آردوینو فشار می دهیم ، LED متصل به STM32 روشن می شود و هنگامی که دکمه رها شود ، LED خاموش می شود.
- هنگامی که هر دو دکمه به طور همزمان فشار داده شوند، هر دو LED به طور همزمان می درخشند و تا زمانی که دکمه ها فشرده باشند روشن هستند.
STM32 نسبت به برد آردوینو از ویژگی های بیشتری برخوردار است. بنابراین بسیار جالب خواهد بود که در مورد ارتباطات بین STM32 و Arduino با استفاده از SPI و I2C اطلاعات کسب کنید. در این آموزش از ارتباط I2C برای برقراری ارتباط بین آردوینو و STM32 استفاده خواهیم کرد و در آموزش بعدی SPI را می آموزیم.
بررسی اجمالی I2C در آردوینو و STM32
با مقایسه I2C در برد STM32F103C8 Blue Pill و Arduino Uno ، خواهیم دید که آردوینو دارای میکروکنترلر ATMEGA328 است و STM32F103C8 دارای ARM Cortex – M3 است. STM32 دارای دو I2C است در حالی که Arduino Uno فقط یک I2C دارد و STM32 سریعتر از آردوینو است.
پین های I2C در STM32
با توجه به تصویر زیر که جزئیات پین های STM32 را نشان میدهد، پین های زیر I2C هستند.
SDA: PB7 یا PB9 ، PB11
SCL: PB6 یا PB8 ، PB10
پین I2C در آردوینو
SDA: پین A4
SCL: پین A5
مدار ارتباط I2C بین آردوینو و STM32
تصویر زیر اتصالات مدار این پروژه را نشان میدهد.
در این آموزش ما STM32F103C8 را به عنوان Master و Arduino به عنوان Slave پیکربندی می کنیم. هر دو صفحه به طور جداگانه به یک LED و یک دکمه وصل شده اند.
در جدول زیر ارتباط بین STM32 و Arduino Uno برای استفاده از I2C نشان داده شده است. این ارتباط فقط به دو سیم نیاز دارد. فراموش نکنید که GND آردوینو و GND برد STM32F103C8 را به هم متصل کنید. یک مقاومت 10 کیلو اهم را به پین های دکمه هر دو برد به طور جداگانه وصل کنید.
STM32F103C8 | Arduino | توضیح پین |
B7 | A4 | SDA |
B6 | A5 | SCL |
GND | GND | Ground |
قطعات مورد نیاز
- STM32 – برد توسعه (BluePill) (STM32F103C8T6)
- برد آردوینو Uno
- ال ای دی – دو عدد
- دکمه – دو عدد
- مقاومت 10 کیلو اهم – دو عدد
- مقاومت 2.2 کیلو اهم – دو عدد
برنامه نویسی I2C در آردوینو و STM32
برنامه نویسی STM32 برای I2C مشابه با کد Arduino است. همان کتابخانه <wire.h> در برنامه نویسی STM32F103C8 استفاده می شود. می توان با استفاده از درگاه USB بدون استفاده از پروگرامر FTDI این برد را برنامه ریزی کرد : آموزش برنامه نویسی STM32 با پورت USB
این آموزش دارای دو برنامه یکی برای STM32 و دیگری برای برد آردوینو است. برنامه های کامل برای هر دو در انتهای صفحه قرار داده شده است. در اینجاب بعضی از قسمت های کد را بررسی میکنیم.
توضیحات برنامه نویسی STM32
در STM32 ببینیم چه اتفاقی می افتد:
1. اول از همه ما برای استفاده از توابع ارتباطی I2C در STM32F103C8 باید کتابخانه wire و کتابخانه Software را وارد کنیم.
#include<Wire.h> #include<SoftWire.h>
2. در void setup() ارتباط سریال را با نرخ Baud Rate 9600 شروع می کنیم.
Serial.begin(9600);
سپس ارتباط I2C را در پین (B6، B7) شروع می کنیم
Wire.begin();
3. در Void loop ()
ابتدا داده ها را از Arduino دریافت می کنیم بنابراین از درخواست From () با آدرس 8 استفاده می کنیم و یک بایت را درخواست می کنیم.
Wire.requestFrom(8,1);
دریافت مقادیر با استفاده از Wire.read ()
byte a = Wire.read();
بسته به مقدار دریافتی ، LED با استفاده از digitalwrite در پین PA1 روشن یا خاموش می شود و همچنین از چاپ سریال برای چاپ مقدار در سریال مانیتور استفاده می شود.
if (a==1) { digitalWrite(LED,HIGH); Serial.println("Master LED ON"); } else { digitalWrite(LED,LOW); Serial.println("Master LED OFF"); }
در مرحله بعد باید وضعیت پین PA0 را که دکمه STM32 است، بخوانیم.
int pinvalue = digitalRead(buttonpin);
بعد مقدار پین را مطابق با منطق میفرستیم، بنابراین از شرط استفاده می کنیم و سپس انتقال را به آردوینو با 8 به عنوان آدرس شروع می کنیم و سپس مقدار را مطابق با مقدار ورودی دکمه می نویسیم.
if(pinvalue==HIGH) { x=1; } else { x=0; } Wire.beginTransmission(8); Wire.write(x); Wire.endTransmission();
کد کامل STM32
کد کامل قسمت STM32 ارتباط I2C در باکس زیر آورده شده است.
#include<Wire.h> #include<SoftWire.h> #define LED PA1 #define buttonpin PA0 int x = 0; void setup() { Serial.begin(9600); pinMode(buttonpin,INPUT); pinMode(LED,OUTPUT); Wire.begin(); } void loop() { Wire.requestFrom(8,1); byte a = Wire.read(); if (a==1) { digitalWrite(LED,HIGH); Serial.println("Master LED ON"); } else { digitalWrite(LED,LOW); Serial.println("Master LED OFF"); } { int pinvalue = digitalRead(buttonpin); if(pinvalue==HIGH) { x=1; } else { x=0; } Wire.beginTransmission(8); Wire.write(x); Wire.endTransmission(); delay(500); } }
توضیح برنامه نویسی آردوینو
1. اول از همه ما برای استفاده از توابع ارتباطی I2C باید کتابخانه Wire را وارد کنیم.
#include<Wire.h>
2. در void setup()
ارتباط سریال را با نرخ Baud Rate 9600 شروع می کنیم.
Serial.begin(9600);
سپس ارتباط I2C را در پین (A4 ، A5) با آدرس به عنوان 8. شروع میکنیم. در اینجا مهم است که آدرس برده را مشخص کنیم.
Wire.begin(8);
وقتی که مقدار و عملکرد تابع Wire.onRequest را دریافت می کند ما به Wire.onReceive نیاز داریم.
Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent);
3. در مرحله بعدی ما دو عملکرد داریم یکی برای request و دیگری برای receive.
درخواست request
این عملکرد از دکمه Arduino مقدار ورودی را می گیرد و یک بایت (1 یا 0) را با توجه به وضعیت دکمه با استفاده از Wire.write () به STM32 می فرستد.
void requestEvent() { int value = digitalRead(buttonpin); if (value == HIGH) { x=1; } else { x=0; } Wire.write(x); }
دریافت Receive
هنگامی که STM32 داده را به Arduino با آدرس (8) می فرستد ، این عملکرد را اجرا می کند. این تابع مقدار دریافتی را از STM32 دریافت می کند و در متغیری از نوع بایت ذخیره می کند و سپس از منطق استفاده می کند تا بسته به مقدار دریافت شده ، LED آردوینو را روشن یا خاموش کند. اگر مقدار دریافتی 1 باشد ، LED روشن می شود و برای 0 ال ای دی خاموش می شود.
void receiveEvent (int howMany) { byte a = Wire.read(); if (a == 1) { digitalWrite(LED,HIGH); Serial.println("Slave LED ON"); } else { digitalWrite(LED,LOW); Serial.println("Slave LED OFF"); } delay(500); }
کد کامل آردوینو
کد کامل قسمت آردوینو ارتباط I2C در باکس زیر آورده شده است.
#include<Wire.h> #define LED 7 #define buttonpin 2 byte x =0; void setup() { Serial.begin(9600); pinMode(LED,OUTPUT); Wire.begin(8); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); } void loop() { delay(100); } void receiveEvent (int howMany) { byte a = Wire.read(); if (a == 1) { digitalWrite(LED,HIGH); Serial.println("Slave LED ON"); } else { digitalWrite(LED,LOW); Serial.println("Slave LED OFF"); } delay(500); } void requestEvent() { int value = digitalRead(buttonpin); if (value == HIGH) { x=1; } else { x=0; } Wire.write(x); } }
سلام کتابخانه wire و کتابخانه Software از كجا دانلودكنيم؟
سلام جناب، این دو کتابخانه به صورت پیشفرض در آردوینو نصب هستند.
چرا توضیحاتم به هم ریخته شد.
اینترها رو حذف کرد.
اینجوری درکش برای خواننده سخت میشه که
بعد از انتشار نظرتون، به صورت صحیح نمایش داده میشه.
سلام تشکر از آموزش خوبتون.
یه توضیح و یه اصلاح کوچلو در مورد کدتون.
—————————
پین های I2C در STM32
SDA: PB7 or PB9 or PB11
SCL: PB6 or PB8 or PB10
که با این دستور انتخاب میشن و به صورت پیشفرض روی پینهای زیر قرار داره و لزومی به ست کردنشون در حالت پیشفرض نیست
Wire.setSCL(PB6);
Wire.setSDA(PB7);
Wire.begin();
—————————
پین I2C در آردوینو
SDA: پین 3
SCL: پین 4
در نتیجه لازمه که این قسمت کد هم اصلاح بشه
#define buttonpin 4
سلام جناب. بسیار ممنونم از لطفتون.