کنترل وسایل از راه دور همیشه یکی از دغدغه های بشر بوده است. برای کنترل از راه دور راه های مختلفی اختراع شده است. یکی از راه های جالب کنترل از راه دور استفاده از قابلیت DTMF ماژول SIM800L است. در ادامه آموزش های راه اندازی ماژول SIM800L با میکروکنترلر STM32، در این آموزش قصد داریم تا نحوه کنترل وسایل از طریق قابلیت DTMF ماژول SIM800L با استفاده از میکروکنترلر STM32 را توضیح دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.
معرفی ماژول SIM800L
ماژول های سیم کارت مختلفی در بازار موجود است. یکی از محبوب ترین ماژول ماژول های سیم کارت، ماژول SIM800L است. این ماژول به دلیل اندازه کوچک، قیمت نسبتا مناسب و قابلیت های مختلفی که دارد بسیار محبوب شده است. با استفاده از این ماژول قادر خواهید بود همانند یک تلفن همراه به شبکه متصل شده و عملیات هایی مانند برقراری تماس، ارسال و دریافت پیامک و حتی اتصال به اینترنت را انجام دهید. این ماژول دارای یک اسلات سیم کارت است که سیم کارت از نوع mini درون آن قرار میگیرد. ماژول SIM800 را میتواند از طریق USART کنترل کنید. دو پایه RX و TX بر روی ماژول برای دریافت فرمان و ارسال داده از طریق USART وجود دارد. بر روی ماژول پایه هایی برای اتصال میکروفون و بلندگو نیز وجود دارد.
این ماژول در محدوده فرکانسی ۸۵۰/۹۰۰/۱۸۰۰/۱۹۰۰ فعال است. بنابراین، بدون هیچ مشکلی در ایران قابل استفاده خواهد بود. از طرفی دیگر، این ماژول ها به هیچ عنوان وارد طرح رجیستری نشده و بدون نیاز به فعال سازی آن در سامانه همتا، می توان با خیالی آسوده در پروژه های کنترل از راه دور، از این ماژول استفاده نمود.
شناخت DTMF مخابره سیگنال
کلمه DTMF مخفف شده عبارت Dual tone multi frequency یک روش مخابره سیگنال است. DTMF سیگنالی است که با فشردن هر کلید تلفن از جمع دو فرکانس مختلف تولید شده و به مرکز مخابراتی ارسال میشود. البته در تلفن های قدیمی از روش دیگری به نام Pulse برای تشخیص شماره در تلفن ها استفاده میشد. اما در تلفن هایی که امروزه مورد استفاده قرار میگیرند، از روش Tone برای تشخیص شماره استفاده میشود. در روش Tone هر کلید دارای دو فرکانس بصورت High group و Low group است. هر شماره، فرکانسهای از پیش تعیین شده مخصوص به خود را دارد. برای مثال عدد ۱ از فرکانس های ۶۹۷ و ۱۲۰۹ هرتز تشکیل شده است. برای درک بهتر این متلب به تصویر زیر توجه کنید.
کاربرد فناوری DTMF فقط به شماره گیری در تلفن های ثابت محدود نمیشود و کاربرد هایی فرا تر از این موضوع دارد. برای مثال وقتی با پشتیابنی اوپراتور های تلفن همراه تماس میگیرد. یک سیستم تلفن گویا پاسخ شمارا خواهد داد. احتمالا از شما خواسته شود برای برقراری ارتباط با کارشناس مربوطه یکی از عدد های موجود بر روی صفحه کلید را فشار دهید. اوپراتور مربوطه برای تشخیص عدد فشرده شده از فناوری DTMF استفاده میکند. این فناوری بسیار قابل اطمینان است و به سادگی دچار اختلال نمیشود. در این آموزش از این فناوری برای کنترل وضعیت چند رله استفاده میکنیم.
اتصالات پروژه DTMF با STM32
در این پروژه برای تغذیه ماژول SIM800L از یک آداپتور ۱۲ ولت ۲ آمپر به همراه ماژول کاهده ولتاژ LM2596 استفاده شده است. توجه داشته باشید که بایستی قبل از اتصال ماژول کاهنده به Sim800l با استفاده از مولتی ترن موجود بر روی ماژول کاهنده، ولتاژ کاری آن را بین ۳٫۷ تا ۴٫۲ ولت تنظیم کنید. اتصالات Sim800l به برد STM32 بصورت زیر است. همچینین در این پروژه بجای رله از LED برای مشاهده وضعیت خروجی ها استفاده کنید. شما میتوانید بجای LED از ماژول رله ۴ کانال استفاده کنید.
پیکربندی میکروکنترلر در STM32CubeMX
پس از ساخت پروژه جدید در نرم افزار STM32CubeMX مطابق بخش اول آموزش میکروکنترلر های STM32 بخش های RCC و SYS را تنظیم کنید. سپس یکی از USART ای میکروکنترلر را فعال کرده و باودریت آن را بر روی ۹۶۰۰ تنظیم کنید. سپس وارد بخش NVIC Setting شد و وقفه USAR را فعال کنید. در صورتی ک با بخش USART میکروکنترلر های STM32 آشنایی ندارید. بخش سوم و بخش چهارم آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس بایستی وارد بخش FREERTOS شده و گزینه interface را بر روی CMSS_V1 تنظیم کنید. پس از آن در بخش Config Parameter گزینه TOTAL_HEAP_SIZE را پیدا کنید. و مقدار آن را به ۸۱۹۲ Byes تغییر دهید. در آموزش آشنایی با سیستم های بلادرنگ مختصر توضیحاتی دربار سیستم عامل freeRTOS داد شد است. کتابخانه ای که جلوتر به شما معرفی خواهد شد. از ماژول های GSM هم خانواده Sim800l مانند Sim800c نیز پشتیبانی میکند. ب همین دلیل باید یکی از پایه های میکروکنترلر را بعنوان خروجی تعریف کنید. و لیبل “GSM_KEY” را برای آن قرار دهید. برای درک بهتر این مطلب به تصویر زیر توجه کنید.
سپس از صفحه Clock Configuration فرکانس کاری میکروکنترلر را بر روی ۷۲ مگاهرتز تنظیم کنید. سپس وارد صفحه ی Project Manager شوید. پس از انتخاب نام و IDE برای پروژه مقدار گزینه های Minimum Heap Size و Maximum Stack Size را بر روی ۰x400 تنظیم کنید. سپس در بخش Code Generator در قسمت Generated files تیک مربوط به گزینه Generate peripheral initialization as a pair of ‘.c/.h’ files per pripheral را بزنید.
سپس وارد قسمت Advanced Settings شده و در بخش Driver Selector بر روی گزینه USART کلیک کرده و آن را از HAL به LL تغییر دهید. و سپس بر روی گزینه GENERATE CODE کلیک کرده و وارد نرم افزار KEIL شوید.
کدنویسی پروژه در KEIL
ابتدا بایستی کتابخانه GSM module library را دانلود کرده و آن را به پروژه خود اضافه کنید. در صورتی که با نحوه اضافه کردن کتابخانه به پروژه آشنا نیستید. آموزش اضافه کردن کتابخانه به پروژه های STM32 را مطالعه کنید. سپس بایستی وارد فایل gsmConfig.h شده و شمار USART تعریف شده را همانند کد زیر در این فایل تعریف کنید.
// board config #define _GSM_DEBUG 0 #define _GSM_USART USART1 #define _GSM_POWERKEY_GPIO GSM_KEY_GPIO_Port #define _GSM_POWERKEY_PIN GSM_KEY_Pin
سپس وارد فایل stm32f3xx_it.c شده ابتدا بایستی کتابخانه gsm.h را به ابتدای این فایل اضافه کنید. و تابع void USART1_IRQHandler(void) را پیدا کنید. سپس دستور gsm_at_rxCallback() را همانند کد زیر داخل این تابع بنویسید.
void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ /* USER CODE BEGIN USART1_IRQn 1 */ gsm_at_rxCallback(); /* USER CODE END USART1_IRQn 1 */ }
در این پروژه از freeRTOS استفاده شده است. به همین دلیل بجای برنامه نویسی در فایل main.c بایستی کد خود را داخل فایل freertos.c بنویسید. تابع زیر را در این فایل پیدا کنید.
/* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for(;;) { osDelay(1); } /* USER CODE END StartDefaultTask */ }
برای راه اندازی ماژول Sim800l ابتدا بایستی کتابخانه gsm.h را به ابتدای فایل freertos.c اضافه کنید. سپس دستورات زیر را به تابع بالا قبل از حلقه for اضافه کنید.
gsm_init(osPriorityLow); gsm_waitForRegister(25);
دستور اول برای تنظیمات مربوط به ماژول است. تنظیماتی از جمله Task بخش مربوط به freeRTOS و اولویت Task و … دستور بعدی مدت زمان مشخصی را برای وارد شبکه شدن ماژول صبر میکند. سپس کد زیر را در برنامه خود قرار دهید.
#include "gsm.h" /* USER CODE END Header_StartDefaultTask */ uint8_t Flag,DTMF_Flag,DTMF_Val; void gsm_callback_newCall(char *number) { Flag=1; gsm_call_answer(); } void gsm_callback_endCall(void) { Flag=0; } void gsm_callback_dtmf(char key) { DTMF_Flag=1; DTMF_Val=key; } void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ gsm_init(osPriorityLow); gsm_waitForRegister(25); for(;;) { if(Flag ==1) { switch(DTMF_Val) { case '1': HAL_GPIO_TogglePin(output1_GPIO_Port,output1_Pin); break; case '2': HAL_GPIO_TogglePin(output2_GPIO_Port,output2_Pin); break; case '3': HAL_GPIO_TogglePin(output3_GPIO_Port,output3_Pin); break; case '4': HAL_GPIO_TogglePin(output4_GPIO_Port,output4_Pin); break; } DTMF_Flag=0; DTMF_Val=NULL; } osDelay(1); } /* USER CODE END StartDefaultTask */ }
در کد بالا پس از افزودن کتابخانه ماژول SIM800 به فایل تعدادی متغیر برای تشخیص تماس دریافتی و اعداد دریافت شده از DTMF تعریف شده است. سپس سه تابع Callback مشاهده میکنید. تابع اول برای تشخیص تماس های دریافتی است. پس از دریافت تماس جدید این تابع یک بار اجرا میشود. داخل این تابع ابتدا عدد یک را داخل متغیر Flag قرار داده و سپس دستور پاسخ دادن تماس را به ماژول ارسال میکنیم. در قسمت ورودی این تابع شماره تماس گیرنده قرار دارد. شما میتوانید در پروژه خود از این شماره استفاده نموده و آن را شرط قرار دهید، تا فقط شماره مد نظر شما پاسخ داده شود. تابع دوم برای زمانی است که تماس دریافتی از سمت کاربر قطع می شود. در این تابه مقدار متغیر Flag را صفر قرار میدهیم تا بتوانیم تماس های دریافتی بعدی را تشخیص دهیم. تابع سوم برای زمانی است که عددی از سمت DTMF (بخش کیپد در تماس های صوتی) ارسال میشود. در این تابع مقدار عدد دریافتی در متغیر DTMF_Val قرار داده شده و مقدار متغیر DTMF_Flag را برای تشخیص دریافت عدد برابر یک قرار میدهیم.
در ادامه وارد تابع اصلی میشویم. در ابتدا تنظیمات اولیه ماژول انجام شده و سپس با استفاده از دستور gsm_waitForRegister به مدت ۲۵ ثانیه منتظر ورود ماژول به شبکه میشویم. سپس برنامه وارد حلقه بی نهایت می شود. در ابتدای حلقه شرط تماس دریافتی قرار دارد. زمانی که ماژول تماسی دریافت کند این شرط برقرار میشود. داخل قسمت روتین این شرط از یک دستور switch برای تشخیص کلید زده شده استفاده شده است. داخل case ها دستور مربوط به تغییر وضعیت هر خروجی نوشته شده است. در آخر مقدار متغیر ها برای دریافت عدد بعدی برابر صفر قرار میگیرد.
عملکرد پروژه DTMF
عملکرد سیستم به این صورت است که پس تماس با شماره سیم کارت داخل ماژول SIM800L تماس به صورت خودکار پاسخ داده میشود. پس از برقراری ارتباط بایستی وارد بخش کیپد تماس شوید. در این قسمت با فشردن عدد های بین ۱ تا چهار رله مربوطه روشن و خاموش میشود.
جمع بندی
در قسمت های قبلی آموزش راه اندازی SIM800L با بخش های SMS و تماس این ماژول آشنا شدیم. در ابتدای این آموزش پس از معرفی ماژول SIM800L به معرفی DTMF پرداخیتم. نحوه اتصالات و پیکربندی میکروکنترلر برای راه اندازی ماژول SIM800L توضیح داده شد. سپس با استفاده از کتابخانه GSM module library کدی برای کنترل رله با استفاده از قابلیت DTMF نوشته شده است. در اخر کد به صورت کامل تحلیل شده و عملکرد پروژه توضیح داده شده است.
لوازم مورد نیاز
- پروگرامر STC Auto Programmer
- برد STM32 مدل F103C8T6 دارای تراشه ARM
- ماژول سیم کارت Sim800L با برد راه انداز
- ماژول مبدل تغذیه LM2596 کاهنده
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.
سلام . ممنون از زحماتتون
من هر کار میکنم ماژول به شبکه متصل نمیشه . وقتی مستقیم به سریال مانیتور لبتاب متصلش میکنم و روشنش میکنم بعضی مواقع یه لحظه به شبکه وصل میشه و مینویسه تماس و پیام اماده هست . بعد یهو ریست میشه . ولی وقتی سیم روش نیست خیلی راحت روشن میمونه و به دستورات پاسخ میده . از پاور کامپیوتر و ماژول ۲۵۹۶ استفاده کردم نشد ، با ادابتور ۸ ولت ۳ امپر هم نشد ، حتی با باتری لیتیوم پلیمر هم ریست میشه . خازن ۲۲۰۰ میکرو هم مستقیم رو پایه های تغذیش لحیم کردم که کمکی باشه برا جریان کشیش ولی بازم نتیجه نداد. ممنون میشم اگه راه حلی داشتین به منم بگین . ماژول من سیم ۸۰۰ ال و نسخه بلک ادیتیشن ۵ ولت هست
با سلام
در صورتی که جریان کافی به ماژول می رسد. قسمت مربوط به آنتن ماژول را بررسی کنید. از یک آنتن برای راه اندازی ماژول استفاده کنید.
سلام خسته نباشید
میشه برنامه شو به زبان C بفرستید ؟برام ؟؟
چون این زبانشو متوجه نمیشم
با سلام
زبان کد این پروژه ، زبان C است.
ممنونم ولی منظورم به صورت void setupو void loop هستش
به این صورت میشه راهنماییم بکنید که چیجوری بنویسم ؟؟؟؟؟
توابعی که شما میفرمایید مربوط به کامپایلر آردوینو میباشد. این برای برای میکروکنترلر STM32 نوشته شده است. با جستجو عبارت DTMF در سایت میتوانید این پروژه بر روی میکروکنترلر های آردیونو را نیز بیابید.
ارادت من میخواستم همین کار رو با sms انجام بدم یعنی با یک پیامک ال ای دی روشن و با یک پیامک دیگر ال ای دی خاموش شه چکار باید انجام بدم و اینکه اگه میشه برای کد نویسیش کمک نید ممنون میشم پاسخ بدین
با سلام
پیش از این، پروژه مورد نظر شما در آموزشی دیگر داخل سایت قرار داده شده است. که با کلیک بر روی لینک زیر میتوانید به آن دسترسی داشته باشید.
https://digispark.ir/stm32-sim800l-sms/