برد ESP8266

طراحی و پیاده‌سازی سامانه هوشمند تشخیص سرقت و تصادف خودرو

car-thief-detector-with-esp8266-adxl345-and-sim800-sms-module-digispark
نوشته شده توسط معین صابری

از زمان اختراع و به کارگیری خودروهای سواری، این محصول همواره یکی از کاراترین وسایل در حمل و نقل به شمار می‌آید؛ تا حدی که می‌توان با قاطعیت اعلام کرد که اکثر قریب به یقین خانوارهای ایرانی، دارای یک خودرو هستند. حتی در موارد بسیاری می‌بینیم که بعضی از خانوارها، بیش از یک خودرو دارند. اگر در روزگاری، نبود خودرو در یک خانواده امری عادی تلقی می‌شد، امروز وجود آن بسیار ضروری است. از آنجاییکه به خودرو می‌توان به عنوان یک کالای سرمایه‌ای هم نگریست، پس حفاظت از آن در برابر سرقت خودرو و تصادفات، امری مهم به شمار می‌رود. تصور کنید خودروی خود را برای مدت طولانی در خیابان پارک کرده‌اید. در صورتیکه به هر دلیل، از جمله سرقت و یا حمل با جرثقیل خودرو شما به حرکت درآید، خورو به صورت کاملا هوشمند، با برقراری تماس تلفنی، شما را از وضعیت پیش آمده مطلع سازد. یا هنگامی که خودروی شما در پارک است، و خودروی دیگری با شدت به خودروی شما اصابت نماید. حتی  در این حالت، خودرو هوشمندانه از وضعیت مطلع شده و باز هم با برقراری تماس تلفنی، صاحب خودرو از وضعیت پیش آمده، آگاه می‌گردد. در ادامه، به تشریح نحوه طراحی و پیاده‌سازی این سامانه، خواهیم پرداخت.

 


پردازشگر مرکزی تشخیص سرقت خودرو


قبل از شروع، لازم است موضوعی مهم را در این باره در نظر داشته باشید. در پروژه اعلام سرقت خودرو، بر خلاف عادت معمول در استفاده از آردویینو و یا میکروکنترلرهای avr و یا arm، از ماژول وای فای esp8266-12e به عنوان واحد پردازشگر مرکزی، استفاده کرده‌ایم. این ماژول در کنار قیمت مناسب خود، از حافظه فلش ۵۱۲ کیلوبایتی به صورت پیشفرض بهره می‌برد که دراین ماژول، حافظه تا ۱۶ مگابایت افزایش یافته است. همچنین فرکانس پردازنده ۴۰ مگاهرتز بوده که تا ۸۰ مگاهرتز قابل افزایش است. کلیه این تنظیمات در نرم‌افزار آردویینو قابل دسترسی است که پیش از آن می‌بایست ملزومات آن، طبق آموزش‌های مطرح شده در دیجی اسپارک، تهییه گردد. نکته جالب توجه این که با نصب پکیج‌های مربوطه در نرم افزار آردویینو، می‌توانید به سادگی با همان زبان برنامه‌نویسی آردویینو، برای این ماژول قدرتمند، برنامه بنویسید.

پروگرام کردن ماژول ESP8266-12X - دیجی اسپارک


سنسور شتاب سنج در سرقت خودرو


به منظور تشخیص تصادف، حرکت و سرقت خودرو، از سنسور شتاب‌سنج ADXL345 با خروجی دیجیتال بر مبنای پروتکل دو سیمه و یا I2C استفاده کرده‌ایم. به کمک این سنسور، می‌توانیم از حرکت و دوران جسم مورد نظر که در اینجا خودرو است، مطلع گردیم. این مکانیزم به این صورت است که در ابتدا، ما شتاب اندازه‌گیری شده در محورهای X,Y,Z را از سنسور می‌خوانیم. در ادامه، مجددا اطلاعات سنسور را خوانده و با اطلاعات اولیه مقایسه می‌کنیم و در صورت وجود هرگونه تفاوت با مقادیر اولیه، حرکت را تشخیص می‌دهیم. در تصویر زیر یک نمونه از ماژول تشخیص شتاب با تراشه ADXL345 را مشاهده می‌کنید.

