آموزش ARMآموزش STM32آموزش آردوینوآموزش الکترونیک

آموزش برقراری ارتباط I2C بین آردوینو و STM32

سلام. آموزش برقراری ارتباط I2C بین آردوینو و STM32 را آماده کردیم.

کنترل دو طرفه بین برد Arduino و STM32

در آموزش های قبلی ما در مورد ارتباط SPI و I2C بین دو برد Arduino یاد گرفته ایم. در این آموزش ما یک برد Arduino را به برد Blue Pill متصل خواهیم کرد و ارتباط بین دو برد آردوینو و STM32 از طریق I2C میباشد. برای نمایش کارکردن مدار، ما یک دکمه و یک ال ای دی به هر کدام از بردهای آردوینو و STM32 متصل میکنیم. با فشردن هر دکمه، ال ای دی در برد دیگر روشن خواهد شد.

فیلم عملکرد پروژه در انتهای صفحه قرار داده شده است.

STM32 نسبت به برد آردوینو از ویژگی های بیشتری برخوردار است. بنابراین بسیار جالب خواهد بود که در مورد ارتباطات بین STM32 و Arduino با استفاده از SPI و I2C اطلاعات کسب کنید. در این آموزش از I2C برای برقراری ارتباط بین آردوینو و STM32 استفاده خواهیم کرد و در آموزش بعدی SPI را می آموزیم.

آموزش کامل برقراری ارتباط I2C در STM32 و آردوینو

بررسی اجمالی 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

جزئیات پین های STM32

پین I2C در آردوینو

SDA: پین A4

SCL: پین A5

پین I2C در آردوینو

نمودار مدار و اتصالات

تصویر زیر اتصالات مدار این پروژه را نشان میدهد.

کنترل دو طرفه بین برد Arduino و STM32

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.

در این آموزش ما STM32F103C8 را به عنوان Master و Arduino به عنوان Slave پیکربندی می کنیم. هر دو صفحه به طور جداگانه به یک LED و یک دکمه وصل شده اند.

در جدول زیر ارتباط بین STM32 و Arduino Uno برای استفاده از I2C نشان داده شده است. این ارتباط فقط به دو سیم نیاز دارد. فراموش نکنید که GND آردوینو و GND برد STM32F103C8 را به هم متصل کنید. یک مقاومت 10 کیلو اهم را به پین ​​های دکمه هر دو برد به طور جداگانه وصل کنید.

حتما ببینید :  آموزش نصب OpenCV روی رزبری پای با CMake (در 2 روش)
STM32F103C8Arduinoتوضیح پین
B7A4SDA
B6A5SCL
GNDGNDGround

قطعات مورد نیاز

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. برد آردوینو Uno
  3. ال ای دی – دو عدد
  4. دکمه – دو عدد
  5. مقاومت 10 کیلو اهم – دو عدد
  6. مقاومت 2.2 کیلو اهم – دو عدد

برنامه نویسی I2C در Arduino و 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);                            
}
}

فیلم عملکرد نهایی

فیلم زیر به شما در درک نحوه کار ارتباط I2C بین آردوینو و STM32 کمک میکند.

  • هنگامی که دکمه را در STM32 فشار می دهیم ، ال ای دی متصل به Ardiono روشن می شود.
  • حالا وقتی دکمه را در سمت آردوینو فشار می دهیم ، LED متصل به STM32 روشن می شود و هنگامی که دکمه رها شود ، LED خاموش می شود.
  • هنگامی که هر دو دکمه به طور همزمان فشار داده شوند، هر دو LED به طور همزمان می درخشند و تا زمانی که دکمه ها فشرده باشند روشن هستند.

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
برچسب ها

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا
بستن
بستن