پروژه الکترونیکپروژه های ARMپروژه های STM32پروژه های آردوینو

ساخت فاصله سنج التراسونیک بی سیم با STM32 و آردوینو

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

ارسال مقادیر از سنسور التراسونیک و STM32 به Arduino

ساخت پروژه های بی سیم در برنامه های الکترونیکی بسیار مفید است زیرا از وجود سیم های زیاد و پیچیده جلوگیری میشود. همچنین اینکار در بسیار از پروژه ها باعث قابل حمل شدن دستگاه میشود. فناوری های بی سیم زیادی به این منظور وجوود دارند که معروف ترین آن ها ارتباط رادیویی، بلوتوث، وای فای و … هستند. هر فناوری بی سیم دارای معایب و مزایای خاص خود از جمله هزینه، دامنه عملکرد، سرعت و … است. در این پروژه، ما با استفاده از ماژول التراسونیک و میکروکنترلر STM32 فاصله را میسنجیم و سپس از طریق ارتباط رادیویی آن را به برد آردوینو انتقال میدهیم و سپس مقادیر را در ال سی دی کاراکتری متصل به Arduino نمایش میدهیم.

ارسال مقادیر از سنسور التراسونیک و STM32 به Arduino

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

در اینجا ما یک ماژول بی سیم 433MHz RF را به میکروکنترلر STM32 متصل خواهیم کرد. این پروژه به دو بخش تقسیم می شود. فرستنده رادیویی به STM32 متصل میشود و گیرنده به آردوینو Uno متصل میشود. در این پروژه ، RF فرستنده دو مقدار را به سمت گیرنده می فرستد: مسافت اندازه گیری شده با استفاده از سنسور التراسونیک و مقدار ADC پتانسیومتر (0 تا 4096) که به (0 تا 100)تبدیل می شود. گیرنده RF آردوینو هر دو مقادیر را دریافت می کند و آن مقادیر را در LCD 16×2 چاپ می کند.

ما قبلا پروژه های فراوانی با ماژول بی سیم رادیویی RF 433Mhz در سایت آیرنکس قرار داده ایم :

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

تصویر زیر مدار فرستنده ارتباط رادیویی آردوینو و STM32 را نشان میدهد.

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

پتانسیومتر 10 کیلو اهم به STM32 متصل شده است تا مقدار آنالوگ ورودی (0 تا 3.3V) را به پین ​​ADC PA0 STM32 ارائه دهد.

اتصالات مدار بین فرستنده RF و STM32

جدول زیر اتصالات مدار بین فرستنده RF و STM328 را نشان میدهد.

STM32فرستنده رادیویی
5VVDD
GNDGND
PA10DATA
NCANT

اتصالات مدار بین سنسور التراسونیک و STM32

جدول زیر اتصالات مدار بین سنسور التراسونیک و STM32 را نشان میدهد.

STM32سنسور التراسونیک HC-SR04
5VVCC
PB1Trig
PB0Echo
GNDGND

مدار گیرنده ارسال اطلاعات از STM 32 به Arduino

تصویر زیر مدار گیرنده ارتباط رادیویی Arduino و STM 32 را نشان میدهد.

مدار گیرنده ارسال اطلاعات از STM32 به Arduino

اتصالات مدار بین گیرنده RF و آردوینو UNO

جدول زیر اتصالات مدار بین گیرنده RF و آردوینو UNO را نشان میدهد.

Arduino UNORF Receiver
5VVDD
GNDGND
11DATA
NCANT

اتصالات مدار بین LCD 16×2 و Arduino UNO

جدول زیر اتصالات مدار بین LCD 16×2 و Arduino UNO را نشان میدهد.

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.
نام پین ال سی دینام پین Arduino Uno
GroundGround
VCC5V
VEEپتانسیومتر
Register Select (RS)2
Read/Write (RW)Ground
Enable (EN)3
Data Bit 4 (DB4)4
Data Bit 5 (DB5)5
Data Bit 6 (DB6)6
Data Bit 7 (DB7)7
LED مثبت5V
LED منفیGround

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

  1. STM32 – برد توسعه (BluePill) (STM32F103C8T6)
  2. برد آردوینو UNO
  3. فرستنده و گیرنده RF 433Mhz
  4. سنسور التراسونیک HC-SR04
  5. ال سی دی کاراکتری 16*2
  6. پتانسیومتر 10 کیلو اهم
حتما ببینید :  آموزش ساخت اسکنر کد QR با رزبری پای و OpenCV

توضیحات سنسور التراسونیک HC-SR04

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

