برد STM سیم کارت GSM - GPRS

پروژه کنترل وسایل از طریق DTMF ماژول SIM800L و میکروکنترلر STM32

نوشته شده توسط علی زاهدی

کنترل وسایل از راه دور همیشه یکی از دغدغه های بشر بوده است. برای کنترل از راه دور راه های مختلفی اختراع شده است. یکی از راه های جالب کنترل از راه دور استفاده از قابلیت DTMF ماژول SIM800L است. در ادامه آموزش های راه اندازی ماژول SIM800L با میکروکنترلر STM32، در این آموزش قصد داریم تا نحوه کنترل وسایل از طریق قابلیت DTMF ماژول SIM800L با استفاده از میکروکنترلر STM32 را توضیح دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


معرفی ماژول SIM800L


ماژول های سیم کارت مختلفی در بازار موجود است. یکی از محبوب ترین ماژول ماژول های سیم کارت، ماژول SIM800L است. این ماژول به دلیل اندازه کوچک، قیمت نسبتا مناسب و قابلیت های مختلفی که دارد بسیار محبوب شده است. با استفاده از این ماژول قادر خواهید بود همانند یک تلفن همراه به شبکه متصل شده و عملیات هایی مانند برقراری تماس، ارسال و دریافت پیامک و حتی اتصال به اینترنت را انجام دهید. این ماژول دارای یک اسلات سیم کارت است که سیم کارت از نوع mini درون آن قرار میگیرد. ماژول SIM800 را میتواند از طریق USART کنترل کنید. دو پایه RX و TX بر روی ماژول برای دریافت فرمان و ارسال داده از طریق USART وجود دارد. بر روی ماژول پایه هایی برای اتصال میکروفون و بلندگو نیز وجود دارد.

Sim800l

این ماژول در محدوده فرکانسی ۸۵۰/۹۰۰/۱۸۰۰/۱۹۰۰ فعال است. بنابراین، بدون هیچ مشکلی در ایران قابل استفاده خواهد بود. از طرفی دیگر، این ماژول ها به هیچ عنوان وارد طرح رجیستری نشده و بدون نیاز به فعال سازی آن در سامانه همتا، می توان با خیالی آسوده در پروژه های کنترل از راه دور، از این ماژول استفاده نمود.

 


شناخت DTMF مخابره سیگنال


کلمه DTMF مخفف شده عبارت Dual tone multi frequency یک روش مخابره سیگنال است. DTMF سیگنالی است که با فشردن هر کلید تلفن از جمع دو فرکانس مختلف تولید شده و به مرکز مخابراتی ارسال می‌شود. البته در تلفن های قدیمی از روش دیگری به نام Pulse برای تشخیص شماره در تلفن ها استفاده می‌شد. اما در تلفن هایی که امروزه مورد استفاده قرار می‌گیرند، از روش Tone برای تشخیص شماره استفاده می‌شود. در روش Tone هر کلید دارای دو فرکانس بصورت High group و Low group است. هر شماره‌، فرکانس‌های از پیش تعیین شده مخصوص به خود را دارد. برای مثال عدد ۱ از فرکانس های ۶۹۷ و ۱۲۰۹ هرتز تشکیل شده است. برای درک بهتر این متلب به تصویر زیر توجه کنید.

DTMF

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

 


اتصالات پروژه DTMF با STM32


در این پروژه برای تغذیه ماژول SIM800L از یک آداپتور ۱۲ ولت ۲ آمپر به همراه ماژول کاهده ولتاژ LM2596 استفاده شده است. توجه داشته باشید که بایستی قبل از اتصال ماژول کاهنده به Sim800l با استفاده از مولتی ترن موجود بر روی ماژول کاهنده، ولتاژ کاری آن را بین ۳٫۷ تا ۴٫۲ ولت تنظیم کنید. اتصالات Sim800l به برد STM32 بصورت زیر است. همچینین در این پروژه بجای رله از LED برای مشاهده وضعیت خروجی ها استفاده کنید. شما میتوانید بجای LED از ماژول رله ۴ کانال استفاده کنید.

Schematic

 


پیکربندی میکروکنترلر در 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” را  برای آن قرار دهید. برای درک بهتر این مطلب به تصویر زیر توجه کنید.

پیکربندی میکروکنترلر STM32 - دیجی اسپارک

 

سپس از صفحه 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 را بزنید.

