آردوینو آموزش آردوینو سیم کارت GSM - GPRS پروژه های آردوینو

آموزش ایجاد تماس صوتی با شیلد sim800c آردوینو Arduino

آموزش ایجاد تماس با شیلد Sim800C آردوینو - دیجی اسپارک
نوشته شده توسط علیرضا قربانی

در سری آموزش‌های قبلی شیلد sim800c آردوینو Arduino به آموزش اسکن شبکه، ارسال و دریافت پیامک پرداختیم که می توانید در لینک‌های زیر به تفکیک مشاهده کنید.

آموزش اسکن شبکه شیلد sim800c آردوینو

آموزش دریافت sms شیلد sim800c آردوینو

آموزش ارسال sms شیلد sim800c آردوینو

در این پست به آموزش برقراری تماس صوتی خواهیم پرداخت پس در ادامه آموزش با مرجع تخصصی آردوینو، دیجی اسپارک همراه باشید.

 


شیلد sim800c آردوینو


شیلد Sim800c  یک شیلد GSM/GPRS با قابلیت پشتیبانی از ۴ کانال ۸۵۰/۹۰۰/۱۸۰۰/۱۹۰۰ MHz  برای ارسال دیتا ، SMS,MMS  و برقرای تماس صوتی می‌باشد. این ماژول مخابراتی را می‌توان به عنوان یک تلفن همراه هوشمند در نظر گرفت که کاربران به وسیله‌ی آن می‌توانند دیتا را به درستی ارسال و دریافت کنند. این ماژول قابلیت پشتیبانی از تمام اپراتورهای مخابراتی را دارا می‌باشد.ارتباط سریال در سطح TTL  قابلیت راه‌اندازی این ماژول را با آردوینو و سایر سیستم‌های ۵ , ۳٫۳ , ۲٫۸۵  ولت DC  را امکان‌پذیر می‌کند. به وسیله تغییر وضعیت جامپر (D1 D0)  می‌توان ماژول را در وضعیت ارتباط سریال سخت افزاری و یا با تغییر جامپر (D8 D7)   می‌توان ماژول را در وضعیت ارتباط سریال نرم‌افزاری قرار داد. این شیلد قابلیت بروز شدن فریم ور  را توسط پورت USB  و پورت سریال دارا می‌باشد.از ویژگی‌های این شیلد می‌توان به موراد زیر اشاره نمود:

  • پشتیبانی از چهار باند ۸۵۰/۹۰۰/۱۸۰۰/۱۹۰۰ مگاهرتز
  • پروتکل ارتباطی سریال (UART)
  • کنترل از طریق AT Command و لایبرری
  • دارای جک هدست
  • اسلات سیم‌کارت میکرو
  • تغذیه ۵ ولت DC
  • جربان مصرفی حداکثر ۲ آمپر
  • دمای کاری منفی ۴۰ الی ۸۵ درجه سانتی‌گراد


توابع مربوط به بر قراری تماس  صوتی شیلد sim800c


کتابخانه‌ای که توسط تیم فنی دانشجوکیت آماده شده است را از لینک زیر دانلود کنید و توسط آموزش زیر آن را  به نرم‌افزار آردوینو خود اضافه کنید.

*توجه داشته باشید در صورتی کتابخانه‌ دیگری به نام GSM درون پوشه‌ی libraries نرم‌افزار آردینو وجود داشت حتما آن را حذف کنید و بعد از آن اقدام به نصب این کتابخانه کنید.

دانلود کتابخانه شیلد Sim800c برای آردوینو

آموزش نصب کتابخانه در نرم‌افزار آردوینو

این کتابخانه از پین ۷ و ۸ آردوینو به منظور برقراری ارتباط سریال نرم‌افزار با آردوینو استفاده می‌کند. همچنین از پین ۶ آردوینو به منظور ریست شیلد استفاده می‌شود . که می‌توانید با اتصال پین ۶ به یک کلید و GND ، امکان ریست کردن را به شیلد sim800c خود اضافه کنید. در ابتدای کار قبل از هر کاری میبایست کتابخانه GSM را به برنامه خود فراخوانی کنیم:

#include <GSM.h>

