//Logo Image
作者:甘凱文(2005-07-18);推薦:徐業良(2005-07-19);最近更新:甘凱文(2006-01-17)

PIC單晶片控制之簡訊模組的設計與整合

本文敘述結合PIC單晶片及GSM(Global System Mobile)模組,設計一個以PIC單晶片控制之「簡訊模組(Short Message Service Module, SMS Module)」,主控端控制器可用I2C的方式與此簡訊模組做通訊連結來傳送或接收簡訊。

1.     簡訊模組系統架構

本文開發之簡訊模組系統架構如圖1所示,所需的主要硬體包括GSM模組、PIC18F452、與MAX232等三個元件,GSM模組為簡訊發送的套件,PIC18F452GSM模組收發簡訊的控制器,而MAX232PIC18F452GSM的通訊橋接器。

1. 系統架構圖

核心控制元件PIC18F452單晶片以I2C的通訊接收主控端控制器如PIC_SERVER或其他控制器下達的命令,再控制GSM Module來發送或是接收簡訊。本文所使用的GSM ModuleWavecomM1206SimensTC35i,其硬體規格與外觀如表1與圖2所示。GSM Module本身提供了RS232傳輸介面,因此PIC18F452GSM Module便以RS232介面做為通訊連接方式,但PIC18F452本身並沒直接提供RS232傳輸介面,所以必須要使用MX232元件當作電位轉換的橋接器。

1. GSM Module硬體規格

Module型號

Wavecom M1206

Simens TC35i

GSM模式

900/1800MHz

900/1800MHz

電源供應範圍

5~32 VDC

8~30 VDC

操作溫度

-20°C~+55°C

-

傳輸介面

RS232

RS232

尺寸

98×54×25mm

65×74×33mm

重量

130g

130g

2.Simens TC35iWavecom M1206 GSM Module

2.     簡訊模組電路設計

以單晶片來控制GSM Module需要一些周邊電路來推動,主要電子元件包含了一個20MHz石震盪器配合兩顆22pF的電容、兩顆0.1mF(104)電容,以及兩個2K、一個4.7K的電阻做為提升電阻,完整的電路圖如圖3所示。細部單晶片驅動電路設計可參考本網站「自製電路驅動單晶片PIC16F877」一文。

3. 單晶片驅動電路

簡訊模組通訊介面連接如圖4所示,以I2C作為晶片與晶片之間的通訊橋樑,PIC18F452使用RC3RC4這兩隻腳位做連結,其中要注意的一點,在I2C通訊時雙邊控制器的其中一邊,必須要在這兩隻通訊腳位上各並聯一隻2.2K的提升電阻,詳細的I2C通訊方式與使用說明可參考本網站「PIC_SERVER教材(14)PIC單晶片I2C通訊簡介與實例」一文。

4. SMS Module通訊介面連接圖

簡訊模組使用RS232PIC18F452GSM Module之間的通訊介面,PIC18F452本身並沒提供RS232通訊介面,只提供RC6RC7這兩隻傳送與接收的TTL腳位。本模組MAX232這顆IC作為橋接器,可將PIC18F452傳送的TTL電壓轉換成RS232介面電壓,或是將RS232介面傳回電壓轉換成TTL的電壓。要使MAX232作動需要四顆0.1mF(104)電容與+5V電壓,MAX232提供兩組轉換介面,本模組使用其中的第一組轉換介面,而詳細的電路圖連接如圖5所示。

5. MAX232接線圖

3.     系統程式規劃

本節中將闡述此模組的系統程式規劃,並說明主控端如何下達命令指令來操控此模組。