stm32cubemx Setting

 

سپس وارد قسمت Advanced Settings شده و در بخش Driver Selector بر روی گزینه USART کلیک کرده و آن را از HAL به LL تغییر دهید. و سپس بر روی گزینه GENERATE CODE کلیک کرده و وارد نرم افزار KEIL شوید.

STM32 Cube Mx Advanced settingg

 


کدنویسی پروژه در 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 را برای تشخیص دریافت عدد برابر یک قرار می‌دهیم.

Call_Keypad

در ادامه وارد تابع اصلی می‌شویم. در ابتدا تنظیمات اولیه ماژول انجام شده و سپس با استفاده از دستور gsm_waitForRegister به مدت ۲۵ ثانیه منتظر ورود ماژول به شبکه می‌شویم. سپس برنامه وارد حلقه بی نهایت می شود. در ابتدای حلقه شرط تماس دریافتی قرار دارد. زمانی که ماژول تماسی دریافت کند این شرط برقرار می‌شود. داخل قسمت روتین این شرط از یک دستور switch برای تشخیص کلید زده شده استفاده شده است. داخل case ها دستور مربوط به تغییر وضعیت هر خروجی نوشته شده است. در آخر مقدار متغیر ها برای دریافت عدد بعدی برابر صفر قرار می‌گیرد.

 


عملکرد پروژه DTMF


عملکرد سیستم به این صورت است که پس تماس با شماره سیم کارت داخل ماژول SIM800L تماس به صورت خودکار پاسخ داده می‌شود. پس از برقراری ارتباط بایستی وارد بخش کیپد تماس شوید. در این قسمت با فشردن عدد های بین ۱ تا چهار رله مربوطه روشن و خاموش می‌شود.

DTMF_Circuit

 


جمع بندی


در قسمت های قبلی آموزش راه اندازی SIM800L با بخش های SMS و تماس این ماژول آشنا شدیم. در ابتدای این آموزش پس از معرفی ماژول SIM800L به معرفی DTMF پرداخیتم. نحوه اتصالات و پیکربندی میکروکنترلر برای راه اندازی ماژول SIM800L توضیح داده شد. سپس با استفاده از کتابخانه GSM module library کدی برای کنترل رله با استفاده از قابلیت DTMF نوشته شده است. در اخر کد به صورت کامل تحلیل شده و عملکرد پروژه توضیح داده شده است.

 


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


 

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

 

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

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

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

۸ دیدگاه

  • سلام . ممنون از زحماتتون
    من هر کار میکنم ماژول به شبکه متصل نمیشه . وقتی مستقیم به سریال مانیتور لبتاب متصلش میکنم و روشنش میکنم بعضی مواقع یه لحظه به شبکه وصل میشه و مینویسه تماس و پیام اماده هست . بعد یهو ریست میشه . ولی وقتی سیم روش نیست خیلی راحت روشن میمونه و به دستورات پاسخ میده . از پاور کامپیوتر و ماژول ۲۵۹۶ استفاده کردم نشد ، با ادابتور ۸ ولت ۳ امپر هم نشد ، حتی با باتری لیتیوم پلیمر هم ریست میشه . خازن ۲۲۰۰ میکرو هم مستقیم رو پایه های تغذیش لحیم کردم که کمکی باشه برا جریان کشیش ولی بازم نتیجه نداد. ممنون میشم اگه راه حلی داشتین به منم بگین . ماژول من سیم ۸۰۰ ال و نسخه بلک ادیتیشن ۵ ولت هست

    • با سلام
      در صورتی که جریان کافی به ماژول می رسد. قسمت مربوط به آنتن ماژول را بررسی کنید. از یک آنتن برای راه اندازی ماژول استفاده کنید.

        • توابعی که شما می‌فرمایید مربوط به کامپایلر آردوینو می‌باشد. این برای برای میکروکنترلر STM32 نوشته شده است. با جستجو عبارت DTMF در سایت میتوانید این پروژه بر روی میکروکنترلر های آردیونو را نیز بیابید.

  • ارادت من میخواستم همین کار رو با sms انجام بدم یعنی با یک پیامک ال ای دی روشن و با یک پیامک دیگر ال ای دی خاموش شه چکار باید انجام بدم و اینکه اگه میشه برای کد نویسیش کمک نید ممنون میشم پاسخ بدین