پروژه التراسونیک آردوینو
پروژه التراسونیک آردوینو

سنسور التراسونیک HC-SR04 یک سیگنال خروجی متناسب با فاصله بر اساس اکو فراهم می کند. سنسور در اینجا یک لرزش صدا را در محدوده سنسور ایجاد می کند، و بعد از فرستادن یک ارتعاش ، برای بازگشت صدا منتظر می ماند.

نحوه کار سنسور التراسونیک HC-SR04

فرستنده یک موج التراسونیک را در فرکانس 40 هرتز ساطع می کند ، این موج از طریق هوا عبور می کند و هنگامی که یک جسم را حس می کند باز میگردد. امواج برگشتی توسط گیرنده مشاهده می شود. اکنون می دانیم زمان لازم برای بازتاب و بازگشت این موج گرفته شده است و سرعت موج التراسونیک 3400 سانتی متر در ثانیه است. با استفاده از این اطلاعات و فرمول زیر میتوان فاصله را حساب کرد [ فاصله = سرعت موج * زمان ]

ماژول فرستنده و گیرنده RF 433Mhz

فرستنده و گیرنده RF 433 (ترکیبی ASK)

توضیحات پین های فرستنده رادیویی 433 مگاهرتز

فرستنده 433Mhz RFاطلاعات
ANTاتصال آنتن
GND

GND
VDD3.3 تا 5 ولت
DATAاطلاعات از این پین فرستاده میشوند.

دتوضیحات پین های گیرنده رادیویی 433 مگاهرتز

گیرنده 433Mhz RFاطلاعات
ANTاتصال آنتن
GNDGND
VDD3.3 تا 5 ولت
DATAاطلاعات از این پین دریافت میشوند.
CE/DOاطلاعات از این پین دریافت میشوند.

مشخصات ماژول 433 مگاهرتز

  • ولتاژ گیرنده: 3V تا 5V
  • ولتاژ فرستنده: 3V تا 5V
  • فرکانس عملکرد: 433 مگاهرتز
  • فاصله انتقال: 3 متر بدون آنتن و حداکثر تا 100 متر با آنتن
  • روش تعدیل: ASK (کلید تغییر دامنه)
  • سرعت انتقال داده: 10 کیلو بایت بر ثانیه

کد کامل پروژه در انتهای صفحه در فایل دانلودی موجود است. در اینجا کد برد آردوینو و برد STM32 را به صورت خلاصه بررسی میکنیم.

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

در آموزش قبلی ما درباره برنامه نویسی STM32 با استفاده از درگاه USB آموختیم. می توان با استفاده از درگاه USB بدون استفاده از پروگرامر FTDI برد STM32 را برنامه ریزی کرد : آموزش برنامه نویسی STM32 با پورت USB.

در بخش فرستنده فاصله جسم برحسب سانتی متر با استفاده از سنسور اولتراسونیک اندازه گیری می شود و مقدار عددی توسط پتانسیومتر تعیین میشود به 0 تا 100 تبدیل میشود به برد آردوینو ارسال میشوند.

در کد برنامه ابتدا کتابخانه Radiohead را فراخوانی میکنیم. این کتابخانه در فایل دانلودی انتهای صفحه موجود است. برای نصب آن، آموزش نصب کتابخانه در آردوینو را ببینید.

#include <RH_ASK.h>    

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

#define trigPin PB1                            
#define echoPin PB0   

سپس نام object برای کتابخانه RH_ASK به عنوان =rf_driver با پارامترهایی مانند سرعت 2000 ، پین RX (PA9) و پین TX (PA10) را تنظیم می کنیم.

RH_ASK rf_driver(2000, PA9, PA10);        

متغیر رشته های مورد نیاز را اعلام می کنیم.

String transmit_number;                            
String transmit_distance;
String transmit;

در مرحله بعدی (void setup) ، کار object یعنی RH_ASK rf_driver آغاز می شود.

rf_driver.init();

پس از آن پین تریگر به عنوان پین خروجی و PA0 (متصل به پتانسیومتر) و پین اکو به عنوان ورودی تنظیم می شوند.

   Serial.begin(9600);
    pinMode(PA0,INPUT);
    pinMode(echoPin,INPUT);
    pinMode(trigPin,OUTPUT);

بعد در void loop () مقدار پتانسیومتر را که ورودی آنالوگ است را به مقدار دیجیتال تبدیل میکنیم. و سپس با عملکرد Map، مقدار آنالوگ به دیجیتال که بین 0 تا 4096 است به عددی بین 0 تا 100 تبدیل میشود.

    int analoginput = analogRead(PA0);                  
    int pwmvalue = map(analoginput,0,4095,0,100);  

