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

راه اندازی ارتباط سریال بین آردوینو و STM32 با RS-485 + فیلم

سلام. راه اندازی ارتباط سریال بین آردوینو و STM32 + فیلم را آماده کردیم.

برقراری ارتباط سریالی بین Arduino و میکروکنترلر STM 32

پروتکل های ارتباطی جزء لاینفک الکترونیک دیجیتال هستند. هر جا که چندین میکروکنترلر وجود داشته باشد ، برای تبادل اطلاعات داده ها باید از پروتکل های ارتباطی استفاده شود. انواع مختلفی از پروتکل ارتباط سریال در دسترس است. RS485 یکی از پروتکل های ارتباطی سریال است و در پروژه های صنعتی و ماشین آلات سنگین مورد استفاده قرار می گیرد.

برقراری ارتباط سریالی بین Arduino و میکروکنترلر STM 32

ما قبلا برقراری ارتباط SPI بین آردوینو و STM32 و برقراری ارتباط I2C بین Arduino و STM32 را آموزش دادیم. در این آموزش ما سه دکمه را به STM 32 متصل میکنیم و با این سه دکمه، سه ال ای دی متصل در برد آردوینو را کنترل میکنیم.

بیایید با بررسی کار ارتباطات سریال RS-485 شروع کنیم.

ارتباط سریال RS-485

RS-485 یک پروتکل ارتباط سریال ناهمزمان است که به ساعت نیاز ندارد. این پروتکل از یک تکنیک به نام سیگنال دیفرانسیل برای انتقال داده های باینری از یک دستگاه به دستگاه دیگر استفاده می کند.

روش انتقال سیگنال دیفرانسیل چیست؟

روش سیگنال دیفرانسیل با ایجاد ولتاژ دیفرانسیل با استفاده از 5 ولت مثبت و منفی کار می کند. و با استفاده از دو سیم ، ارتباطات Half-Duplex را برقرار می کند.

با استفاده از این روش:

  • RS-485 حداکثر سرعت انتقال داده بالاتر از 30Mbps را پشتیبانی می کند.
  • این داده ها حداکثر 1200 متر را انتقال می دهد.
  • مهمترین مزیت RS-485 نسبت به RS-232 این است که میتواند از یک برد با چندین برد ارتباط داشته باشد.
  • حداکثر 32 دستگاه می توانند متصل به پروتکل RS-485 باشد.
  • یکی دیگر از مزایای RS-485 ، مصون بودن از نویز است/
  • RS-485 نسبت به پروتکل I2C سریعتر است.

ماژول سریال RS-485

ماژول RS-485 می تواند به هر میکروکنترلر دارای درگاه سریال متصل شود. برای استفاده از ماژول RS-485 با میکروکنترلرها ، ما به MAX485 TTL RS485 که مبتنی بر Maxim MAX485 IC است نیاز داریم زیرا ارتباط سریال را در مسافت های طولانی 1200 متری انجام می دهد و بصورت دو طرفه و Half-Duplex دارای سرعت انتقال داده 2.5 مگابایت بر ثانیه است. است.این ماژول نیاز به 5 ولت نیاز دارد.

توضیحات پین های RS-485

نام پین توضیحات
VCC 5V
A
خروجی درایور غیر معکوس گیرنده ورودی
B
وارسی ورودی گیرنده معکوس خروجی درایور
GND GND (0V)
R0 Receiver Out (RX pin)
RE Receiver Output (LOW-Enable)
DE Driver Output (HIGH-Enable)
DI Driver Input (TX pin)

ویژگی های ماژول RS485 :

  • ولتاژ 5 ولت
  • تراشه MAX485 روی صفحه
  • مصرف برق کم برای ارتباطات RS485
  • گیرنده محدود به سرعت
  • پایانه 2P قدم 5.08 میلی متری
  • سیم کشی ارتباطی راحت RS-485
  • تمام پین های تراشه منجر به کنترل از طریق میکروکنترلر می شوند
  • اندازه: 14*44 میلی متر

استفاده از این ماژول با STM32F103C8 و Arduino UNO بسیار آسان است. از پورتهای سریال سخت افزاری میکروکنترلرها استفاده می کنیم. پین های سریال سخت افزاری در STM32 و arduino UNO در زیر آورده شده است.

