برد STM سیم کارت GSM - GPRS نمایشگر LCD

پروژه تماس تلفنی با ماژول سیم کارت SIM800L و میکروکنترلر STM32

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

پیش از این در آموزش ارسال و دریافت پیامک با ماژول سیم کارت Sim800l و میکروکنترلر STM32 ، نحوه راه اندازی ماژول Sim800l و ارسال و دریافت پیامک با استفاده از میکروکنترلرهای STM32 توضیح داده شده است. در این آموزش قصد داریم تا نحوه برقراری تماس تلفنی با Sim800L و پاسخ گویی به تماس‌های دریافتی را مورد بررسی قرار دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


ماژول SIM800L


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

Sim800l

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

 


برقراری تماس با ماژول SIM800L


برقراری تماس در ماژول های SIM800 پیچیدگی خاصی ندارد. در صورتی که ماژول به بتواند وارد شبکه شود. با استفاده از AT Command های مربوطه میتوانید تماس صوتی را برقرار کنید. برای آشنایی با AT Command های ماژول SIM800 بایستی بخش سوم آموزش راه اندازی و مار با ماژول سیم کارت SIM800 را مطالعه کنید. در این آموزش قصد بررسی AT Command های ماژول SIM800 را نداریم و برای برقراری تماس از توابع موجود در کتابخانه GSM module library استفاده میکنم. توابع مربوط به تماس در این کتابخانه عبارتند از؛

//###################################################################   call functions
bool gsm_call_answer(void);
bool gsm_call_end(void);
bool gsm_call_dial(const char* number, uint8_t waitSecond);
void gsm_callback_newCall(char *number);
void gsm_callback_endCall(void);

 

  • bool gsm_call_answer(void)

زمانی که با شماره داخل سیم کارت ماژول تماس گرفته شود. پس از تشخیص تماس (که در ادامه روش آن توضیح داده خواهد شد) با استفاده از این دستور میتوانید تماس را پاسخ داده و ارتباط را برقرار کنید. این تابع ورودی ندارد. و یک خروجی از نوع boolian دارد که خروجی آن مقدار true یا false خواهد بود. در صورتی که دستور به درستی به سمت ماژول ارسال شود و ماژول مقدار “ok” را بازگرداند. خروجی true و در غیر این صورت خروجی این تابع false خواهد بود.

 

  • bool gsm_call_end(void)

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

 

  • bool gsm_call_dial(const char* number, uint8_t waitSecond)

یکی از توابع مهم بخش تماس تابع gsm_call_dial است. با استفاده از این تابع می‌توانید با شمار مورد نظر خود تماس بگیرید. این تابع دارای ۲ ورودی است. این ورودی ها عبارتند از؛

ورودی اول که رشته ای از نوع کاراکتر است برای دریافت شماره ای که قصد تماس با آن را دارید است. به ۲ صورت میتوانید شماره مورد نظر خود را در این قسمت وارد کنید. میتوانید شماره خود را داخل دو عدد دابل‌کوتیشین (” “) قرار دهید (توجه داشته باشید که اگر قصد تماس گرفتن با شماره ثابت را دارید بایستی کد شهر را ابتدای آن قرار دهید). و یا روش دوم که کاربرد بیشتری در برنامه های بزرگ تر دارد استفاده  کنید. در این روش شماره مورد نظر را داخل رشته ای از نوع کاراکتر و با طول ۱۱ خانه ذخیره کرده. سپس رشته ای که شامل شماره مورد نظر است را در ورودی اول تابع قرار دهید. ورودی دوم این تابع، مدت زمانی است که در صورت عدم پاسخ به تماس ماژول منتظر خواهند ماند. برای مثال این ورودی را برابر عدد ۲۵ قرار می‌دهیم.

 

  • void gsm_callback_newCall(char *number)

این تابع در فایل gsmCallback.c قرار دارد. زمانی که با شماره سیم کارت داخل ماژول تماس گرفته شود. این تابع یک بار فراخوانی خواهد شد و دستورات داخل آن اجرا می‌شود. می‌توانید از این تابع برای تشخیص تماس  استفاده نموده و شرط بررسی شماره را با استفاده از پوبنتر موجود در ورودی تابع  مورد بررسی قرار داده و سپس در صورتی که شماره مورد تایید بود با استفاده از دستور gsm_call_answer تماس را پاسخ داده و یا با استفاده از دستور gsm_call_end تماس را رد کنید.

 

  • void gsm_callback_endCall(void)

