این مطلب قسمت هفتم از مجموعه آموزش جامع اینترنت اشیا با آردوینو است. در این قسمت قصد داریم در مورد ماژول GSM صحبت کنیم. جذابترین نوع اینترنت اشیای زمانی به وجود میآید که دستگاههای مختلف واقعا بتوانند با یکدیگر و با انسانها حرف بزنند. چطور میتوان چنین چیزی را به وجود آورد؟ برای رسیدن به چنین شرایطی اجزای زیادی باید با هم همزمان کار کنند که تاکنون در مورد بسیاری از آنها صحبت کردهایم اما تصور کنید که چیزی داشته باشید که در صورتی که شخصی وارد منزلتان شد پیامکی را به تلفن همراه شما بفرستد. یا اینکه مثلا با یک تماس تلفنی بتوانید شیرهای گاز خانه را ببندید! دقیقا انگار که یک خدمتکار در خانه دارید که میتوانید با او تماس بگیرید و خیلی از کارهای خانه را به او واگذار کنید. تمام این کارها با استفاده از ماژول GSM انجام میشود.
قطعات مورد نیاز
معرفی ماژول GSM
ماژول SIM800 یک قطعه کوچک و پرکاربرد است که تقریبا تمام قابلیتهای یک تلفن همراه مانند ارسال و دریافت پیامک، برقراری تماس صوتی و ارتباط به اینترنت از طریق GPRS را در اختیار شما میگذارد.
این ماژول از سیستم GSM برای برقراری ارتباط استفاده میکند. GSM یا Global System for Mobile Communication یک استاندارد مخابراتی است که از پروتکل نسل دوم موبایل یا 2G استفاده میکند. این استاندارد برای اولین بار امکان برقراری ارتباط موبایل به روش دیجیتال را معرفی کرد. از طریق GSM اتصال به اینترنت با موبایل به روشهای GPRS و EDGE فراهم شد. سیستم نسل دوم گستردهترین روش مخابراتی موجود برای موبایل در جهان است. به همین دلیل امکان دسترسی به شبکه از طریق آن بسیار بیشتر از نسلهای بعدی است.
ماژول SIM800 قابلیتهای زیر را دارد:
- برقراری و دریافت تماس صوتی
- دریافت و ارسال پیامک
- قابلیت کار در تمام شبکههای GSM بر پایه 2G
- استفاده از ۴ باند فرکانسی 800، 900، 1800 و 1900 مگاهرتز
- امکان برقراری ارتباط GPRS
- امکان برقراری ارتباط FM
- ارتباط سریال با میکروکنترلر با سرعت 1200bps تا 115200bp
- پشتیبانی از دستورات AT
- پشتیبانی از سیمکارتهای ابعاد میکرو
ماژول SIM800 از چند بخش کلی تشکیل شده است. این ماژول یک برد ١ اینچی است که بر روی آن یک تراشه GSM قرار گرفته است. در دو طرف ماژول تعدادی جای پین قرار دارد که تغذیه، برقراری ارتباط با میکروکنترلر، ارتباط با اجزای جانبی و آنتن به این قسمت متصل میشود. زمانی که ماژول را تهیه میکنید معمولا قسمتهای آن جدا از هم است و احتمالا لازم دارید تا پینهای هدر و آنتن را به آن لحیم کنید.
برای اینکه بتوانید از ماژول SIM800 استفاده کنید نیاز به یک آنتن خواهید داشت. بر روی برد ماژول دو امکان برای اتصال آنتن در اختیار شما گذاشته شده است. حالت اول استفاده از آنتن مارپیچ شکلی است که معمولا به همراه ماژول فروخته میشود. این آنتن را باید به پین NET بر روی ماژول لحیم کنید. برای استفاده از ماژول در شرایط معمولی و اگر میخواهید مصرف برق ماژولتان کاهش پیدا کند، این آنتن گزینه مناسبی است.
حالت دوم استفاده از آنتن مخصوص است. این آنتن از طریق یک درگاه u.fl به ماژول متصل میشود. این نوع آنتن کیفیت ارتباط را بهبود میدهد و طبیعتا مصرف برق بالاتری دارد. از آنجا که این نوع آنتن سیم انعطافپذیر دارد، میتوانید ماژول را در جعبه قرار داده و آنتن را بیرون آن جانمایی کنید.
تغذیه ماژول SIM800 اهمیت زیادی دارد. ولتاژ کاری برای این ماژول 3.4V تا 4.4V است و بنابراین باتری LiPo گزینه مناسبی برای تغذیه آن است. اگر تغذیه ماژول به طور مناسبی تامین نشود، ممکن است کار نکند یا باعث شود که آردوینو آسیب ببیند. ماژول GSM در شرایط مختلف مصرف برق متفاوتی دارد. برای مثال در حالت Stand By حدود 18mA و در حالت تماس صوتی حدود 216mA جریان مصرف میکند. با این وجود این ماژول میتواند در شرایط خاص به صورت لحظهای تا 2A جریان بکشد.
از آنجا که ماژول GSM مصرف بالایی دارد نمیتوانید از تغذیه آردوینو استفاده کنید و نیاز به یک منبع تغذیه خارجی دارید. این منبع باید بتواند ولتاژی بین 3.4V تا 4.4V و جریانی تا 2A را تامین کند. برای این کار دو راه وجود دارد. اولین حالت همان طور که گفتیم استفاده از یک باتری LiPo است. هر سلول باتری LiPo ولتاژی در حدود 3.7V داشته و جریانهای بالا را به راحتی تامین کرده و بنابراین برای این کار بسیار مناسب است.
انتخاب دوم استفاده از یک منبع تغذیه متغیر یا یک منبع تغذیه ثابت به همراه رگولاتور ولتاژ است. رگولاتور LM2596 توانایی تامین ولتاژ و جریان مورد نظر را دارد و به خوبی با ماژول SIM800 کار میکند.
توجه داشته باشید که همیشه قبل از اتصال سیم VCC سیم GND را وصل کنید و قبل از سیم GND سیم VCC را جدا کنید.
ماژول SIM800 ١٢ پین اتصال دارد اما برای استفاده ساده از آن نیاز به همه آنها ندارید. برای استفاده از ماژول حداقل ۴ پین آن را باید وصل کنید: پینهای تغذیه یعنی VCC و GND و پینهای ارتباط سریال یعنی Tx و Rx. توجه داشته باشید که این ماژول در محدوده ولتاژ گفته شده کار میکند و بنابراین نمیتوانید پایههای دیجیتال آردوینو که ولتاژ 5V دارند را به آن وصل کنید. برای اینکه به ماژول آسیب نرسد، پایه Rx ماژول را از طریق دو مقاومت تقسیمکننده ولتاژ به Tx آردوینو وصل کنید. پایه Tx ماژول را به Rx آردوینو، VCC را به منبع تغذیه و تمام GND ها را به هم وصل کنید. علاوه بر آن یکی از دو نوع آنتن گفته شده را به ماژول وصل کنید. اگر از آنتن مارپیچی استفاده میکنید باید آن را نیز به ماژول لحیم کنید. ماژول GSM جریانهای لحظهای زیادی میکشد، به همین دلیل برای پایدار کردن عملکرد آن میتوانید دو خازن با ظرفیت 1000µF و 100nF به پایههای تغذیه ماژول وصل کنید.
سایر پایههای ماژول شامل دو پایه برای میکروفون، دو پایه برای بلندگو، پایه زنگ تماس، پایه حالت Sleep و پایه ریست سختافزاری است که در صورت نیاز میتوانید از آنها استفاده کنید.
آمادهسازی اولیه ماژول GSM
ماژول SIM800 با دستورات AT کار میکند. در مورد دستورات AT قبلا در آموزش راهاندازی ماژولهای وایرلس با آردوینو توضیح دادیم. همچنین در آموزش استفاده از ماژول بلوتوث با آردوینو نیز از این دستورات استفاده کردیم. برای کار با این ماژول باید دستورات آن را بشناسید. توصیه میکنم که راهنمای دستورات AT برای ماژول SIM800 را مطالعه کنید. در این راهنما تمام دستورات موجود به همراه نحوه استفاده و پاسخهای ماژول به دستورات آورده شده است. در این آموزش بعضی از دستورات مهم ماژول را استفاده خواهیم کرد.
برای اینکه بفهمید که ماژول درست کار میکند یا نه میتوانید برنامه زیر را بر روی آردوینو آپلود کرده و نتیجه را ببینید.
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3); //SIM800L Tx >> 2 & Rx >> 3
void serialReadWrite()
{
delay(500);
while (Serial.available())
SIM800.write(Serial.read());
while (SIM800.available())
Serial.write(SIM800.read());
}
void setup()
{
Serial.begin(9600);
SIM800.begin(9600);
Serial.println("Initializing...");
delay(1000);
SIM800.println("AT");
serialReadWrite();
SIM800.println("AT+CSQ");
serialReadWrite();
SIM800.println("AT+CCID");
serialReadWrite();
SIM800.println("AT+CREG?");
serialReadWrite();
SIM800.println("AT+COPS?");
serialReadWrite();
}
void loop()
{
serialReadWrite();
}
در این برنامه از کتابخانه SoftwareSerial استفاده شده است:
#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3); //SIM800L Tx >> 2 & Rx >> 3
برای سادهتر شدن کد، یک برنامه به نام()serialReadWriteتعریف شده است که پاسخ ماژول را روی سریال مانیتور نوشته و اگر دستوری در سریال مانیتور وارد کنید، به ماژول ارسال میشود.
void serialReadWrite()
{
delay(500);
while (Serial.available())
SIM800.write(Serial.read());
while (SIM800.available())
Serial.write(SIM800.read());
}
دستورات AT که در این برنامه استفاده شدهاند، وضعیت ماژول و اتصال آن به شبکه را نشان میدهند. پس از ارسال این دستور، اگر اتصال ماژول به آردوینو برقرار باشد، پاسخ OK داده میشود:
SIM800.println("AT");
دستور زیر قدرت سیگنال دریافتی را میدهد. قدرت سیگنال عددی بین ٠ تا ۳۱ است:
SIM800.println("AT+CSQ");
این دستور مشخصات سیمکارت وارد شده را میخواند. با استفاده از این دستور میتوانید بفهمید که آیا سیمکارت سالم است یا نه:
SIM800.println("AT+CCID");
دستورهای زیر نیز وضعیت اتصال ماژول به شبکه و اپراتور را مشخص میکنند:
SIM800.println("AT+CREG?");
SIM800.println("AT+COPS?");
بر روی ماژول یک LED وجود دارد که نوع چشمک زدن آن وضعیت ماژول را نشان میدهد. بر این اساس سه حالت وجود دارد:
هر ثانیه یک بار: اتصال ماژول به شبکه برقرار نیست
هر دو ثانیه یک بار: ارتباط GPRS برقرار است
هر سه ثانیه یک بار: ماژول آماده دریافت و ارسال پیام و برقراری مکالمه است
ارسال و دریافت پیامک با آردوینو
شاید کاربردیترین مورد استفاده از ماژول GSM ارسال و دریافت SMS با استفاده از آن باشد. برای استفاده از این قابلیت تنها کافیست که دستورهای مربوط به آن را بدانید. برنامه زیر یک پیامک را به شماره شما ارسال میکند:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3); //SIM800L Tx >> 2 & Rx >> 3
String number = "+98xxxxxxxxxx";
void sendSMS()
{
SIM800.println("AT+CMGF=1");
delay(1000);
SIM800.println("AT+CMGS=\"" + number + "\"\r");
delay(1000);
String SMS = "Hello! I am Arduino.\nNice to meet you";
SIM800.println(SMS);
delay(100);
SIM800.println((char)26);
delay(1000);
}
void setup()
{
delay(5000);
Serial.begin(9600);
SIM800.begin(9600);
Serial.println("Initializing Successful !");
delay(1000);
sendSMS();
}
void loop()
{
}
قبل از استفاده از این برنامه شماره تلفن همراه خود را در کد جایگزین کنید
String number = "+98xxxxxxxxxx";
در حلقه setup سریال مانیتور و ماژول را فعال میکنیم. برای جلوگیری از ارسال مکرر پیام، تابع()sendSMSرا در اینجا و نه در حلقه loop فراخوانی میکنیم:
Serial.begin(9600);
SIM800.begin(9600);
Serial.println("Initializing Successful !");
delay(1000);
sendSMS();
تابع()sendSMSیک پیامک به شماره مورد نظر شما ارسال میکند. برای ارسال پیام باید دستورات زیر را به ترتیب اجرا کنید. دستورات زیر ابتدا ماژول را در حالت متنی قرار داده، سپس پیام ارسال شده و در نهایت اتمام ارسال پیام با ارسال مقدار ۲۶ به ماژول تعیین میشود:
void sendSMS()
{
SIM800.println("AT+CMGF=1");
delay(1000);
SIM800.println("AT+CMGS=\"" + number + "\"\r");
delay(1000);
String SMS = "Hello! I am Arduino.\nNice to meet you";
SIM800.println(SMS);
delay(100);
SIM800.println((char)26);
delay(1000);
}
برای دریافت پیام از طریق ماژول نیز میتوانید برنامه زیر را اجرا کنید:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3);
void getSMS()
{
Serial.println("Switching to SMS read mode");
delay(1000);
SIM800.println("AT+CNMI=2,2,0,0,0");
delay(1000);
}
void setup()
{
delay(7000);
Serial.begin(9600);
SIM800.begin(9600);
Serial.println("Initializing ...");
delay(1000);
getSMS();
}
void loop()
{
if (SIM800.available() > 0)
Serial.write(SIM800.read());
}
در این برنامه تابع()getSMSبرای فعال کردن حالت دریافت پیام تعریف شده است. این کار با استفاده از دستور AT+CNMI=2,2,0,0,0 انجام میشود:
SIM800.println("AT+CNMI=2,2,0,0,0");
کد حلقه loop به محض اینکه پیامی دریافت شود در سریال مانیتور نمایش میدهد:
if (SIM800.available() > 0)
Serial.write(SIM800.read());
برقراری تماس صوتی با آردوینو
از کارهای جالبی که میتوانید با ماژول GSM انجام دهید برقراری تماس صوتی است. اگر میخواهید از این امکان استفاده کنید، باید یک میکروفون و یک بلندگوی مناسب به پینهای MIC و SPK وصل کنید. همچنین میتوانید یک بازر به پین Ring ماژول وصل کنید. با برنامه زیر میتوانید یک تماس صوتی برقرار کنید:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3);
String myNumber = "+98xxxxxxxxxx";
void callMe()
{
SIM800.print(F("ATD"));
SIM800.print(myNumber);
SIM800.print(F(";\r\n"));
}
void setup()
{
delay(7000);
Serial.begin(9600);
SIM800.begin(9600);
Serial.println("Initializing ...");
delay(1000);
callMe();
}
void loop()
{
if (SIM800.available() > 0)
Serial.write(SIM800.read());
}
در این برنامه تابع()callMeبرای برقراری تماس تعریف شده است:
void callMe()
{
SIM800.print(F("ATD"));
SIM800.print(myNumber);
SIM800.print(F(";\r\n"));
}
سیستم نظارت هوشمند با آردوینو
با استفاده از قابلیتهای ماژول GSM میتوانید پروژههای جذابی تعریف کنید. مثلا میتوانید یک سنسور PIR را در منزل قرار دهید تا در صورت ورود شخصی به منزل، با استفاده از ماژول GSM از طریق پیام و تماس به شما اطلاع داده شود. اگر میخواهید در مورد عملکرد سنسور PIR بیشتر بدانید میتوانید آموزش کار با سنسورهای پرکاربرد اینترنت اشیا با آردوینو را مطالعه کنید. برنامه زیر این کار را انجام میدهد:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3); //SIM800L Tx >> 2 & Rx >> 3
String number = "+98xxxxxxxxxx";
int pirPin = 8;
int lastState = LOW;
void sendSMS()
{
SIM800.println("AT+CMGF=1");
delay(1000);
SIM800.println("AT+CMGS=\"" + number + "\"\r");
delay(1000);
String SMS = "Something is moving.\nMaybe someone is here!\nI will call you now";
SIM800.println(SMS);
delay(100);
SIM800.println((char)26);
delay(1000);
}
void callMe()
{
SIM800.print(F("ATD"));
SIM800.print(number);
SIM800.print(F(";\r\n"));
}
void setup()
{
pinMode(pirPin, INPUT);
digitalWrite(pirPin, LOW);
delay(5000);
SIM800.begin(9600);
delay(1000);
}
void loop()
{
if (digitalRead(pirPin))
{
if (!lastState)
{
sendSMS();
delay(15000);
callMe();
lastState = !lastState;
}
}
else
{
if (lastState)
{
lastState = !lastState;
}
}
}
توابع ارسال پیام و برقراری تماس مانند قبل است. پین ٨ را به یک سنسور PIR وصل کنید و آنرا در حلقه setup تعریف کنید:
#include <SoftwareSerial.h>
SoftwareSerial SIM800(2, 3); //SIM800L Tx >> 2 & Rx >> 3
String number = "+98xxxxxxxxxx";
int pirPin = 8;
int lastState = LOW;
در حلقه loop اگر سنسور PIR حرکتی را حس کند، به شماره تلفن همراه شما پیام داده شده و سپس ماژول با شما تماس میگیرد:
if (digitalRead(pirPin))
{
if (!lastState)
{
sendSMS();
delay(15000);
callMe();
lastState = !lastState;
}
}
else
{
if (lastState)
{
lastState = !lastState;
}
}
تا اینجا به طور مستقیم با ماژول GSM کار کردیم. این کار باعث میشود تا درک بهتری از عملکرد ماژولها پیدا کنید. روش دیگری نیز برای کار با این ماژول وجود دارد و آن استفاده از کتابخانه مخصوص SIM800 است. درون این کتابخانه مشابه همان دستوراتی که قبل از این استفاده کرده بودیم وجود دارد. به کار بردن کتابخانه در کد باعث کوتاه شدن کد و سادگی کار با آن میشود. خوشبختانه کتابخانه این ماژول به خوبی نوشته شده و کار با آن ساده است. کتابخانههای دیگری نیز برای ماژول GSM نوشته شده اما کاملترین و کاربردیترین آنهاSIM800lاست.
به عنوان نمونه میتوانید کد زیر را بر روی آردوینو آپلود کنید که مشابه قبل یک پیام به شماره تلفن همراه شما فرستاده و با شما تماس میگیرد:
/*
automee
Arduino Tutorial Series
Author: Davood Dorostkar
Website: www.automee.ir
*/
#include <Sim800l.h>
Sim800l SIM800;
char *myNumber = "+98xxxxxxxxxx";
char *SMS = "Hello, I am Arduino Uno.\nNice to meet you!";
void setup()
{
SIM800.begin();
delay(8000);
SIM800.sendSms(myNumber, SMS);
delay(3000);
SIM800.callNumber(myNumber);
}
void loop()
{
}
همانطور که دیدید، استفاده از کتابخانه حجم کد را کمتر کرده است. در این برنامه پس از صدا زدن کتابخانه شماره تلفن و متن پیامی که میخواهید ارسال شود را وارد میکنید:
#include <Sim800l.h>
Sim800l SIM800;
char *myNumber = "+98xxxxxxxxxx";
char *SMS = "Hello, I am Arduino Uno.\nNice to meet you!";
در حلقه setup کافیست که ماژول را راهاندازی کرده و دستورهای()sendSmsو()callNumberرا فراخوانی کنید:
SIM800.begin();
delay(8000);
SIM800.sendSms(myNumber, SMS);
delay(3000);
SIM800.callNumber(myNumber);
نتیجهگیری
در این آموزش با ماژول GSM و نحوه کار با آن آشنا شدید. این ماژول به خصوص در مواردی که سایر روشهای ارتباطی مثل وایرلس امکانپذیر نیست، یک روش کارآمد و مطمئن است.
در آموزش بعدی نحوه راهاندازی ماژولهای وایرلس را توضیح خواهیم داد.
نظرات شما باعث بهبود محتوای آموزشی ما میشود. اگر این آموزش را دوست داشتید، همینطور اگر سوالی در مورد آن دارید، از شنیدن نظراتتان خوشحال خواهیم شد.