این کتابخانه پایه و  در برگیرنده‌ی تمامی کلاس‌ها و توابعی می‌باشد که برای راه‌اندازی یک ماژول یا شیلد GSM مورد نیاز است.شیلد sim800c دارای یک عدد مودم داخلی می‌باشد که به وسیله‌ی پورت  سریال و  AT command ها می‌توان آن را به سامانه‌ی جهانی ارتباطات همراه متصل نمود. این کتابخانه دستورات و کدنویسی‌های سطح پایین بین سیم کارت و مودم داخلی sim800 را از بین می‌برد و کدنویسی پیشرفته و سطح بالا را در اختیار شما قرار می‌دهد.کتابخانه GSM از ارتباط سریال نرم‌افزاری با  پین‌های شماره ۷ و ۸ آردوینو به منظور برقرای ارتباط بین شیلد (مودم ) و آردوینو استفاده می‌کند. ممکن است سیم‌کارت شما دارای پین باشد (pin number) برای این منظور یک Preprocessor به نام

PINNUMBER

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

#define PINNUMBER ""

برای دسترسی به توابع  راه‌انداز شیلد sim800c و برقراری تماس  باید از دو کلاس GSM  و GSMVoiceCall   دو آبجکت با نام‌های دلخواه بسازیم( ما از gsmAccess برای کلاس مربوط به راه‌اندازی شیلد و از نام vcsبرای کلاس مربوط به GSMVoiceCall   استفاده می‌کنیم).

GSM gsmAccess;
GSMVoiceCall vcs;

تعدادی متغیر برای ذخیره شماره‌ای که قصد داریم با آن تماس برقرار کنیم را تعریف می‌کنیم:

String remoteNumber = "";
char charbuffer[20];

در Setup برنامه به منظور نمایش داده‌ها و وضعیت ماژول پورت سریال را باز می‌کنیم:

void setup(){

  Serial.begin(9600);
  Serial.println("Make Voice Call");

سپس یک متغیر از جنس  boolean&nbsp; به نام notConnected  به منظور قرار دادن وضعیت اتصال درست شیلد به آردوینو ایجاد می‌کنیم و مقدار پیش‌فرض آن را برابر true   قرار می‌دهیم.تا زمانی که اتصال بین مودم و آردوینو به درستی برقرار نشده باشد این متغیر دارای مقدار true  است و پس از برقراری اربتاط و شناختن سیم کارت و مودم  توسط آردوینو مقدار آن را به false  تغییر می‌دهیم:

boolean notConnected = true;

اکنون با فراخوانی  gsmAccess.begin()   و با وارد کردن PINNUMBER  به عنوان آرگمان ورودی به شکل gsmAccess.begin(PINNUMBER)  به شبکه متصل می‌شویم.

تابع begin پس از فراخوانی مقادیر  ERROR, IDLE, CONNECTING,GSM_READY, GPRS_READY,TRANSPARENT_CONNECTED   را برمی‌گرداند.برای اصولی تر شدن کد نویسی و جلوگیری از خطاهای احتمالی درون برنامه تابع gsmAccess.begin(PINNUMBER)  را درون یک while  می‌نویسیم و مرتبا ارتباط بین مودم و آردوینو را  تا زمانی که تابع begin مقدار GSM_READY  را برنگردانده باشد چک می‌کنیم:

while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

بعد از برقرای ارتباط صحیح بین ماژول و سیم‌کارت ییغام‌ زیر را بر روی سریال مانیتور نرم‌افزار آردوینو نمایش می‌دهیم و به کاربر اطلاع میدهیم که اکنون باید شماره که قصد برقراری تماس با آن را وارد کند:

Serial.println("GSM initialized.");
  Serial.println("Enter phone number to call.");
}

در loop برنامه چک میکنیم اگر داده‌ای در بافر سریال وجود داشته باشد آن را دریافت کنیم و درون متغیری به نام inChar ذخیره کنیم.