6為系統程式規劃架構,表2為簡訊模組規劃的命令資料內容格式。當主控端控制器(如PIC_SERVER)下達發送簡訊命令(本文為I2C_W()),其傳送出的資料包含了一個Header字元“0x10”、一組Date字串、與一個Tail結束字元“#”,其中Date中包含了10個字元的PhonePhone為欲傳送的手機號碼)與Subject的簡訊內容(在本程式設定簡訊內容最長100個字元)。當簡訊模組的控制器接收到手機號碼與簡訊內容時,便以AT command模式控制GSM module發送簡訊,如圖6藍色線段。若主控端控制器下達要求簡訊命令(本文為I2C_R()),其資料內容包含了一個Header字元與一個Tail結束字元“#”,當簡訊模組接收到此指令時,會下AT command讀取GSM Module內新的簡訊內容,並回傳給主控端,如圖6紅色線段,可接受的簡訊內容在本程式設定最長為100個字元。

6. 系統程式規劃架構圖

2. 命令資料內容格式

Command

Header

Data

Tail

I2C Deliver SMS(I2C_W())

0x10

Phone

Subject

#

I2C Request SMS(I2C_R())

0x11

 

 

#

主控制端控制器程式需在程式前端加入圖7中的1~3行宣告程式,第1行的0x04SMS ModuleI2C位置,第2行的in_data為讀回SMS Module簡訊內容的暫存器,3~4行分別為傳送簡訊與讀取簡訊的副程式宣告,第7~8行是使用副程式的方式,如要讀取簡訊只需下達第7行程式,回傳內容會暫存到in_data中,使用者可針對in_data中內容再進一步的做後續處理,而傳送簡訊所下達的指令如程式第8行,其中Telephone_Message為一陣列,陣列中包含了電話號碼與簡訊內容,而資料格式規劃如表2Data部分,前10個字元為電話號碼,之後為訊息內容。

7. 主控端程式宣告部分

8為主控制端控制器程式中I2C_R()I2C_W()兩個副程式的完整內容。在讀取簡訊部分,第208~212行為以I2C方式對SMS模組下控制碼“0x11”,告知讀取簡訊模組的SIM卡中簡訊內容,首先開啟I2C通訊阜並呼叫address(0x04)使主控制端的I2C為寫入模式(此時SMS Module的中斷i2c_poll()=1),接著傳送控制碼“0x11”與結束碼“#”,完成指令下達後主控制端會等待0.5秒鐘(第213行),等SMS Module完成簡訊讀取,接著主控制端會以第215~225行的I2C命令將剛才SMS Module讀取的簡訊內容與簡訊內容長度回傳回來。第216行呼叫address+10x04+1)為使主控制端的I2C為讀取模式(此時SMS Module的中斷i2c_poll()=0),第218行將回傳的第一個字元為回傳完整簡訊長度,219~225行將簡訊內容存入到in_data的暫存器中,因為in_data為一個完整的簡訊內容,其內容包含了發送者的電話,傳送的時間與訊息內容,為了讓使用者方便使用,所以在程式227~248行將簡訊資料的發送者的電話與訊息內容取樣出分別存放在PSM的暫存器中,使用者可根據這2個暫存器做後續處理。

傳送簡訊副程式部分為圖8程式的第251~266行,首先開啟I2C通訊阜並傳達“0x10”傳送簡訊的命令,並呼叫address(0x04)成寫入模式,接著傳送控制碼“0x10”,然後將Telephone_Message所存的電話與訊息放至副程式的data暫存器中,再以I2C方式傳到SMS Module做發送簡訊的後端處理。

8. 主控端副程式部分

在簡訊模組的程式部分,包含了宣告與中斷、傳送簡訊、讀取簡訊、與回傳簡訊的副程式等幾個部分,首先宣告與中斷的程式如圖9所示,第1~18為程式的一些參數與副程式的宣告,其中的第10行的“0xFAB.4”是用來控制PIC18F452RS232接收腳的開啟或關閉,在本程式使用上提供一個更有效的接收控制開關,可以過濾不必要的資訊提高讀取正確性,此位置的使用方式為當0xFAB.4=0時為關閉接收腳,0xFAB.4=1時為開啟接收腳。圖9程式20~38為中斷程式部分,當主控端發送呼叫address(0x04)時,簡訊模組的PIC18F452便會執行I2C_RW_ISR()這副程式,且此時i2c_poll()=1為被寫入狀況(第22~33行),並將接收到的字串存放在i2c_data_rcv暫存位置(程式第25行)。接著判斷i2c_data_rcv[0]位置的資料是“0x10”發送簡訊命令或是“0x11”讀取簡訊命令,如果是“0x10”這個命令,便計算接收到的i2c_data_rcv字串長度,並執行Sent_SMS()發送簡訊的副程式(第28~29行);如果是讀取簡訊命令”0x11”便執行讀取簡訊的副程式Receive_SMS()(第30~31行)。當主控制端發送呼叫address+1(0x04+1)I2C_RW_ISR()副程式的i2c_poll()=0,此時便執行Rx()副程式將讀取到簡訊傳回主控制端(第34~37行)。