آموزش راه اندازی ماژول ADXL345 با استفاده از آردوینو

 


ماژول سیم کارت در سرقت خودرو


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

 


اتصلات مدار تشخیص سرقت خودرو


تا اینجا با سنسورها و ماژول‌های مورد استفاده در این آموزش، آشنا شدید. حال نوبت به اتصالات سخت افزاری مدار می‌رسد. به شماتیک زیر دقت کنید. اتصلات نهایی مدار به روش زیر خواه بود. پایه‌های GPIO5 و GPIO4 به عنوان رابط I2C به ماژول ADXL متصل می‌شوند. پایه‌های ارتباط سریال ماژول سیم کارت هم مانند تصویر باید متصل شوند. مدار XL6009 به عنوان یک افزاینده در این مدار نقش مهمی دارد.

شماتیک مدار سامانه هوشمند اعلام سرقت و تصادف خودرو - دیجی اسپارک

 


توضیح کدهای پروژه با ESP8266


در ابتدای برنامه، کتابخانه‌های مربوط به ارتباط دو سیمه را به پروژه اضافه می‌نماییم. سپس به کمک سریال نرم‌افزاری، پایه‌های ۱۲ و ۱۳ ماژول وای فای را به عنوان سریال نرم‌افزاری از نوع UART، تعیین می‌نماییم. سپس در تابع setup، تنظیمات مربوط به ارتباط سریال و  سنسور شتاب سنج را انجام می‌دهیم. در انتهای این تابع، به کمک تابع get_accl() که در برنامه تعریف کرده‌ایم، اطلاعات مربوط به سنسور شتاب سنج را می‌خوانیم. با فراخوانی این تابع؛ اطلاعات مربوط به شتاب در محورهای x,y,z در متغیرهای X_out و Y_out و Z_out که به صورت عمومی (GLOBAL) تعریف کرده‌ایم؛ ذخیره می‌گردد. ما این اطلاعات را در متغیرهای x,y,z که نیز به صورت عمومی تعریف کرده‌ایم، ذخیره می‌نماییم. سپس به مدت ده ثانیه صبر کرده و وارد تابع loop می‌شویم. در تابع loop، به طور مداوم تابع get_accl() را فراخوانی می‌نماییم و مقادیر به دست آمده را با مقادیر اولیه x,y,z مقایسه می‌کنیم. در صورت وجود اختلافی بیش از ۰٫۱ واحد، به کمک ارسال دستور atd به ماژول سیم کام، با کاربر تماس برقرار خواهیم نمود.

#include <SPI.h>
#include <Wire.h>
#include <SoftwareSerial.h>
SoftwareSerial gsm(12,13);
//****************************************************************************
int ADXL345 = 0x53; //  ADXL345  I2C address
float X_out, Y_out, Z_out;  // خروجی سنسور
float x, y, z;//ثبت آخرین مقدار سنسور جهت مقایسه های بعدی//
void setup() {
  gsm.begin(9600);//تنظیم ارتبط سریال برای ارتباط با gsm//
  Serial.begin(9600); // تنظیم نرخ تبادل داده سریال//
  Wire.begin(); // آماده سازی کتابخانه i2c جهت ارتباط با سنسور شتاب سنج//
  // Set ADXL345 in measuring mode
  Wire.beginTransmission(ADXL345); //برقراری ارتباط با سنسور از طریق ارسال آدرس آن روی باس i2c//
  Wire.write(0x2D); 
  // Enable measurement
  Wire.write(8); // ارسال داده جهت فعال سازی و دریافت داده از سنسور
  Wire.endTransmission();
  delay(10);
  //******************************************************************************
  get_accl();
  x = X_out;
  y = Y_out;
  z = Z_out;
  Serial.println(x);
  Serial.println(y);
  Serial.println(z);
  delay(5000);
  delay(5000);
}
void loop() {
  float diff_x, diff_y, diff_z;
  diff_x = 0;
  diff_y = 0;
  diff_z = 0;
  get_accl();
  delay(100);
  //*****************************************
  diff_x = X_out - x;
  if (diff_x < 0)
    diff_x = diff_x * -1;
  //*****************************************
  diff_y = Y_out - y;
  if (diff_y < 0)
    diff_y = diff_y * -1;
  //************************************
  diff_z = Z_out - z;
  if (diff_z < 0)
    diff_z = diff_z * -1;
  //*****************************************
  Serial.println(diff_x);
  Serial.println(diff_y);
  Serial.println(diff_z);
  Serial.println("----------------------");
  delay(500);
  if (diff_x > 0.1 || diff_y > 0.1 || diff_z > 0.1) {
    gsm.print("atd*****************;\r\n");// برقراری تماس تلفنی که میبایست به جای ستاره ها، شماره تلفن خود را قرار دهید//
    delay(5000);
  }
}
void get_accl() {
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32); // شروع خواندن داده از سنسور به طوریکه خواندن از محور x شروع می گردد//
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true);
  /*
     شش رجیستر باید از سنسور شتاب سنج خوانده شود، چرا که اطلاعات هر محور در دو رجیستر ذخیره می گردد
  */
  X_out = ( Wire.read() | Wire.read() << 8); //x
  X_out = X_out / 256; //
  /*
     بر مبنای دیتاشیت سنسور، عدد هر محور باید بر ۲۵۶ تقسیم گردد
  */
  Y_out = ( Wire.read() | Wire.read() << 8); //y
  Y_out = Y_out / 256;
  Z_out = ( Wire.read() | Wire.read() << 8); // Z
  Z_out = Z_out / 256;
  //**************************************
}

 