void loop()
{
  while (Serial.available() > 0)
  {
    char inChar = Serial.read();

حال باید کدی بنویسیم که در صورتی که ENTER فشرده شد ، برنامه تشخیص دهد که کاربر کامل شماره را وارد کرده است و باید  وارد مرحله‌ی بعدی شود. هنگامی که شما دکمه ENTER را فشار می‌دهید ، کاراکتر  ‘n’ ارسال می‌شود.پس باید برنامه را به گونه‌ای بنویسیم که پس از ارسال ‘n’ ،برنامه از حلقه دریافت شماره  یا متن پیام خارج شود و وارد مرحله‌ی بعدی شود،  پس کد زیر را می‌نویسیم:

if (inChar == 'n')
    {
      if (remoteNumber.length() < 20)
      {

شماره‌ای که قصد تماس با آن را داریم بر روی سریال مانیتور نرم افزار آردوینو نمایش  می‌دهیم:

Serial.print("Calling to : ");
        Serial.println(remoteNumber);
        Serial.println();

شماره‌ای که قصد تماس با آن را داریم در متغیری از جنس String  به نام remoteNumber  ذخیره میشود.برای برقرای تماس باید از تابع voiceCall()  که ورودی آن شماره‌ی مورد نظر می‌باشد که باید حتما به صورت آرایه‌ای جنس char  باشد.بنابراین باید remoteNumber  که از جنس String  می‌باشد به آرایه‌ای از جنس char  تبدیل شود برای این منظور از تابعی به نام toCharArray  استفاده می‌کنیم.

remoteNumber.toCharArray(charbuffer, 20);

تابع vcs.voiceCall()  پس از فراخوانی در صورتی که اتصالات به درستی برقرار شده باشد مدار ۱ را برمی‌گرداند. ما می‌توانیم با استفاده از تابع getvoiceCallStatus()  وضعیت تماس فعلی را بدست بیاوریم.  این تابع پس از فراخوانی مقادیر  IDLE_CALL, CALLING, RECEIVINGCALL, TALKING را برمی‌گرداند.ما قصد داریم هنگامی که تماس برقرار است با زدن دکمه‌ی enter به تماس خاتمه بخشیم .بنابر این یک حلقه بی‌نهایتی می‌نویسیم که درصورتی که کاراکتر ‘n’ دریافت نشده باشد و تماس برقرار می‌باشد ادامه پیدا کند  و در صورتی که یکی از این دو مورد نقض شد ، تماس پایان یابد.

if(vcs.voiceCall(charbuffer))
        {
          Serial.println("Call Established. Enter line to end");
          while(Serial.read()!='n' && (vcs.getvoiceCallStatus()==TALKING));
          vcs.hangCall();
        }

هنگامی که تماس تکمیل شد متغیری که درون آن شماره تلفن ذخیره میشد را پاک می‌کنیم و دوباره پیام Enter phone number to call را برای وارد کردن دوباره‌ی شماره بر روی سریال مانیتور نرم‌افزار نمایش می‌دهیم.

Serial.println("Call Finished");
        remoteNumber="";
        Serial.println("Enter phone number to call.");
      }

اگر شماره تلفن وارد شده بیشتر از ۲۰ عدد کاراکتر بود ، مقدار شماره تلفن قبلی از بین می‌رود و دوباره  شماره تلفن از شخص گرفته می‌شود:

else
      {
        Serial.println("That's too long for a phone number. I'm forgetting it");
        remoteNumber = "";
      }
    }

هنگامی که درر حال خواندن بافر سریال می‌باشیم ، اگر کاراکتر دریافتی برابر enter نبود ( ‘n’)  ، آن را به متغیر remoteNumber اضافه می‌کنیم و در نهایت loop برنامه را می‌بندیم.

else
    {
      // add the latest character to the message to send:
      if(inChar!='r')
        remoteNumber += inChar;
    }
  }
}

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

 

sim800c آردوینو

کلید فعال سازی شیلد sim800c آردوینو

بعد از فشردن کلید نشان داده در تصویر فوق ،  باید LED نشان داده در تصویر زیر روشن شود.

شیلد sim800c آردوینو

اکنون سریال مانیتور نرم افزار را باز کنید و آن را بر روی Newline تنظیم کنید. سپس منتظر بمانید نا بر روی سریال مانیتور عبارت Enter a mobile number نمایش داده شود.شماره را وراد کنید و enter را بزنید. بعد از وارد کردن شماره عبارت Calling to نمایش داده می‌شود و بدین معنی است که تماس در حال انجام است. کمی منتظر بمانید تا گوشی شما صه صدا در آید. بعد از برقراری تماس اگر کلید enter را فشار دهید ، تماس شما قطع می‌شود . و در صورت قطع شدن تماس چه از طرف شما و چه از طرف مقابل ، پیام Call Finished  بر روی سریال مانیتور نرم افزار نمایش داده می‌شود.

 

 


برنامه آردوینو


 

/*
 Make Voice Call

 */

// libraries
#include <GSM.h>

// PIN Number
#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess; // include a 'true' parameter for debug enabled
GSMVoiceCall vcs;

String remoteNumber = "";  // the number you will call
char charbuffer[20];

