آموزش STM32آموزش آردوینوآموزش های ARM

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

سلام. آموزش برقراری ارتباط 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 در آردوینو و 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 در آردوینو

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

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

کنترل دو طرفه بین برد Arduino و 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

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

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. برد آردوینو Uno
  3. ال ای دی – دو عدد
  4. دکمه – دو عدد
  5. مقاومت 10 کیلو اهم – دو عدد
  6. مقاومت 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);                            
}
}
4.6 (7 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

6 نظر

    1. سلام جناب، این دو کتابخانه به صورت پیشفرض در آردوینو نصب هستند.

  1. چرا توضیحاتم به هم ریخته شد.
    اینترها رو حذف کرد.
    اینجوری درکش برای خواننده سخت میشه که

    1. بعد از انتشار نظرتون، به صورت صحیح نمایش داده میشه.

  2. سلام تشکر از آموزش خوبتون.
    یه توضیح و یه اصلاح کوچلو در مورد کدتون.

    —————————
    پین های 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

    1. سلام جناب. بسیار ممنونم از لطفتون.

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

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