تغذیه سامانه تشخیص سرقت خودرو


در این بخش، به قسمتی مهم، یعنی تغذیه می‌رسیم. همانطور که مستحضر هستید، در این پروژه قصد داریم تا در زمانیکه تصادف شدید و یا حرکتی در خودرو تشخیص داده شد، به کاربر از طریق برقراری تماس تلفنی اطلاع داده شود. حسن تماس تلفنی در برابر پیامک این است که معمولا کاربران به پیامک توجه آنچنانی نمی‌نمایند، اما غالبا تماس تلفنی از اهمیت بیشتری برخوردار خواهد بود. به منظور تشخیص حرکت، از یک سنسور شتاب سنج adxl345 با خروجی دیجیتال استفاده نموده‌ایم که پس از تشخیص حرکت، به کمک یکی از ماژول‌های شرکت سیم کام، که در اینجا از ماژول sim800c استفاده شده و به سادگی قابل جایگزینی با ماژول‌های دیگر نظیر sim800l است، با کاربر تماس برقرار می‌نماییم. این ماژول‌ها به شدت به تغذیه حساس بوده و  دارای پیک جریان ۲ آمپر هستند، و به همین دلیل، ما دراین پروژه از یک باتری لیتیم یون با ظرفیت مناسب استفاده نموده‌ایم. حتی در جهت اطمینان بیشتر، از یک خازن با ظرفیت ۴۷۰۰ میکروفاراد، به صورت موازی با تغذیه ماژول سیم کام، استفاده نموده‌ایم. نکته جالب آنکه محدوده مجاز تغدیه ماژول‌های سیم کام در حدود ۳٫۴ الی ۴٫۳ ولت است که دقیقا با ولتاژ باتری همخوانی داشته و از این رو نیازی به استفاده از رگولاتور جانبی نیست. اما، از آنجاییکه ولتاژ تغذیه ماژول esp8266-12e برابر با ۳٫۳ ولت بوده و از طرفی دیگر  ولتاژ باتری به طور مداوم، تحت بار، در حال کاهش است، نیاز است تا ولتاژ ماژول وای فای، ثابت باشد. بنابراین، جهت ایجاد یک ولتاژ تغذیه ثابت و قابل اطمینان، ابتدا به کمک ماژول xl6009 که یک رگولاتور افزاینده است، ولتاژ باتری را به ۵ ولت می‌رسانیم. سپس، به کمک یک رگولاتور ۳٫۳ ولتی نظیر رگولاتور خطی lf33، ولتاژ ۳٫۳ پایداری را برای ماژول وای فای خواهیم ساخت.

 


روال کلی کار


