آموزش اندازه گیری ارتفاع از سطح دریا با آردوینو و سنسور BMP388

محتویات
BMP388 یک سنسور فشار از سطح دریا است. به دلیل دقت آن، اغلب برای تخمین ارتفاع در پهپاد ها استفاده می شود. همچنین می توان از آن در ناوبری، برنامههای GPS و موارد دیگر استفاده کرد. در این آموزش، نحوه استفاده از سنسور ارتفاع و فشار سنج BMP388 با برد آردوینو را یاد خواهید گرفت.
سنسور ارتفاع، فشار و دما BMP388
BMP388 یک سنسور فشار دقیق، کم مصرف و کم نویز است که فشار و دمای مطلق را اندازه گیری می کند. از آنجایی که فشار با ارتفاع تغییر می کند، می توانیم ارتفاع را نیز با دقت زیادی تخمین بزنیم. به همین دلیل، این سنسور برای کاربردهای پهپاد و ناوبری مفید است. همچنین می توانید از آن برای پروژه های دیگر استفاده کنید:
- محاسبه سرعت عمودی؛
- اینترنت اشیا؛
- پیش بینی آب و هوا و ایستگاه های هواشناسی؛
- برنامه های کاربردی مراقبت های بهداشتی؛
- برنامه های تناسب اندام؛
همانطور که در شکل زیر نشان داده شده است، ما از سنسور BMP388 به عنوان یک ماژول استفاده می کنیم.
اطلاعات فنی BMP388
جدول زیر ویژگی های کلیدی سنسور BMP388 را نشان می دهد.
محدوده عملکرد | 300 تا 1250 hPa (فشار) -40 تا +85ºC (دما) |
پروتکل ارتباطی | I2C و SPI |
جریان مصرفی | 3.4 µA @ 1Hz |
دقت مطلق فشار (typ.) P=900 …1100 hPa (T=25 … 40°C) | ±0.5 hPa |
دقت نسبی فشار (typ.) P=900…1100 hPa (T=25 … 40°C) | ±0.08 hPa |
نویز در فشار | 0.03 پاسکال |
حداکثر نرخ نمونه برداری | 200 هرتز |
پین های ماژول BMP388
در اینجا پین اوت ماژول BMP388 است که ما از آن استفاده می کنیم.
VIN | سنسور را تغذیه می کند (5 ولت) |
3V3 | سنسور را تغذیه می کند (3V3) |
GND | GND مشترک |
SCK | پین SCL برای ارتباط I2C پین SCK برای ارتباط SPI |
SDO | پین SDO (MISO) برای ارتباط SPI |
SDI | پین SDA برای ارتباط I2C پین SDI (MOSI) برای ارتباط SPI |
CS | پین انتخاب تراشه CS برای ارتباط SPI |
INT | پین وقفه |
اتصال سنسور BMP388 به برد آردوینو
همانطور که قبلا ذکر شد، سنسور BMP388 از پروتکل های I2C و SPI پشتیبانی می کند.
برای استفاده از پروتکل ارتباطی I2C، از پین های زیر استفاده کنید (برای Arduino Uno است، اگر از مدل دیگری استفاده می کنید، پین های I2C آن را بررسی کنید):
BMP388 | Arduino |
SDI (SDA) | A4 |
SCK (SCL) | A5 |
برای استفاده از پروتکل ارتباطی SPI، از پین های زیر استفاده کنید (برای Arduino Uno است، اگر از مدل دیگری استفاده می کنید، پین های SPI آن را بررسی کنید):
BMP388 | Arduino |
SCK | Pin 13 |
SDI (MOSI) | Pin 11 |
SDO (MISO) | Pin 12 |
CS (Chip Select) | Pin 10 |
قطعات مورد نیاز
برای تکمیل این آموزش به قطعه های زیر نیاز دارید:
- ماژول سنسور BMP388
- برد آردوینو
- برد بورد
- سیم های جامپر
BMP388 می تواند با استفاده از پروتکل های ارتباطی I2C یا SPI ارتباط برقرار کند. تصویر زیر ارتباط با پروتکل I2C را نشان میدهد:
از طرف دیگر، اگر میخواهید از پروتکل ارتباطی SPI استفاده کنید، شماتیک بعدی را دنبال کنید تا با استفاده از پین های SPI، سنسور BMP388 را به آردوینو Uno متصل کنید.
کد آردوینو اندازه گیری فشار از سطح دریا
کتابخانه های مختلفی وجود دارد که با حسگر BMP388 و آردوینو سازگار هستند. در این آموزش، از کتابخانه Adafruit BMP3XX استفاده می کنیم.
مراحل بعدی را برای نصب کتابخانه در Arduino IDE خود دنبال کنید:
Arduino IDE خود را باز کنید و به Sketch > Include Library > Manage Libraries بروید.
“adafruit bmp3xx” را در کادر جستجو جستجو کنید و کتابخانه را نصب کنید.
برای استفاده از کتابخانه BMP3XX، باید کتابخانه Adafruit_Sensor را نیز نصب کنید. مراحل بعدی را برای نصب کتابخانه در Arduino IDE خود دنبال کنید:
به Sketch > Include Library > Manage Libraries بروید و «Adafruit Unified Sensor» را در کادر جستجو تایپ کنید. برای یافتن کتابخانه و نصب آن تا انتها به پایین بروید.
پس از نصب کتابخانه ها، آردوینو IDE خود را مجددا راه اندازی کنید.
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مختلف کد را بررسی میکنیم.
کد با گنجاندن کتابخانه های مورد نیاز شروع می شود: کتابخانه Wire برای استفاده از I2C، کتابخانه SPI (اگر می خواهید از SPI به جای I2C استفاده کنید) و کتابخانه های Adafruit_Sensor و Adafruit_BMP3XX برای ارتباط با حسگر BMP388 استفاده میشوند.
#include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include "Adafruit_BMP3XX.h"
ما ترجیح می دهیم از پروتکل ارتباطی I2C با سنسور استفاده کنیم. با این حال، اگر می خواهید از SPI استفاده کنید، خطوط کد زیر پین های SPI را مشخص می کند.
#define BMP_SCK 13 #define BMP_MISO 12 #define BMP_MOSI 11 #define BMP_CS 10
متغیری به نام SEALEVELPRESSURE_HPA ایجاد می شود.
#define SEALEVELPRESSURE_HPA (1013.25)
این متغیر فشار را در سطح دریا بر حسب هکتوپاسکال (معادل میلی بار) ذخیره می کند. این متغیر برای تخمین ارتفاع برای فشار معین با مقایسه آن با فشار سطح دریا استفاده می شود. این مثال از مقدار پیش فرض استفاده می کند، اما برای نتایج دقیق، مقدار را با فشار فعلی سطح دریا در محل خود جایگزین کنید.
در setup() یک ارتباط سریالی را شروع کنید.
Serial.begin(115200);
این کد به طور پیش فرض از پروتکل ارتباطی I2C استفاده می کند. خط زیر یک آبجکت Adafruit_BMP3XX به نام bmp را روی پین های I2C شروع می کند: A5 (SCL)، A4 (SDA).
if (!bmp.begin_I2C()) {
برای استفاده از SPI، باید این خط قبلی را کامنت کنید و یکی از خطوط زیر را برای SPI سخت افزاری (از پین های پیش فرض SPI استفاده کنید و پین CS را انتخاب کنید) یا SPI نرم افزاری (از هر پین) حذف کنید.
//if (! bmp.begin_SPI(BMP_CS)) { // hardware SPI mode //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) { // software SPI mode
پارامترهای زیر (نمونه برداری بیش از حد و فیلتر) را برای سنسور تنظیم کنید.
bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X); bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X); bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3); bmp.setOutputDataRate(BMP3_ODR_50_HZ);
برای افزایش وضوح داده های خام حسگر، از oversampling پشتیبانی می کند.ما از پارامترهای نمونه برداری پیش فرض استفاده خواهیم کرد، اما شما می توانید آنها را تغییر دهید.
- setTemperatureOversampling(): تنظیم oversampling دما.
- setPressureOversampling(): تنظیم oversampling فشار.
این متدها می توانند یکی از پارامترهای زیر را بپذیرند:
- BMP3_NO_OVERSAMPLING
- BMP3_OVERSAMPLING_2X
- BMP3_OVERSAMPLING_4X
- BMP3_OVERSAMPLING_8X
- BMP3_OVERSAMPLING_16X
- BMP3_OVERSAMPLING_32X
تابع setIIRFilterCoeff() ضریب فیلتر را (در نمونه ها) تنظیم می کند. می تواند یکی از موارد زیر باشد:
- BMP3_IIR_FILTER_DISABLE (بدون فیلتر)
- BMP3_IIR_FILTER_COEFF_1
- BMP3_IIR_FILTER_COEFF_3
- BMP3_IIR_FILTER_COEFF_7
- BMP3_IIR_FILTER_COEFF_15
- BMP3_IIR_FILTER_COEFF_31
- BMP3_IIR_FILTER_COEFF_63
- BMP3_IIR_FILTER_COEFF_127
در loo[()، اندازه گیری ها را از حسگر BMP388 دریافت خواهیم کرد.
ابتدا به سنسور بگویید که با bmp.performReading() خوانش های جدیدی دریافت کند.
if (! bmp.performReading()) { Serial.println("Failed to perform reading :("); return; }
سپس مقادیر دما، فشار و ارتفاع را به صورت زیر دریافت و چاپ کنید:
Serial.print("Temperature = "); Serial.print(bmp.temperature); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bmp.pressure / 100.0); Serial.println(" hPa"); Serial.print("Approx. Altitude = "); Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA)); Serial.println(" m");
شما هر اندازه گیری را به صورت زیر دریافت می کنید:
- bmp.temperature: مقدار دما را برمی گرداند
- bmp.pressure: مقدار فشار را برمی گرداند
- bmp.readAltitude (SEALEVELPRESSURE_HPA): تخمین ارتفاع را برمیگرداند
پس از درج فشار سطح دریا با توجه به موقعیت مکانی خود، می توانید کد را در برد خود آپلود کنید. در Arduino IDE خود، به Tools > Boards بروید و برد مورد استفاده خود را انتخاب کنید. سپس در Tools > Port، پورت COM را انتخاب کنید.
پس از آپلود، مانیتور سریال را با نرخ باود 115200 باز کنید. مقدار ها در سریال مانیتور مثل زیر چاپ می شوند.
توجه داشته باشید که اگر ارتفاع سنسور را افزایش دهید، در خواندن ارتفاع منعکس خواهد شد. تخمین ارتفاع بسیار دقیق است. می تواند تغییرات کوچک در محدوده سانتی متر یا اینچ را تشخیص دهد. BMP388 یک سنسور فشار کوچک و بسیار دقیق است که به شما امکان می دهد ارتفاع را با دقت زیادی تخمین بزنید. سنسور دما را نیز اندازه گیری می کند. برای ناوبری در فضای باز/داخلی، هواپیماهای بدون سرنشین، ایستگاه های هواشناسی و سایر برنامه ها عالی است.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود