تقریبا میتوان گفت اسم شرکت کویکتل و ماژول های قدرتمند این شرکت به وفور به گوش علاقمندان فعال در حوزه الکترونیک رسیده، بالاخص برای دوستانی که در زمینه راه اندازی GSM کار میکنند. در این آموزش قصد داریم که ماژول قدرتمند MC60 شرکت کویکتل را توسط آردوینو راه اندازی کنیم.
توصیه میکنم حتما مقاله ماژول های کوئکتل – کویکتل و قابلیت خارق العاده OpenCPU را بخوانید تا با ماژول های قدرتمند شرکت کویکتل بیشتر آشنا شوید.
برای راه اندازی این ماژول در این قسمت از پروژه های آردوینو حداقل باید موارد زیر در دسترس باشند تا بتوان آن را را راه اندازی کرد.
- برد آموزشی آردوینو (از هر نوعی بود فرقی نداره)
- برد آموزشی ماژول MC60
- کدنویسی برای برقراری ارتباط با این ماژول
البته ممکن است خیلی از علاقمندان مورد دوم را نداشته باشند که در این مورد هم فکر شده و قصد داریم یک شماتیک برای این برد طراحی کنیم و در نهایت بتوانیم از آن استفاده کنیم.
البته در این آموزش برای راه اندازی ماژول MC60 از برد آموزشی که در شکل مشاهده میکنید، استفاده شده است.
برای خرید این ماژول و دیگر ماژول های این شرکت میتوانید وارد فروشگاه سیسوگ شوید.
گام اول: کدنویسی
در این پروژه از پروژه های آردوینو قصد داریم کدی ساده برای برقراری ارتباط آردوینو با ماژول MC60 بنویسیم که شامل موارد زیر میشود.
- ارسال پیام.
- دریافت پیام.
- اعلام موجودی سیم کارت.
- شناسایی اپراتور.
- معرفی تابع فیلتر حروف.
- تنظیمات فعال سازی.
کدنویسی بخش ارسال پیام در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int Send_Message(String phone , String text){ mySerial.print("AT+CMGF=1"); delay(1000); mySerial.print("AT+CMGS="); mySerial.print("\"") ; mySerial.print(phone); mySerial.print("\"") ; mySerial.print("\r\n"); delay(100); mySerial.print(text); delay(100); mySerial.print(char(26)); delay(100); return 1; } // به طور مثال Send_Message("0938866****" , "Welcome to MC60"); |
تابعی که نوشته شده دارای دو ورودی شماره تلفن و متن است به طوریکه شما میتوانید با وارد کردن شماره تلفن و متن دلخواه تان به صورت دستور از آن استفاده کنید.
شاید برای شما جذاب باشد: ساخت ردیاب با GPS و ارسال پیام با ماژولSIM808 و آردوینو
کدنویسی بخش دریافت پیام در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | String receive message(){ if(mySerial.find("CNMI")>=0){ mySerial.println("AT+CMGR=1") ; delay(10); mySerial.setTimeout(2000) ; String input = mySerial.readString(); delay(500); String number ="0"; String firstword = "\",\""; String lastword = "\",\"\",\""; int n1 = input.indexOf(firstword) + firstword.length() ; int n2 = input.lastIndexOf(lastword); if(n1>-1 and n2>-1){ number = input.substring(n1 , n2); } if(number=="0"){ return "0"; }else{ mySerial.println("AT+CMGD=1,4") ; return input; } } } |
این قسمت از تابع هم به منظور دریافت پیام های دریافتی به همراه حذف آن ها از حافظه ماژول MC60 میباشد که این قسمت از برنامه حتما باید در قسمت LOOP برنامه باشد.
کدنویسی بخش اعلام موجودی سیم کارت در ماژول MC60
این بخش شامل سه زیر مجموعه میباشد.
- بخش اول: شناسایی اپراتور
- بخش دوم: تغییر زبان اپراتور به زبان انگلیسی
- بخش سوم: دریافت موجودی
کدنویسی بخش شناسایی اپراتور در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | String Operator(){ delay(50); mySerial.println("AT+COPS?"); mySerial.setTimeout(100) ; String input = mySerial.readString(); mySerial.setTimeout(10) ; input = word_filter(input,"\"","\""); input.trim(); delay(10); if(input=="MTN Irancell"){ return "Irancell"; }else{ return "Not Recognized"; } } |
این تابع اپراتور را شناسایی میکند و دقت کنید که صرفا برای سیمکارت ایرانسل نیست بلکه از همین طریق شما قادر خواهید بود که انواع اپراتور ها را شناسایی کنید از قبیل همراه اول، رایتل و … فقط نکته ای را باید در نظر بگیرید، در قسمت ورودی کدی را که برمیگرداند را باید از قبل شناسایی کنید.
کدنویسی بخش تغییر زبان اپراتور به زبان انگلیسی در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 | void Operator_Setting(String Operator) { String oprator = service(); if(oprator == "Irancell"){ mySerial.println("AT+CUSD=1,\"*555*4*3*2#\""); } delay(3000); mySerial.println("AT+CUSD=2"); } |
این تابع زبان اپراتور را پس از شناسایی تبدیل به زبان انگلیسی میکند.
کدنویسی بخش دریافت موجودی در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | String Balance(String Operator){ if(Operator=="Irancell"){ mySerial.println("AT+CUSD=1,\"*141*1#\""); mySerial.setTimeout(6000); String Balance_Read = mySerial.readString(); delay(100); mySerial.println(input ); String firsword = "Credit"; String lastword = "WOW"; int Word1 = Balance_Read.indexOf(firsword) + firsword.length() ; int Word2 = Balance_Read.lastIndexOf(lastword); if(Word1 ==-1 or Word2==-1){ return "0" ; }else{ Balance_Read = Balance_Read.substring(Word1 , Word2); } delay(100); Balance_Read.replace("Rial", ""); Balance_Read.replace(".", ""); Balance_Read.replace("IRR", ""); Balance_Read.trim(); return Balance_Read; } } |
خب پس از اینکه زبان اپراتور تبدیل به زبان انگلیسی شد حال توسط تابع بالا قادر هستیم مقدار موجودی سیمکارت را دریافت کنیم.
کدنویسی بخش معرفی تابع فیلتر حروف در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 12 13 | String word_filter( String input_word,String word1,String word2 ){ int Word1 = input_word.indexOf(word1) + word1.length() ; int Word2 = word1.lastIndexOf(word2); if(Word1 ==-1 or Word2==-1){ return "0" ; delay(100); }else{ return input_word.substring(Word1 , Word2); delay(100); } } |
این تابع کار فیلتر کردن حروف را به عهده دارد که توسط این تابع میتوانیم هر رشته ای را بنویسیم و آن را توسط تابع بالا دریافت کنیم.
کدنویسی بخش دریافت شماره تلفن در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 12 13 | String Get_PhoneNumber(String Number){ String word1 = "+98"; String word2 = "\",\"\",\""; int Word1 = Number.indexOf(word1) + word1.length() ; int Word2 = Number.lastIndexOf(word2); if(Word1 ==-1 or Word2==-1){ return "0" ; }else{ Number = "0" + Number.substring(Word1 , Word2 ); } return Number; } |
کاری که این تابع انجام میدهد دریافت شماره تلفن میباشد که طبق همین تابع میتوانیم شماره تلفن ها را محدود کنیم و اصطلاحا چندین کاربر و مدیر در برنامه خود تعریف کنیم.
کدنویسی بخش تنظیمات اولیه در ماژول MC60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | void GSM_Initilaize() { boolean gsm_Init = 1; while (gsm_Init > 0) { mySerial.println("AT"); while (mySerial.available()) { if (mySerial.find("OK") > 0) gsm_Init = 0; } delay(100); } boolean Ready = 1; while (Ready > 0) { mySerial.println("AT+CPIN?"); while (mySerial.available()) { if (mySerial.find("+CPIN: READY") > 0) Ready = 0; } delay(1000); } mySerial.write("AT+CMGF=1\r\n"); delay(1000); } |
این تابع در واقع کار ماژول GSM را چک میکند که آیا اماده به کار است یا خیر؟ در صورتیکه همه چیز درست باشد، باید OK را از ماژول دریافت کنیم.
خب حالا وقت استفاده از توابع رسیده، که باید از این توابع در قسمت اصلی کد استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | String Phone = "xxxxxxxxxxxx"; // like a 09388669075 String Operator,Balance; void setup() { Serial.begin(9600); mySerial.begin(9600); mySerial.println("AT&F"); delay(100); mySerial.println("AT+CMGF=1"); mySerial.setTimeout(100); while(1){ Operator= Ooperator(); if(Operator=="nothing"){ Serial.println(Operator); }// end if operator else{ Serial.println(Operator); Operator_Setting(Operator); GSM_Initilaize(); Balance=balance(Ooperator()); // Send_Message(Phone, Balance); Send_Message(Phone, "Welcome to MC60"); Serial.println(Balance); return; } }// end while } // end of Main void loop() { String Read_Message = receive_message(); if(Read_Message != "0"){ String phones = Get_PhoneNumber(Read_Message); String FILTER_WORD = word_filter(Read_Message,"BLOOM","bloom"); delay(100); if(FILTER_WORD=="OUTPUT1"){ Serial.println("OutPut1 is On"); //Send_Message(Phone, "OutPut1 is On"); }else if(FILTER_WORD=="OUTPUT2"){ Serial.println("OutPut2 is On"); //Send_Message(Phone, "OutPut2 is On"); } } } |
نکته
1 | String FILTER_WORD = word_filter(Read_Message,"BLOOM","bloom"); |
این خط به این معنی است که اگر، بین BLOOM و bloom، هر رشته ای که نوشتیم آن را تشخیص دهد. به عبارت دیگر اصلا به عبارت مابین رشته ربطی ندارد بلکه تصور میکروکنترلر این است که، هر چیزی بین BLOOM و bloom بود آن را فیلتر کند و در نهایت مورد آنالیز قرار دهد که رشته فیلتر شده مربوط به کدام قسمت میباشد. (بسیار باعث خوانایی کد میشود)
به طور مثال اگر پیامی با متن BLOOM OUTPUT1 bloom بنویسیم. روندی که میکروکنترلر در پیش خواهد گرفت شامل موارد زیر میباشد.
شناسایی رشته بین BLOOM و bloom.
تحلیل رشته OUTPUT1.
اجرای دستورات رشته تحلیل شده.
که اگر این متن را ارسال کنید. باید به شما یک پیام حاوی OutPut2 is On را ارسال کند.
برای دریافت دیتاشیت این ماژول اینجا کلیک کنید.
گام دوم: طراحی شماتیک برد MC60
خب با این شماتیک به راحتی میتوانید برای خود یک برد توسعه MC60 طراحی کنید که قابلیت اتصال به هر نوع میکروکنترلی را داشته باشد.
امیدوارم که این آموزش برای شما مفید واقع شده باشد.
با سیسوگ همراه باشید.
با سلام و وقت بخیر خدمت شما بنده می خواستم با ماژول mc60 پروتکل http و روش post یا get به سرور وصل بشم (به کمک آردوینو) مشکلی هست بنده با قرار دادن AT command های مثال application note خود محصول در قسمت وارد کردن url با ارور http url error (3810) مواجه میشم . url های مختلفی تست کردم ، سیم کارت رو تعویض کردم ولی حل نشد ممنون میشم راهنمایی کنید.
با سلام و خسته نباشد
لطف کنید آموزش ارسال SMS فارسی در حالت HEX رو با این ماژول قرار بدید ، چون من هر چی سعی کردم با خطا مواجه شدم ، ممنون از شما
سلام وقتتون بخیر کد هاتون بدرستی اجرا نمیشن با اینکه همه رو کتابخانه هم کردو روتین کامپایل کردم به تابع srvice گیر میده که در بالا تعریف نشده ؟؟
با سلام و تشکر
اگر امکان داره یه توضیح یا راهکاری بدید در مورد نوع سیم کارت مورد استفاده در مودم های GSM. فرض کنید یک دستگاه با استفاده از ماژول GSM ساختیم و باید در مکانی نصب بشه و برای مدت طولانی (مثلا چند سال) کار کنه و SMS ارسال کنه. حالا از چه نوع سیم کارتی باید استفاده کنیم؟ اعتباری یا دائمی؟ کدام اپراتور؟ برای GPRS چه سیمکارتی مناسب هست؟ و برای پرداخت قبض و یا شارژ سیم کارت اعتباری چه راهکاری وجود داره؟ آیا سرویسی هست که دیگه نیاز به پرداخت قبض موبایل و یا شارژ سیم کارت نباشه؟
لطفا راهنمایی بفرمایید.
ممنون
سلام دوست عزیز
در حالت عادی شهری که شما میتونید از همه سیم کارتها و اپراتورها استفاده کنید و زیاد فرقی با هم ندارند
ولی در شرابط خاص انتن دهی در مکانهای خاص بعضی وقتها اپراتور های خاصی انتن دهی خاصی دارند که میتونه باعث بشه شما اون را انتخاب کنید.
برای شارژ سیم کارت راحت ترین کارت استفاده از سرویس Top Upهست که بصورت برخط اون را شارژ میکنید ولی در صورتیکه تعداد سیم کارت زیادی دارید میتونید از قابلیتهای خاص سیم کارتهای شرکتی مثل اپراتور ایرانسل استفاده کنید که میتونه به شما کنترل انلاین شارژ سیم کارت و شارژ دسته جمعی و … به شما بده
به عبارتی نیاز نیست کاری کنید و میتونید چندین هزار سیم کارت را با چند تا شرط ساده براحتی کنترل کنید
مثلا اگر شارژ سیم کارت کمتر از 500 تومن شد مقدار هزار تومن شارژ بشه
سلام
با ماژولهای gms مختلفی کار کردم: sim908, sim5320 و به توصیه ای که در سیسوگ شده بود اومدم سراغ m66 تقریبا تمام کارهایی که میخوام با m66 میتونم انجام بدم فقط یه مشکل برخوردم زمانی که میخوام sms ارسال کنم پاسخ میده
+CMS ERROR: 29
هر کاری کردم نتونستم دلیلش رو بفهمم.
نحوه ارسال:
AT+CSCS=”GSM”
OK
AT+CMGF=1
OK
AT+CMGS=”xxx”
> TEXT(CTRL-Z)
+CMS ERROR: 29
سلام دوست عزیزم
اگر مقاله رو با دقت خونده باشید تابعی تحت عنوان “ارسال پیام” نوشته شده که فکر میکنم اگر از اون تابع استفاده کنید به مشکلی نخورید چون کاملا روی ماژولهای شرکت SIMCOM و Quectel تست شده و جواب گرفته
پیشنهادی که بنده دارم اینکه حتما اون تابع رو مورد بازبینی قرار بدید. امیدوارم که به جواب برسید و مشکلتون حل بشه
موفق باشید.
ممنون بابت راهنمایی سریعتون
تمام مراحل درست بود اما باز جواب نداد تا بالاخره دلیلش رو پیدا کردم، گفتم همینجا بنویسم برای بقیه دوستان، شاید یکی مثل من گیر کرده بود:
باید در بخش GPRS COMMAND مقدار دستور
AT+CGSMS رو مساوی 1 قرار بدین(که پیش فرض ماژول هست)
این دستور جهت انتخاب سرویس برای MO SMS هستش
بسیار عالی دوست عزیزم
خیلی خوشحال شدم که مشکلتون حل شده و ممنون از اینکه راهحل رو به اشتراک گذاشتید.
موفق باشید.
باسلام
در سمت راست تصویری که برای پست قرار دادین پلت فرم نیومتیک قرار داده شده ولی تو پست هیچ اشاره ای به استفاده از اون نشده
می خواسم بدونم آیا انتخاب این عکس تصادفی بوده یا نه و اگر نه چرا در مورد استفادش چیزی نگفتین و اینکه مطلبی در این زمینه می خواید بذارید یا نه ؟
با تشکر
سلام دوست عزیز
تصویر به صورت کاملا اتفاقی بوده است.