9. 簡訊模組宣告與中斷程式

10為簡訊模組主程式部分,第45~48行是中斷使用初值設定,53~57行是GSM的初值設定,包括了不使用回應值、Text模式、與簡訊的存在位置設定,詳細內容可參考本網站「PIC_SERVER教材(13)-如何以PIC_SERVER收發手機簡訊訊」一文。

10. 簡訊模組主程式

11為簡訊模組的副程式發送簡訊部分,在程式的第82~85行是將剛傳來存放在i2c_data_rcv的電話號碼與簡訊內容區分出來,並分別存放在PhoneMeg的暫存位置,第88CREN=1(0xFAB.4=1)為開啟18F542RS232接收腳,第89行程式是對GSM Module下達發送簡訊的AT command,並在91~94行等待回應位元“0x20”,最後第95~96行傳送訊息內容並關閉RS232接收腳。

11. SMS Module副程式發送簡訊部分

簡訊模組在讀取簡訊副程式部分因為2GSM Module格式不盡相同,所以針對2GSM Module分別有兩種讀取簡訊副的程式,圖12TC35i GSM Module讀取簡訊的副程式,107~111行是使用參數之設定,115行下達命令讀取GSM Module的第一條簡訊,接著第118~139行為判斷是否有新訊息,如果沒有新訊息便將“4None”存放到string的暫存位置(第133行),其中“\x04”用來告知主控端要傳回的字串長度(“None”4個字元)。假如有新訊息,首先計算訊息長度(第113行),接著將長度與訊息內容存放到string的暫存位置(第137行),最後在138行關閉RS232接收腳與刪除第一條簡訊。程式第143~147行是當主控端呼叫address1(0x04+1)使簡訊模組的I2C中斷i2c_poll()=0,簡訊模組便將剛才存在string的暫存位置的資料傳送回主控制端。圖13Wavecom GSM Module讀取簡訊的副程式其內容與圖12中的程式大同小異只是針對GSM Module回傳不同格式內容做修改。

12. TC35i GSM Module讀取簡訊的副程式

12. Wavecom GSM Module讀取簡訊的副程式

4.     簡訊模組應用於護翁系統

本節以針對幼稚園小朋友所設計的「護翁系統」為應用例子,說明如何使用簡訊模組結合於護翁系統成為事件驅動的裝置。圖13為獨立型護翁系統架構圖,主控端為一PIC_SERVER,連接RFID ReaderMMC記憶卡、和簡訊模組。系統管理者可在終端電腦透過VB程式介面編輯各RFID Tag所對應的客戶(如幼稚園小朋友)資料,而客戶資料中包含了家長或代理人手機號碼以及簡訊內容。

當幼稚園小朋友身上配掛的RFID Tag經過了設置有RFID Reader的門時,DDS會根據傳來的Tag IDMMC資料庫中搜尋所對應的手機號碼與簡訊資訊,接著與判讀進出狀況的感應器之判讀結果做訊息整合,再以I2C方式將這組手機號碼與整合後的訊息傳到簡訊模組來發送簡訊。在這個架構下簡訊模組分擔了DDS的工作,使簡訊模組成為獨立型護翁系統中的事件驅動裝置的模組。

13. 「護翁系統」架構圖