اگر میخواهید آردوینو را به صورت اصولی و پروژه محور (برنامه نویسی حرفه ای، ارتباط آردوینو با اندروید، ساخت ربات با آردوینو) یاد بگیرید، روی دوره آموزش آردوینو کلیک کنید.
  • در STM32F103C8: پین  PA9 (TX) و PA10 (RX)
  • در Arduino Uno: پین 0 (RX) و 1 (TX)

برنامه نویسی نیز ساده است فقط با استفاده از Serial.print () برای نوشتن روی RS-485 و Serial.Read () برای خواندن RS-485 استفاده میکنیم و پین های DE و RE از RS-485 برای دریافت داده LOW  میشود و برای ارسال داده HIGH  میشود.

مدار پروژه ارتباط سریالی بین آردوینو و STM32

در این آموزش از STM32F103C8 به عنوان Master با یک ماژول RS-485 استفاده شده و Arduino UNO به عنوان Slave با یک ماژول RS-485 دیگر استفاده می شود. تصویر زیر مدار پروژه را به صورت کامل نشان میدهد.

مدار پروژه ارتباط سریالی بین آردوینو و STM32

سه دکمه با سه مقاومت Pull Down 10k به پین ​​های PA0، PA1، PA2 از STM32 وصل شده است.

اتصال مدار بین RS-485 و STM32F103C8

RS-485 STM32
DI PA9 (TX1)
DE RE PA3
R0 PA10 (RX1)
VCC 5V
GND GND
A به A ماژول RS-485 دیگر
B به B ماژول RS-485 دیگر

 

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

اتصال مدار بین RS-485 و Arduino UNO

RS-485 Arduino UNO
DI 1 (TX)
DE RE 2
R0 0 (RX)
VCC 5V
GND GND
A به A ماژول RS-485 دیگر
B به B ماژول RS-485 دیگر

سه LED استفاده می شود که آندهای LED با مقاومت 330 اهم به پین ​​های 4 ، 7 ، 8 Arduino UNO و کاتد ال ای دی ها به GND متصل می شوند.

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

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. برد آردوینو UNO
  3. ماژول مبدل MAX485 TTL به RS485 – دو عدد
  4. پتانسیومتر 10 کیلو اهم
  5. دکمه – سه عدد
  6. ال ای دی – سه عدد
  7. مقاومت 10 کیلو اهم – سه عدد
  8. مقاومت 330 اهم – سه عدد

برنامه نویسی STM32 و آردوینو برای ارتباط سریال RS485

Arduino IDE برای توسعه و برنامه نویسی هر دو صفحه یعنی STM32 و Arduino UNO استفاده می شود. اما مطمئن شوید که PORT مربوطه را از Tools->Port و Board صحیح را از Tools-> Board انتخاب کرده اید. برنامه نویسی این آموزش شامل دو بخش است. یکبار برای آردوینو و یکبار برای STM32.

برنامه نویسی STM32 برای ارتباط Serial

در سمت STM32، وضعیت دکمه خوانده شده و سپس مقادیر سریال آن به صورت سریال RS-485 از طریق درگاههای سریال سخت افزاری 1 (PA9 ، PA10) به RS-485 رستاده میشود. هيچ كتابخانه خارجي مورد نياز نیست. آردوینو تمام کتابخانه لازم برای ارتباط سریال را در اختیار دارد.

ارتباط سریال را با استفاده از پین های سریال سخت افزاری (PA9، PA10) با نرخ 9600 آغاز کنید.

 Serial1.begin(9600); 

وضعیت دکمه را در پین های PA0، PA1، PA2 از STM32F103C8 میخوانیم و آنها را در متغیر های button1val، button2val، button3val ذخیره میکنیم.

int button1val = digitalRead(button1);
int button2val = digitalRead(button2);
int button3val = digitalRead(button3);

قبل از ارسال مقادیر دکمه به پورت سریال ، پین های DE و RE از RS-485 باید High باشند.

digitalWrite(enablePin, HIGH);

اگر دکمه اول فشار داده شود ، شرایط مطابقت دارد و مقدار 1 به پورت سریالی که Arduino UNO متصل است ارسال می شود.

if (button1val == HIGH)
    {
      int num1 = 1;
      Serial1.println(num1);
    }

به طور مشابه ، هنگام فشار دادن دکمه 2 ، مقدار 2 از طریق پورت سریال ارسال می شود و هنگامی که دکمه 3 فشرده می شود ، مقدار 3 از طریق پورت سریال ارسال می شود.

else if (button2val == HIGH)
    {
      int num2 =2;
      Serial1.println(num2);
    }
                else if (button3val == HIGH)
    {
      int num3 =3;
      Serial1.println(num3);
    }