سپس فاصله با استفاده از سنسور اولتراسونیک با فعال کردن پین تریگر به مدت 2 میکرو ثانیه اندازه گیری می شود.

    digitalWrite(trigPin, LOW);                          
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);                          
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);  

هنگامی که موج برگردد، پین اکو فعال میشود و مدت زمان با استفاده از فرمول زیر محاسبه میشود.

    long duration = pulseIn(echoPin, HIGH);              
    float distance= duration*0.034/2;   

اکنون هر دو مقدار ADC و فاصله اندازه گیری شده به داده های رشته تبدیل شده و در متغیرهای مربوطه ذخیره می شوند.

    transmit_number= String(pwmvalue);                     
    transmit_distance = String(distance);        

هر دو رشته به یک خط اضافه می شوند و در رشته ای به نام  transmit ذخیره میشوند و کاما “،” برای جدا کردن دو رشته استفاده میشود.

  transmit = transmit_pwm + "," + transmit_distance;   

رشته انتقال به آرایه کاراکتری تبدیل می شود.

    const char *msg = transmit.c_str();    

داده ها منتقل شده و منتظر می مانیم تا ارسال شوند.

    rf_driver.send((uint8_t *)msg, strlen(msg));         
    rf_driver.waitPacketSent();         

داده های رشته ارسال شده در سریال مانیتور نیز نمایش داده می شود.

    Serial.println(msg);      

برنامه نویسی Arduino UNO به عنوان گیرنده رادیویی

آردوینو UNO با استفاده از Arduino IDE برنامه ریزی می شود. در بخش گیرنده داده هایی که از قسمت فرستنده منتقل می شوند و توسط ماژول گیرنده RF دریافت می شوند و داده های رشته ای دریافت شده به داده های مربوطه (فاصله و شماره) تقسیم می شوند و در نمایشگر ال سی دی کاراکتری نمایش داده می شوند.

حتما ببینید :  آموزش ساخت اسکنر کد QR با رزبری پای و OpenCV

بیایید به طور خلاصه کد نویسی گیرنده را ببینیم:

مانند بخش فرستنده ، ابتدا کتابخانه RadiohHead گنجانده شده است.

#include <RH_ASK.h>                

کتابخانه کریستال مایع برای راه اندازی ال سی دی مورد استفاده قرار میگیرد.

#include <LiquidCrystal.h>   

سپس پین های نمایشگر LCD 16×2 متصل به Arduino UNO اعلام می شوند.

LiquidCrystal lcd(2,3,4,5,6,7);    

متغیرهای داده String برای ذخیره داده های رشته اعلام می شوند.

String str_receive;                
String str_number;
String str_distance;

Object از کتابخانه Radiohead اعلام میشود.

      RH_ASK rf;       

اکنون در void setup () ، ال سی دی کاراکتری در حالت 16*2 تنظیم میشود و سپس به مدت 5 ثانیه پیام مقدمه نمایش داده میشود. سپس LCD پاک میشود.

  lcd.begin(16,2);              
    lcd.print("IRENX.IR");  
    lcd.setCursor(0,1);
    lcd.print("RF with STM32");
    delay(5000);
    lcd.clear();

پس از آن ، rf را شروع میکنیم.

rf.init();       

اکنون در void loop() ، آرایه buf[] با اندازه 7 اعلام میشود. داده دریافت شده از فرستنده دارای 7 عدد از جمله “،” است. بنابراین ، این را مطابق با داده هایی که قرار است منتقل شود میتوانید تغییر دهید.

    uint8_t buf[7];                       
    uint8_t buflen = sizeof(buf);

اگر رشته در ماژول گیرنده rf موجود باشد ، تابع if اندازه را بررسی می کند و آن را اجرا می کند. rf.recv () برای دریافت داده ها استفاده می شود.

if (rf.recv(buf, &buflen))         

buf رشته دریافت شده را دارد بنابراین رشته دریافت شده در یک متغیر رشته به نام str_receive ذخیره می شود.

str_receive = String((char*)buf);         