void setup()
{

  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println("Make Voice Call");

  // connection state
  boolean notConnected = true;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while (notConnected)
  {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized.");
  Serial.println("Enter phone number to call.");

}

void loop()
{

  // add any incoming characters to the String:
  while (Serial.available() > 0)
  {
    char inChar = Serial.read();
    // if it's a newline, that means you should make the call:
    if (inChar == 'n')
    {
      // make sure the phone number is not too long:
      if (remoteNumber.length() < 20)
      {
        // let the user know you're calling:
        Serial.print("Calling to : ");
        Serial.println(remoteNumber);
        Serial.println();

        // Call the remote number
        remoteNumber.toCharArray(charbuffer, 20);


        // Check if the receiving end has picked up the call
        if (vcs.voiceCall(charbuffer))
        {
          Serial.println("Call Established. Enter line to end");
          // Wait for some input from the line
          while (Serial.read() != 'n' && (vcs.getvoiceCallStatus() == TALKING));
          // And hang up
          vcs.hangCall();
        }
        Serial.println("Call Finished");
        remoteNumber = "";
        Serial.println("Enter phone number to call.");
      }
      else
      {
        Serial.println("That's too long for a phone number. I'm forgetting it");
        remoteNumber = "";
      }
    }
    else
    {
      // add the latest character to the message to send:
      if (inChar != 'r')
        remoteNumber += inChar;
    }
  }
}

 

این کد برای ایجاد یک تماس تلفنی با استفاده از ماژول GSM و شیلد ماژول GSM نوشته شده است. با استفاده از این کد، می‌توانید از طریق پورت سریال، یک شماره تلفن را وارد کرده و سپس با زدن دکمه ‘n’ یا اینتر، تماس تلفنی با آن شماره را برقرار کنید. هنگامی که تماس برقرار می‌شود، می‌توانید برای پایان تماس از طریق خط تلفن یک نویز را وارد کنید و تماس قطع می‌شود.

#include <GSM.h>: این دستور، کتابخانه GSM را به برنامه اضافه می‌کند تا از توابع مربوط به ماژول GSM استفاده کنیم.

#define PINNUMBER “”: این دستور یک متغیر تعریف می‌کند که ممکن است برای ماژول SIM کارت پین مورد نیاز را داشته باشد.

GSM gsmAccess;: این دستور یک شیء از کلاس GSM را می‌سازد که برای مدیریت ماژول GSM استفاده می‌شود.

GSMVoiceCall vcs;: این دستور یک شیء از کلاس GSMVoiceCall می‌سازد که برای مدیریت تماس‌های صوتی استفاده می‌شود.

تابع setup(): در این تابع، ابتدا ارتباط سریال را با سرعت ۹۶۰۰ بیت بر ثانیه تنظیم می‌کند و سپس ماژول GSM را راه‌اندازی می‌کند. اگر ماژول آماده برای ارتباط باشد، وضعیت اتصال را نمایش می‌دهد. سپس پیام “Enter phone number to call.” را چاپ می‌کند و منتظر ورود شماره تلفن برای تماس می‌شود.

تابع loop(): در این تابع، شماره تلفن وارد شده از طریق پورت سریال خوانده می‌شود و اگر کاربر دکمه ‘n’ یا اینتر را زده باشد، تماس تلفنی با شماره وارد شده برقرار می‌شود. پس از برقراری تماس، اگر وضعیت تماس در حال صحبت (TALKING) باشد، منتظر ورود نویز توسط کاربر می‌ماند و در صورتی که نویز اضافی وارد شود، تماس قطع می‌شود. پس از قطع تماس، دوباره منتظر ورود شماره تلفن جدید برای تماس می‌شود.

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

 

 


سخت‌افزار مورد نیاز


آردوینو UNO

شیلد sim800c (خرید از فروشگاه)

منبع تغذیه یا آداپتور ۵ولت

سیم‌کارت میکرو

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

علیرضا قربانی

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

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

۸ دیدگاه

  • باسلام
    ممنون بابت آموزشهایی که در سایتتون قرارمیدید.
    لطفا اگر امکانش هست، آموزش کامل کار با ماژول جی پی اس NEO-6M را هم در سایت قرار بدید. با تشکر

  • سلام امکانش هست اموزش ارسال و در یافت اس ام اس رو برای این کیت بر روی رزبری پای که دارین تو فروشگاه خودتون میفروشید رو بگذارید

    • با سلام
      ضمن تشکر از توجه شما، لینک دانلود اصلاح شد. به صفحه محصول در دانشجو کیت هدایت میشوید و از آنجا انتهای صفحه لینک دانلود قرار دارد.

  • سلام.چه طوری میشه همزمان دو یا چند تا از این سنسور nlh رو راه اندازی کرد؟؟؟ با این کتابخونه ها میشه؟؟