و هنگامی که هیچ دکمه ای فشرده نمی شود ، مقدار 0 به Arduino Uno ارسال می شود.

   else
   {
     int num = 0;
     Serial1.println(num);
     }

کد کامل قسمت STM32 پروژه :

#define button1 PA0
#define button2 PA1
#define button3 PA2
#define enablePin PA3 
 
void setup()
{
  Serial1.begin(9600);           
  pinMode(enablePin, OUTPUT);
  pinMode(button1,INPUT);
  pinMode(button2,INPUT);
  pinMode(button3,INPUT);  
  delay(10);
  digitalWrite(enablePin, HIGH); 
}

void loop()
{
  int button1val = digitalRead(button1);  
  int button2val = digitalRead(button2);
  int button3val = digitalRead(button3); 
    if (button1val == HIGH)
    {
      int num1 = 1;
      Serial1.println(num1);          
    }
    else if (button2val == HIGH)
    {
      int num2 =2;
      Serial1.println(num2);     
    }
    else if (button3val == HIGH)
    {
      int num3 =3;
      Serial1.println(num3);      
    }
   else
   {
     int num = 0;
     Serial1.println(num);        
   }
   delay(50);
}

برنامه نویسی Arduino برای ارتباط Serial

Arduino UNO مقدار عدد صحیحی را دریافت می کند که از STM32F103C8 ارسال شده است. به سادگی مقدار را میخوانیم و آن را در یک متغیر ذخیره میکنیم. بسته به مقدار دریافت شده ، LED متصل به GPIO مربوطه روشن یا خاموش می شود.

برای دریافت مقادیر از STM32، فقط کافی است پین های DE و RE از ماژول RS-485 را Low کنیم. بنابراین پین 2 (enablePin) در آردوینو را Low کنیم.

digitalWrite(enablePin, LOW);

اکنون فقط داده های عدد صحیح موجود در سریال پورت را میخوانیم و آنها را در یک متغیر ذخیره میکنیم.

int receive = Serial.parseInt();

بسته به مقدار دریافتی (0 ، 1 ، 2 ، 3) با فعال کردن پین GPIO مربوطه، ال ای دی مورد نظر روشن میشود.

if (receive == 1)   
        {
          digitalWrite(ledpin1,HIGH);
        }
        else if (receive == 2)
        {
          digitalWrite(ledpin2,HIGH);
        }
        else if (receive == 3)
        {
          digitalWrite(ledpin3,HIGH);
        }
        else
        {
         digitalWrite(ledpin1,LOW);
         digitalWrite(ledpin2,LOW);
         digitalWrite(ledpin3,LOW);
        }

کد کامل قسمت Arduino پروژه :

#define enablePin 2
#define ledpin1 4
#define ledpin2 7
#define ledpin3 8

void setup() 
{
  Serial.begin(9600);             
  pinMode(ledpin1,OUTPUT);
  pinMode(ledpin2,OUTPUT);
  pinMode(ledpin3,OUTPUT);
  pinMode(enablePin, OUTPUT);
  delay(10);
  digitalWrite(enablePin, LOW);      
}

void loop() 
{
  while (Serial.available())    
     {         
        int receive = Serial.parseInt();    
        if (receive == 1)     
        {
          digitalWrite(ledpin1,HIGH);
        }
        else if (receive == 2)
        {
          digitalWrite(ledpin2,HIGH);
        }
        else if (receive == 3)
        {
          digitalWrite(ledpin3,HIGH);
        }
        else
        {
         digitalWrite(ledpin1,LOW);
         digitalWrite(ledpin2,LOW);
         digitalWrite(ledpin3,LOW); 
        }
     }
}

فیلم عملکرد ارتباط سریالی

در انتها، پس از اتصال قطعات مدار و بارگذاری کد ها روی برد ها، نوبت به آزمایش پروژه میرسد.

1. هنگامی که دکمه 1 ، که به STM32 متصل است ، فشار داده می شود ، ال ای دی 1 که به آردوینو متصل است روشن می شود.

2. هنگامی که دکمه 2 ، که به STM32 متصل شده است ، فشار داده می شود ، ال ای دی 1 که به آردوینو متصل است روشن می شود.

3. به طور مشابه با فشار دکمه 3 ، ال ای دی 3 که به آردوینو متصل است روشن می شوند.

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

محمد رحیمی

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

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

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