اطلاعیه

Collapse
No announcement yet.

کتابخانهآ‌ای برای ارتباط AVR با GSM

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کتابخانهآ‌ای برای ارتباط AVR با GSM


    مدتهاست برای ارتباط AVR با ماژولآ‌های GSM برای خودم یک کتابخانه درست کردم، الان تقریبا به جایی رسیده که میتونم عمومیش کنم. در پست اول فقط قصد معرفی و فراهم کردن امکان دانلود این کتابخونه رو دارم و در پستآ‌های بعدی مثالآ‌هایی برای نحوه استفاده ارائه خواهم کرد.
    کار بر روی این کتابخونه ادامه داره و هر بار که تغییرات در کدش اعمال میآ‌کنم قابل دانلود مجدد هست. دوستانی که با سیستم git آشنا هستند میتونند راحت کتابخونهٔ خودشونو با نسخه اصلی بروز نگه دارن.

    امکانات کلی این کتابخونه در زیر اومده.

    ==================== توابع کار با SMS ====================

    * امکان تعریف توابع دلخواه برای ارسال و دریافت به/از پورت سریال
    در هنگام راهآ‌اندازی اولیه ماژول GSM توسط تابع gsm_init، امکان تعریف توابع دلخواه برای ارتباط با پورت سریال وجود داره. این ویژگی بدرد کسانی میخوره که مایل باشن توابع دلخواه خودشونرو برای ارتباط با پورت سریال استفاده کنن.
    prototype تابع gsm_init بصورت زیر هست :

    کد PHP:
    void gsm_initvoid(*sendByte_func)(unsigned char c), int(*getByte_func)(void) ); 



    * امکان ارسال SMS و چک کردن Delivery Report
    شما میتونید با توابعی که برای اینکار نوشته شده براحتی و در یک خط ساده SMS ارسال کنید و همچنین میتونید متوجه بشید که SMS دلیور شده یا نه. همینطور میآ‌تونید تنظیم کنید که اگر SMS دلیور نشد تا چند بار مجددا برای ارسال اون تلاش کنه. همهٔ اینها فقط با یک خط کد قابل استفاده هست. اینکار توسط تابعی بنام gsm_send_sms انجام میشه.

    prototype تابع gsm_send_sms بصورت زیر هست :
    کد PHP:
    int gsm_send_smschar *numberchar *textint try_num ); 


    * امکان بررسی کردن و خواندن SMS های جدید دریافتی
    با استفاده از تابع gsm_check_new_sms میتونید SMS های جدیدی رو که دریافت شده بخونید، تعداد SMS های جدید هر چند تا که باشه بترتیب خونده میشه و در اختیار برنامه قرار داده میشه.
    prototype تابع gsm_check_new_sms بصورت زیر هست :
    کد PHP:
    int gsm_check_new_smsSMS *sms ); 


    * امکان خواندن یک SMS از خانه حافظهٔ مشخص
    تابع gsm_read_sms برای همین منظور بکار میره. ورودی تابع شماره مکان حافظه هست و خروجی اون هم محتویات SMS موجود در اون خونهٔ حافظه (در صورت وجود )
    prototype تابع gsm_read_sms بصورت زیر هست :
    کد PHP:
    int gsm_read_smsint indexSMS *sms ); 


    * امکان گزارشآ‌گیری از حجم حافظه موجود در سیمآ‌کارت برای نگهداری SMS و همچنین میزان مصرف شدهٔ این حافظه به درصد:
    تابع gsm_SIM_mem_used برای این منظور هست.

    ==================== توابع کار با RTC ====================
    * امکان تنظیم ساعت و تاریخ در RTC داخلی ماژول
    تابع gsm_set_rtc برای اینکار نوشته شده است. ورودی این تالع یک رشته متنی بصورت YY/MM/DD,HH:MM:SS+00 است.

    * امکان خواندن ساعت و تاریخ از RTC ماژول
    تابع gsm_get_rtc_str برای اینکار نوشته شده است. خروجی این تابع یک رشته متنی حاوی ساعت و تاریخ به فرمتی است که در بالا اشاره شد.

    ==================== توابع دیگر ====================
    * امکان ارسال فرامین USD به اپراتور (مثلا برای انجام کارهای شارژ و گزارش گیری اعتبار سیمآ‌کارت)
    تابع gsm_usd_command برای اینکار نوشته شده است. prototype این تابع بصورت زیر هست :
    کد PHP:
    int gsm_usd_commandchar *cmdchar *response ); 


    ==================== دانلود ====================
    سورس کتابخانه بر روی Github قرار داده شده است. برای دریافت جدیدترین نسخه از این لینک استفاده کنید. و اگر به git آشنایی دارید، باهاش بروز باشید.

    git clone git://github.com/hamid-rostami/avr-gsm.git



    لینک کتابخونه در Github برای دسترسی بروشهای دیگر :
    https://github.com/hamid-rostami/avr-gsm
    چگونه هوشمندانه بپرسیم

    #2
    پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

    سلام جناب رستمی
    من شدیدا به این کتابخانه نیاز داشتم، واقعا از زحمتی که کشیدید ممنون! :job:
    منتظر مثال های مربوط به این کتابخانه هستم
    :wow:
    با تشکر فراوان

    دیدگاه


      #3
      پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

      مثال دریافت و ارسال SMS
      در زیر مثالی برای چگونگی بررسی SMS جدید و خواندن آن و همچنین ارسال SMS آورده شده است. همانطور که میآ‌بینید در چند خط ساده و خوانا اینکار انجام شده است و به هیچ وجه برنامهآ‌نویس بصورت مستقیم با ماژول GSM و جزئیات کار با آن درگیر نمیآ‌شود.
      در ادامهٔ پست، برنامه تشریح شده است.
      کد PHP:
      #include "global.h"
      #include <stdint.h>
      #include <stdlib.h>
      #include <avr/io.h>
      #include <util/delay.h>
      #include "uart.h"
      #include "lcd.h"
      #include "gsm.h"

      int main(void){
          
      int i;
          
      SMS sms;
          
          
      // Initial Serial port
          
      uartInit();
          
      uartSetBaudRate(9600);
          
          
      // Initial LCD
          
      lcdInit();
          
          
      // Initial GSM Module
          
      gsm_init(uartSendByteuartGetByte);        // Initial gsm library
          
      gsm_text_sms();                // Initial SMS text-mode message
          

          
          
      while(1){
              
      gsm_check_new_sms( &sms );
              if( 
      != ){
                  
      gsm_del_sms);
                  
      // We have new SMS
                  
      lcd_clear(); lcd_print(sms.body);
                  
      lcd_gotoXY(01); lcd_print(sms.number);
                  
      // Send reply
                  
      gsm_send_smssms.number, "Your SMS Recieved!", );
              }
              
              
      _delay_ms(2000);
          }
          
          return 
      0;




      در ابتدای برنامه که فایلآ‌های سرآیند مورد نیاز الحاق شدهآ‌اند. فایل gsm.h نیز جز این فایلآ‌های هیدر است. سپس دو متغیر که یکی از نوع int و دیگری از نوع SMS است در تابع main تعریف شده است. متغیر نوع SMS در gsm.h تعریف شده است که یک ساختار بصورت زیر است :
      کد PHP:
      // Structers    
      typedef struct struct_sms{
          
      char body[160];
          
      char number[20];
          
      char date[25];
          
      char stat;
      }
      SMS


      متغیر نوع SMS محتوی متن، شماره تلفن، تاریخ و وضعیت sms (جدید یا خوانده شده) است.
      سپس برنامه وارد راهآ‌اندازی اولیه وسایل جانبی مانند LCD و پورت سریال و همچنین کتابخانهٔ GSM میآ‌شود.
      راهآ‌اندازی کتابخانه GSM توسط تابع gsm_init صورت میآ‌گیرد. این تابع دو ورودی دارد که هر دو اشارهآ‌گر تابع هستند. ورودی اول اشارهآ‌گر به تابع ارسال به پورت سریال است و ورودی دوم اشارهآ‌گری به تابع دریافت از پورت سریال است.
      برای انعطاف بیشتر کتابخانهٔ GSM این توابع بصورت درونی در کتابخانه نوشته نشدهآ‌اند و برنامهآ‌نویس باید خودش این توابع را پیادهآ‌سازی کند و سپس در اختیار کتابخانه GSM قرار دهد.
      من خودم همیشه برای ارتباط با پورت سریال از کتابخانه uart ای که در avrlib است استفاده میآ‌کنم. از ویژگیآ‌های آن استفاده از وقفه و بافر ورودی/خروجی کردن اطلاعات است. این سورس در فولدر example که همراه کتابخانه gsm قابل دانلود است گنجانده شده است.
      در نهایت راهآ‌اندازی کتابخانه GSM توسط دستور زیر انجام شده است :
      کد PHP:
      gsm_init(uartSendByteuartGetByte);        // Initial gsm library 


      سپس توسط تابع gsm_text_sms پیام از نوع text انتخاب میآ‌شود. (پیام text در مقابل انواع دیگر مانند PDU قرار دارد). این تابع در حقیقت فرمان AT+CMGF=1 را به ماژول میفرستد.

      در ادامه وارد حلقه اصلی برنامه میآ‌شویم و توسط تابع gsm_check_new_sms منتظر دریافت SMS جدید میآ‌نشینیم. ورودی این تابع اشارهآ‌گری به متغیر نوع SMS است و خروجی آن مکان SMS خوانده شده در حافظه است. اگر هم هیچ پیام جدیدی دریافت نشده باشد 0 برمیگرداند.
      کد PHP:
      gsm_check_new_sms( &sms ); 


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

      از اینجا به بعد دیگر اطلاعات SMS در متغیر sms است و میآ‌توان هر کاری با آن انجام داد. در اینجا متن پیام و شماره تلفن بر روی LCD مینویسیم.
      کد PHP:
      lcd_clear(); lcd_print(sms.body);
      lcd_gotoXY(01); lcd_print(sms.number); 


      سپس یک SMS به پیام دهنده میآ‌فرستیم که متن آن Your SMS Recieved است. ارسال SMS توسط تابع gsm_send_sms صورت میآ‌گیرد. ورودی اول شماره تلفن مقصد است، ورودی دوم متن پیام است و ورودی سوم این تابع تعداد تلاش مجدد برای ارسال پیام در صورت Deliver نشدن آن است که در اینجا بر روی ۲ تنظیم شده است. یعنی برنامه هربار که SMS ارسال میآ‌شود منتظر Delivery Report میماند و اگر در مدت زمان مشخصی پیام دلیور نشد مجددا SMS را ارسال میآ‌کند و اینکار را ۲ بار انجام میآ‌دهد.
      کد PHP:
      gsm_send_smssms.number, "Your SMS Recieved!", ); 


      ================== دانلود مثال ==============
      فایلآ‌های کامل تمام مثالآ‌ها بهمراه سورس اصلی کتابخانه توسط لینکی که در پست اول دادم قابل دانلود هست.
      دوستانی که از Git استفاده میآ‌کنند فقط کافیه از دستور زیر برای دریافت فایلآ‌های جدید استفاده کنن:

      git pull

      چگونه هوشمندانه بپرسیم

      دیدگاه


        #4
        پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

        ببخشید که سوالم ابتداییه:
        برای کار با ATMega128 که دو واحد UART داره، این کتابخانه با کدوم یکیش ارتباط داره؟
        uart0 یا uart1 ؟
        ممنون!

        دیدگاه


          #5
          پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

          نوشته اصلی توسط lostlord
          ببخشید که سوالم ابتداییه:
          برای کار با ATMega128 که دو واحد UART داره، این کتابخانه با کدوم یکیش ارتباط داره؟
          uart0 یا uart1 ؟
          ممنون!
          خب این دست خودمون هست که چه تابعی رو برای ارتباط سریال به کتابخونهٔ GSM بدیم. همونطور که گفته شد ارتباط با پورت سریال بصورت داخلی در خود کتابخونه وجود نداره و برنامهآ‌نویس باید به سلیقه خودش یک تابع برای اینکار بنویسه.
          من همیشه موقع کار با ATmega128، از کتابخونهٔ uart2.h که در avrlib هست استفاده میآ‌کنم و هنگام راهآ‌اندازی اولیهٔ کتابخونه GSM با توجه به اینکه از UART0 استفاده شده یا UART1، تابع درست رو به کتابخونه پاس میدم.
          مثلا اگر از UART0 استفاده کرده باشم:
          کد PHP:
          gsm_init(uart0SendByteuart0GetByte); 


          با اگر از UART1 استفاده کنم به این صورت :
          کد PHP:
          gsm_init(uart1SendByteuart1GetByte); 

          چگونه هوشمندانه بپرسیم

          دیدگاه


            #6
            پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

            آقای رستمی متشکر از پست کد پروژه.
            می خواستم اگه میشه یک کم راجع به git ، CVS, SVN و غیره ... توضیح بدین،چطور یک کاربر windows میتونه از اونا استفاده کنه! اگر ممکن باشه مثال عملی بزنید.

            دیدگاه


              #7
              پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

              نوشته اصلی توسط Ali_Asadzadeh
              آقای رستمی متشکر از پست کد پروژه.
              می خواستم اگه میشه یک کم راجع به git ، CVS, SVN و غیره ... توضیح بدین،چطور یک کاربر windows میتونه از اونا استفاده کنه! اگر ممکن باشه مثال عملی بزنید.
              البته توی این تاپیک که نمیشه به این موضوع پرداخت، ولی برای شما که علاقهآ‌مند هستید اسلایدی در مورد subversion الحاق کردم. برای شروع نقطه بدی نیست.
              البته Git نسبت به SVN ویژگیآ‌های جالبتری داره که در پروژهآ‌های جدید معمولا از اون استفاده میشه. مستندات براش روی اینترنت زیاد هست.
              فایل های پیوست شده
              چگونه هوشمندانه بپرسیم

              دیدگاه


                #8
                پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                میشه یکم بیشتر راجع به add کردن کتابخونه ها توضیح بدید. مثلا برای اینکه برنامه ی بالا با atmega16 اجرا بشه چکار باید کرد؟
                بسیار ممنون.

                دیدگاه


                  #9
                  پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                  نوشته اصلی توسط mahdi_1012
                  میشه یکم بیشتر راجع به add کردن کتابخونه ها توضیح بدید. مثلا برای اینکه برنامه ی بالا با atmega16 اجرا بشه چکار باید کرد؟
                  بسیار ممنون.
                  منظورتون از add کردن کتابخونه رو متوجه نمیشم. استفاده از کتابخونه برای هر میکروی خاص هم بستگی به کامپایل پروژه و Makefile و اینا داره.
                  چگونه هوشمندانه بپرسیم

                  دیدگاه


                    #10
                    پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                    من میخواستم از این کتابخونه توی کدویژن استفاده کنم.
                    یه سری تغییرات دادم ولی درست جواب نمیده!
                    میشه منو راهنمایی کنید
                    ممنون

                    دیدگاه


                      #11
                      پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                      نوشته اصلی توسط lostlord
                      من میخواستم از این کتابخونه توی کدویژن استفاده کنم.
                      یه سری تغییرات دادم ولی درست جواب نمیده!
                      میشه منو راهنمایی کنید
                      ممنون
                      نه راستش تا درست سوال نپرسید نمیآ‌تونم راهنماییتون کنم.
                      من از جمله یه سری تغییرات دادم ولی درست جواب نمیده! هیچ چیزی متوجه نمیشم!
                      چگونه هوشمندانه بپرسیم

                      دیدگاه


                        #12
                        پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                        خیلی ببخشید که یک همچین سوالی میپرسم.
                        اگه میشه کار هایی که بعد از نصب CODEVISION باید انجام بدم که برنامه ی بالا رو برای MEGA16 کامپایل کنم چی ها هست؟ واقعا ممنون میشم.

                        دیدگاه


                          #13
                          پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                          نوشته اصلی توسط حمید رستمی
                          نه راستش تا درست سوال نپرسید نمیآ‌تونم راهنماییتون کنم.
                          من از جمله یه سری تغییرات دادم ولی درست جواب نمیده! هیچ چیزی متوجه نمیشم!
                          ببخشید که درست توضیح ندادم :sad:
                          راستش من برای ارسال و دریافت کارکتر از توابع خود کدویژن استفاده کردم مثل getchar() و putchar() و تغییری که دادم اینا بود:
                          توی main:
                          کد:
                          gsm_init(putchar,getchar);
                          توی gsm.c:
                          کد:
                          unsigned char (*gsm_get_byte)(void);
                          void gsm_init(void (*sendByte_func)(unsigned char c), unsigned char (*getByte_func)(void))
                          توی gsm.h:
                          کد:
                          void gsm_init( void(*sendByte_func)(unsigned char c), unsigned char(*getByte_func)(void) );
                          من فقط این قسمت ها رو تغییر دادم
                          وقتی که با میکرو تستش میکنم میکرو کامند ها رو به ماژول درست میفرسته ولی جوابی که ماژول میفرسته رو نمیگیره!
                          ممنون میشم اگه منو راهنماییم کنید.

                          دیدگاه


                            #14
                            پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                            نوشته اصلی توسط lostlord
                            ببخشید که درست توضیح ندادم :sad:
                            راستش من برای ارسال و دریافت کارکتر از توابع خود کدویژن استفاده کردم مثل getchar() و putchar() و تغییری که دادم اینا بود:
                            توی main:
                            کد:
                            gsm_init(putchar,getchar);
                            توی gsm.c:
                            کد:
                            unsigned char (*gsm_get_byte)(void);
                            void gsm_init(void (*sendByte_func)(unsigned char c), unsigned char (*getByte_func)(void))
                            توی gsm.h:
                            کد:
                            void gsm_init( void(*sendByte_func)(unsigned char c), unsigned char(*getByte_func)(void) );
                            من فقط این قسمت ها رو تغییر دادم
                            وقتی که با میکرو تستش میکنم میکرو کامند ها رو به ماژول درست میفرسته ولی جوابی که ماژول میفرسته رو نمیگیره!
                            ممنون میشم اگه منو راهنماییم کنید.
                            این مشکل احتمالا بخاطر این هست که تابع getchar در Codevision اطلاعات دریافت شده از پورت سریال رو بافر نمیآ‌کنه و فقط بایت لحظهآ‌ای رو بهتون میده. اما نیاز هست که بایتآ‌های دریافتی از پورت سریال در یک بافر ذخیره بشن و سر فرصت خونده بشن. شما میتونید از کتابخونه Uart موجود در avrlib استفاده کنید که این قابلیت بافر کردن رو داره.

                            به فایل مثال همراه با سورس کتابخونه نگاه کنید.
                            چگونه هوشمندانه بپرسیم

                            دیدگاه


                              #15
                              پاسخ : کتابخانهآ‌ای برای ارتباط AVR با GSM

                              ممنون از پاسختون.
                              ولی من از وقفه دریافت و ارسال سریال همراه با 256 بایت بافر استفاده کردم. (توی تنظیمات کدویزارد هست)
                              کد:
                              // USART0 Receiver buffer
                              #define RX_BUFFER_SIZE0 128
                              char rx_buffer0[RX_BUFFER_SIZE0];
                              
                              #if RX_BUFFER_SIZE0 <= 256
                              unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
                              #else
                              unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
                              #endif
                              
                              // This flag is set on USART0 Receiver buffer overflow
                              bit rx_buffer_overflow0;
                              
                              // USART0 Receiver interrupt service routine
                              interrupt [USART0_RXC] void usart0_rx_isr(void)
                              {
                              char status,data;
                              status=UCSR0A;
                              data=UDR0;
                              if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                                {
                                rx_buffer0[rx_wr_index0++]=data;
                              #if RX_BUFFER_SIZE0 == 256
                                // special case for receiver buffer size=256
                                if (++rx_counter0 == 0) rx_buffer_overflow0=1;
                              #else
                                if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
                                if (++rx_counter0 == RX_BUFFER_SIZE0)
                                 {
                                 rx_counter0=0;
                                 rx_buffer_overflow0=1;
                                 }
                              #endif
                                }
                              }
                              
                              #ifndef _DEBUG_TERMINAL_IO_
                              // Get a character from the USART0 Receiver buffer
                              #define _ALTERNATE_GETCHAR_
                              #pragma used+
                              char getchar(void)
                              {
                              char data;
                              while (rx_counter0==0);
                              data=rx_buffer0[rx_rd_index0++];
                              #if RX_BUFFER_SIZE0 != 256
                              if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
                              #endif
                              #asm("cli")
                              --rx_counter0;
                              #asm("sei")
                              return data;
                              }
                              #pragma used-
                              #endif
                              کتابخونه uart رو میشه توی کدویژن بدون تغییر توی اون استفاده کرد؟
                              ممنون از توجهتون

                              دیدگاه

                              لطفا صبر کنید...
                              X