این تابع نیز در فایل gsmCallback.c قرار دارد. این تابع زمانی فرا خوانده خواهد شد که تماس قطع شود. کاربرد این تابع زمانی است که شما پس از تماس نیاز به انجام عمل خاصی داشته باشید و یا قصد پاک کردن مقدار متغیر ها و پرچم های آن را داشته باشد. در ادامه داخل کد پروژه با نحوه استفاده تمامی توابع آشنا می‌شوید.

 


اتصالات پروژه


در این آموزش برحلاف آموزش قبل رله ای وجود ندارد. البته شما میتوانید با توجه به نیاز پروژه ی خود به این مدار رله اضافه کنید و با تماس از شماره خاصی رله خاموش و روشن شود. اتصالات این پروژه به صورت زیر است. برای تغذیه ماژول SIM800L میتوانید از یک اداپتور ۱۲ ولت با جریان حداقل ۲ آمپر به همراه ماژول تغذیه کاهنده LM2596 استفاده کنید. توجه داشته باشید که بایستی قبل از اتصال ماژول کاهننده به SIM800L حتما خروجی آن را بروی ۴٫۲ ولت تنظیم نموده و سپس به SIM800L متصل کنید.

Schematic

 

در این پروژه میکروفون و بلند گویی به ماژول SIM800L متصل شده است (توجه داشته باشید برای این که کیفیت صدای مناسب تری نیاز دارید بایستی تقویت کننده و فیلتر های مناسبی در بخش خروجی بلندگو و ورودی میکروفون اضافه کنید).

 


پیکربندی پروژه در نرم افزار STM32CubeMX


تنظیمات مربوط به این بخش همانند آموزش قبلی انجام می‌شود. ابتدا داخل نرم افزار STM32CubeMX پروژه جدید ساخته و سپس میکروکنترلر STM32F103C8T6 را انتخاب کنید. در صورتی که با نحوه ساخت پروژه جدید و انتخاب میکروکنترلر آشنایی ندارید. بخش اول آموزش میکروکنترلرهای STM32 را مطالعه کنید. سپس بخش های RCC و SYS را تنظیم کنید. پس از آن یکی از USART ای میکروکنترلر را فعال کرده و باودریت آن را بر روی ۹۶۰۰ تنظیم کنید. سپس وارد بخش NVIC Setting شده و وقفه USART را فعال کنید. در صورتی ک با بخش USART میکروکنترلر های STM32 آشنایی ندارید. بخش سوم و بخش چهارم آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس بایستی وارد بخش FREERTOS شده و گزینه interface را بر روی CMSS_V1 تنظیم کنید. پس از آن در بخش Config Parameter گزینه TOTAL_HEAP_SIZE را پیدا کنید. و مقدار آن را به ۸۱۹۲ Byes تغییر دهید. در آموزش آشنایی با سیستم های بلادرنگ مختصر توضیحاتی دربار سیستم عامل freeRTOS داده شده است. یکی از پایه های میکروکنترلر را به عنوان خروجی تعریف کنید. و لیبل “GSM_KEY” را  برای آن قرار دهید. برای درک بهتر این مطلب به تصویر زیر توجه کنید.

Pinout

 

سپس از صفحه 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 به برد STM32 ابتدا بایستی کتابخانه gsm.h را به ابتدای فایل freertos.c اضافه کنید. سپس دستورات زیر را به تابع بالا قبل از حلقه for اضافه کنید.

gsm_init(osPriorityLow);
gsm_waitForRegister(25);

دستور اول برای تنظیمات مربوط به ماژول است. تنظیماتی از جمله Task بخش مربوط به freeRTOS و اولویت Task و … دستور بعدی مدت زمان مشخصی را برای وارد شبکه شدن ماژول صبر می‌کند. در ادامه، کد پروژه را مشاهده می‌کنید. زیر را بایستی در فایل freertos.c قرار دهید.

char Number[13];

void gsm_callback_newCall(char *number)
{
	for(uint8_t i=0;i<13;i++)Number[i]=number[i];
	osDelay(2000);
	gsm_call_end();
}