به صورت کلی، روند دستگاه اعلام سرقت خودرو به این صورت خواهد بود که در ابتدا، زمانیکه دستگاه روشن می‌گردد، اطلاعات مربوط به شتاب و یا به عنوان بهتر، نحوه قرار گرفتن دستگاه در جهت محورهای X,Y,Z از سنسور شتاب سنج خوانده می‌شود. البته، پس از روشن شدن، دستگاه، با ایجاد یک تاخیر ده ثانیه‌ای، به کاربر زمان می‌دهد تا آن را در جای مورد نظر، فیکس نماید. در این حال، اطلاعات مربوط به سنسور شتاب سنج، در متغیرهای x,y,z ذخیره می‌گردد. پس از آن، در حلقه تکرار بی‌نهایت loop، به طور مداوم اطلاعات مربوط به سنسور شتاب‌سنج به کمک تابع get_accl() خوانده می‌شود و با مقادیر نخستین، یعنی x,y,z مقایسه می‌شود و در صورتیکه مقدار خوانده شده با مقدار اولیه، تفاوتی بیش از ۱٫۰ واحد داشته باشد، یعنی دستگاه و یا به عبارتی خودروی مورد نظر، به حرکت درآمده است.

 


وسایل مورد نیاز


ماژول سیم کارت SIM800

ماژول شتاب سنج ADXL

مبدل افزاینده XL6009

ماژول ESP8266-12E

 


نکات مهم راه اندازی ماژول ESP8266-12e


همانطور که مستحضر هستید، پروگرام کردن ماژول ESP8266-12E، کمی با بردهای آردوینو متفاوت است. جهت پروگرام کردن این ماژول، می‌بایست در ابتدا پایه GPIO0 زمین گردد؛ سپس ماژول به کمک پایه RESET، ریست شود تا به مد پروگرام وارد شود. دقت داشته باشید که پس از این مرحله، اتصال پایه GPIO0 به زمین می‌بایست برداشته شود تا در صورت راه‌اندازی مجدد، ماژول به مد پروگرام وارد نشود. جهت آشنایی بیشتر با نحوه پروگرام کردن این ماژول، می‌توانید به آموزش آپلود کدها روی ماژول وای فای با تراشه ESP8266 نسخه ۱۲X مراجعه نمایید.

 

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

 

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

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۵ دیدگاه

    • سلام، اشتباه تایپی بود، منظور GPIO 5 بود که همینک این اشتباه اصلاح شد.
      با سپاس از توجه شما

  • با سلام ، ضمن سپاس از پروژه بسیار خوبتان …
    خواستم بدانم آیا امکان پیاده سازی این پروژه با Node Mcu CH340 هم امکان پذیر میباشد ؟!
    اگر پاسخ مثبت است لطفا بفرمایید به کدام پایه های این برد باید اتصالات را برقرار نماییم ؟!
    البته اگر زحمتی نیست و پیشاپیش تشکر فراوان دارم از شما

    • عرض احترام حضور شما کاربر گرامی
      از اینکه این مطالب را مفید یافته اید، صمیمانه سپاسگزارم
      امکان پیاده سازی این پروژه با nodemcu نیز کاملا میسیر است،در حقیقت برد nodemcu نمونه توسعه یافته برد استفاده شده در این پروژه بوده که دسترسی به پایه های بیشتر همراه با محدوده ولتاژ بیشتری را برای کاربر فراهم می آورد. برای اتصال پایه سنسور شتاب سنج به nodemcu، دقیقا پایه های سنسور را به پایه های GPIO5 و GPIO4 برد NODEMCU خود متصل نمایید، همچنین، پایه Rx ماژول سیم کارت خود را به پایه GPIO13 برد NODEMCU متصل نمایید. برای بحث تغذیه نیز، با توجه به برد مورد استفاده خود، بررسی کنید که آیا امکان اتصال ولتاژ ۳٫۳ دریافت شده از رگولاتور LF33 این پروژه، به پایه ۳V برد NODEMCU وجود دارد یا خیر.

  • با درود و ادب
    چه اطلاعاتی از طریق اینترنت سیمکارت قابل ارسال است؟ با چه حجمی و برای چه مقصدی؟

    • سلام
      هر دیتایی، مثل متن و حتی عکس! حجم بستگی به توان اینترنت ماژول دارد. مثلا ماژول SIM800L دارای سرعت اینترنت GPRS است و باید داده ها متناسب با این مورد ارسال شوند.