در صورت تشخیص “,” بین دو رشته ، این حلقه برای تقسیم رشته دریافت شده به دو قسمت استفاده می شود.

      for (int i = 0; i < str_receive.length(); i++)            
      {
      if (str_receive.substring(i, i+1) == ",")                 
      {
      str_number = str_receive.substring(0, i);
      str_distance = str_receive.substring(i+1);
      break;
      }

دو آرایه کاراکتر برای تقسیم رشته به دو قسمت استفاده میشود. هر کدام دارای 3 قسمت هستند.

      char numberstring[4];
      char distancestring[3];
      str_distance.toCharArray(distancestring,3);             
      str_number.toCharArray(numberstring,3);

بعد از تبدیل به عدد صحیح ، فاصله و مقدار ADC در صفحه LCD 16×2 نمایش داده می شود.

      lcd.setCursor(0,0);
      lcd.print("Number:");
      lcd.print(number);                 
      lcd.setCursor(0,1);
      lcd.print("Distance :");
      lcd.print(distance);                   
      lcd.print(" cm");

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

پس از بارگذاری هر دو کد یعنی فرستنده و گیرنده به ترتیب در STM32 و Arduino UNO، داده هایی مانند مقدار ADC و فاصله شی اندازه گیری شده با استفاده از STM32 از طریق فرستنده RF به گیرنده RF منتقل می شود و مقادیر دریافت شده به صورت بی سیم در صفحه نمایش LCD نمایش داده می شوند. فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.

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

موارد موجود در فایل : سورس کامل ، شماتیک

برای دانلود فایل های پروژه ثبت نام کنید، تنها چند ثانیه زمان لازم است. از طریق فرم زیر اقدام کنید.

ایمیل خود را وارد کنید

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

محمد رحیمی

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

16 نظر

  1. سلام‌ میخوام‌ برای برد آردوینو‌ باتری‌ بزارم‌ ‌هم‌ نوع‌ قابل‌ شارژ پیشنهاد بدید‌ هم‌ غیرقابل شارژ‌ هم‌ اینکه‌ یک‌ فتوولتاییک‌ که‌ توی‌ هوای‌ خیلی = گرم‌ جواب‌ بده‌ به‌ من‌ معرفی‌ میکنید‌ ممنون‌ میشم‌ اگر تجربه‌ ای‌ توی‌ این‌ زمینه‌ دارید به‌ من‌ بگید‌

    1. سلام جناب. باتری بدون شارژ که استفاده از همین باتری 9 ولت کتابی ها خوبه. در مورد باتری های قابل شارژ هم بسته به برد آردوینوتون باید باتری لیتیومی مناسب تهیه کنید.

      1. درود‌ ممنونم‌ آخه‌ میخوام‌ کلا‌ با باتری‌ کارکنه چون‌ دور از‌ برقه و‌ میخوام‌ یک‌ نوع‌ باتری‌ باشه‌ که‌ مدت‌ طولانی‌ بره‌

  2. یک‌ آردیونو‌ هست‌ باسنسور‌ آلتراسونیک‌ داره‌ لول‌ مخزن رومیخونه‌ و‌ روی‌ ال سی دی‌ نمایش‌ میده‌ اما‌ دورازبرقه‌ ومحیط‌ سربسته‌ است‌ میشه‌ براش‌ باتری‌ گذاشت؟

    1. خب یه باتری لیتیومی بذارید اما چطور میخواین باتری رو شارژ کنین؟ باید از صفحه خورشیدی استفاده کنید

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

    1. بله در مورد باتری باید با توجه به مقدار مصرفرتون تصمیم بگیرید. مدل چینی هم زیاد شده باید از فروشگاه معتبر تهیه کنید. من نمیتونم دقیقا بهتون پیشنهاد بدم به خودتون بستگی داره

  4. درود، این‌ پروژه‌ چند تا فرستنده‌ و یک‌ گیرنده‌ میتونه‌ داشته‌ باشه؟؟

        1. ارتباط رادیویی هست و نیازی به تغییری در پروژه نیست. فقط باید از مدار های فرستنده چند تا رو بسازید و کد رو توشون آپلود کنید.

  5. سلام،به‌ جای‌ این‌ فرستنده و گیرنده‌ چیز‌ دیگه‌ ای هم‌ میشه‌ استفاده‌ کرد؟؟؟ بردش‌ بیشتر باشه آخه‌ این‌ بردش‌ خیلی کم‌ هست‌ .

    1. سلام. پروژه برای این فرستنده و گیرنده نوشته شده و این نوع هم در شرایط بهینه میتونند تا 100 متر رو پوشش بدند. اما در غیر اینصورت میتونید خودتون عوض کنید و نیاز به تغییر در کد پروژه داره.

  6. سلام این گیرنده و فرستنده رو از کجا میتونم بخرم هرچی میگردم نیست این مدلی

    1. اغلب ماژول های 433 فرق چندانی با هم ندارند ولی بازهم بهتره از همین مدل استفاده بشه که متاسفانه در ایران کم هست

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

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

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