void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
	gsm_init(osPriorityLow);
	gsm_waitForRegister(25);
  for(;;)
  {
		if(HAL_GPIO_ReadPin(key_GPIO_Port,key_Pin) == 0)
		{
			gsm_call_dial(Number,25);
		}
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

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

 


جمع بندی


ماژول Sim800l از محبوب ترین ماژول های GSM موجود در بازار است. که به دلیل هزینه کم و امکانات زیاد، بسیار مورد توجه قرار گرفته است. در ادامه آموزش ارسال و دریافت پیامک با SIM800L و میکروکنترلر STM32 در این آموزش قابلیت تماس این ماژول را بررسی قرار دادیم. در ادامه به شناخت توابع مربوط به تماس موجود در کتابخانه GSM module library پرداختیم. سپس نحوه پیکربندی پروژه در نرم افزار STM32CubeMX توضیح داده شد. در آخر کد پروژه تحلیل شد.

Cirquit

 


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


 

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

 

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

 

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

علی زاهدی

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

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

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

۱۶ دیدگاه

  • با عرض سلام و تشکر . اگر بخوایم شماره ای که داخل number[] ذخیره شده رو تغییر بدیم آیا با تماس گرفتن از سیم کارت جدید دیگر شماره قبلی که ذخیره شده بود پاک میشه و جایگزین بشه ؟

    • با سلام
      بله! زمانی که با شماره جدیدی به سیم کارت موجود داخل ماژول تماس بگیرین. شماره ذخیره شده در number با شماره جدید جایگزین خواهد شد.

        • با سلام
          راه های مختلفی برای این کار وجود داره. میشه برای دستگاه keypad قرار داد تا شماره بصورت دستی وارد بشه و قبل از تعریف شماره ادمین بایستی رمز سیستم رو وارد کنه تا بتونه وارد بخش تنظیم شماره بشه.

      • اگر بخوایم شماره ذخیره بشه و به عنوان ادمین ذخیره شه چطور ؟ و اینکه چه راهی وجود داره که بخوایم تغییر بدیم شماره ادمین رو ممنونم

        • با تعریف کردن یک رشته دیگر و استفاده از دستور for برای ذخیره شماره دریافتی از تابع در رشته ساخته شده. بصورت کد زیر میشود شماره را ذخیره کرد (رشته Admin_number رشته ای است که قست ذخیره شماره داخل آن را داریم).
          for(int i=0;i<11;i++)
          Admin_number[i]=number[i];

            • با سلام
              فرض کنید دستگاهی که طراحی کردین دارای keypad هست و شما قسمتی را برای تغییر رمز دستگاه قرار داده اید. با توجه به این مود در قسمت پیامک شما برنامه را بایستی طوری بنویسید که برای تغییر شماره ادمین کاربر بایستی در متن پیام با فرمت خاصی رمز را ارسال کند. و در ادامه شماره جدید را داخل متن پیام قرار دهد. و شما داخل برنامه پس از دریافت پیامک و شرط قرار دادن رمز با دستور for شماره دریافت شده را داخل رشته ای دیگر ذخیره کنید. و در ادامه از این شماره استفاده کنید. برای اطلاعات بیشتر پیشنهاد میکنم دفترچه راهنمای سیستم های امنیتی اماکن را مطالعه کنید.

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

    • با سلام با استفاده از ماژول های مختلفی میتوانید این کار را انجام دهید. بهترین گزینه ها برای این کار استفاده از آیسی های ISD و یا ماژول DF Player است.

  • سلام خسته نباشید
    من این اموزش رو کامل انجام میدم ولی فایل خروجی رو برام نمیسازه keil و این ارور رو میده
    (FCARM- Output Name not specified , please check option Target not created . Build Time Elapsed : 00:00:00 for Target Utilities)

  • سلام خسته نباشید من این اموزش رو کامل انجام میدم در اخر فایل خروجی رو نمیسازه ارور میده ممنون میشم کمکم کنید
    Rebuild started: Project: sim800-2
    *** Using Compiler ‘V5.06 update 7 (build 960)’, folder: ‘C:\Keil_v5\ARM\ARMCC\Bin’
    Rebuild target ‘sim800-2’
    FCARM – Output Name not specified, please check ‘Options for Target – Utilities’
    Target not created.
    Build Time Elapsed: 00:00:01

  • سلام
    وقت بخیر
    میشه از freertos استفاده نکنیم چون برای استفاده از آن باید حتما باید میکرو اورجینال باشه ما هم نمی تونمی پیدا کنیم کپی هستند

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