- 必要な材料:
- GSMモジュール:
- ATコマンドを使用したGSMモジュールとの通信:
- 回路図:
- PICマイクロコントローラーのプログラミング:
- シミュレーション:
- GSMおよびPICを使用した通話の発信と受信:
GSMモジュールは、特にプロジェクトでリモートアクセスが必要な場合に使用するのが魅力的です。これらのモジュールは、電話の発着信、SMSの送受信、GPRSを使用したインターネットへの接続など、通常の携帯電話で実行できるすべてのアクションを実行できます。通常のマイクとスピーカーをこのモジュールに接続して、会話することもできます。モバイル通話。これにより、マイクロコントローラーとのインターフェースが可能になれば、多くの創造的なプロジェクトへの扉が開かれます。したがって、このチュートリアルでは、GSMモジュール(SIM900A)をPICマイクロコントローラーとインターフェイスする方法を学習し、GSMモジュールを使用して電話をかけたり受けたりすることでそれを実証します。以前、通話とメッセージングのためにArduinoとRaspberryPiとインターフェイスしました。
- ArduinoとGSMモジュールを使用した通話とメッセージ
- RaspberryPiとGSMモジュールを使用した通話とテキスト
必要な材料:
- PICマイクロコントローラー(PIC16F877A)
- GSMモジュール(SIM900またはその他)
- 接続線
- 12Vアダプター
- PicKit 3
GSMモジュール:
GSMモジュールは、ATコマンドモードを使用することにより、マイクロコントローラーがなくても使用できます。上に示したように、GSMモジュールにはUSARTアダプターが付属しており、MAX232モジュールを使用してコンピューターに直接接続するか、TxピンとRxピンを使用してマイクロコントローラーに接続できます。また、マイクまたはスピーカーを接続できるMIC +、MIC-、SP +、SP-などの他のピンにも気付くでしょう。モジュールは、通常のDCバレルジャックを介して12Vアダプターから電力を供給できます。
モジュールのスロットにSIMカードを挿入して電源を入れると、電源LEDが点灯していることがわかります。ここで1分ほど待つと、3秒ごとに1回赤(または他の色)のLEDが点滅するはずです。これは、モジュールがSIMカードとの接続を確立できたことを意味します。これで、モジュールを電話または任意のマイクロコントローラーに接続することができます。
ATコマンドを使用したGSMモジュールとの通信:
ご想像のとおり、GSMモジュールはシリアル通信で通信でき、1つの言語しか理解できません。それが「ATコマンド」です。GSMモジュールに伝えたいことや尋ねたいことは何でも、ATコマンドを介してのみ行う必要があります。たとえば、モジュールがアクティブかどうかを知りたい場合です。「AT」のようなコマンドを要求(送信)すると、モジュールは「OK」と応答します。
これらのATコマンドは、データシートで詳しく説明されており、公式データシートに記載されています。はい!はい!これは271ページのデータシートであり、それらを読むのに数日かかる場合があります。そこで、これをすぐに稼働させるために、以下にいくつかの最も重要なATコマンドを示しました。
AT |
確認のためにOKで返信します |
AT + CPIN? |
信号品質を確認する |
AT + COPS? |
サービスプロバイダー名を探す |
ATD96XXXXXXXX; |
特定の番号に電話し、セミコロンで終わります |
AT + CNUM |
SIMカードの番号を確認します(一部のSIMでは機能しない場合があります) |
ATA |
着信に応答する |
ATH |
現在の着信を切断します |
AT + COLP |
着信番号を表示する |
AT + VTS =(数値) |
DTMF番号を送信します。モバイルキーパッドの任意の番号を(番号)に使用できます |
AT + CMGR |
AT + CMGR = 1は、最初の位置でメッセージを読み取ります |
AT + CMGD = 1 |
最初の位置でメッセージを削除します |
AT + CMGDA =” DEL ALL” |
SIMからすべてのメッセージを削除する |
AT + CMGL =” ALL” |
SIMからのメッセージをすべて読む |
AT + CMGF = 1 |
SMS構成を設定します。「1」はテキストのみのモード用です |
AT + CMGS =“ +91 968837XXXX” > CircuitDigestテキスト
|
ここ968837XXXXの特定の番号にSMSを送信します。「>」が表示されたら、テキストの入力を開始します。Ctrl + Zを押してテキストを送信します。 |
AT + CGATT? |
SIMカードでインターネット接続を確認するには |
AT + CIPSHUT |
TCP接続を閉じる、つまりインターネットから切断する |
AT + CSTT =“ APN”、” username”、” Pass” |
APNとパスキーを使用してGPRSに接続します。ネットワークプロバイダーから入手できます。 |
AT + CIICR |
SIMカードにデータパックがあるかどうかを確認します |
AT + CIFSR |
SIMネットワークのIPを取得する |
AT + CIPSTART =“ TCP”、” SERVER IP”、” PORT” |
TCPIP接続を設定するために使用されます |
AT + CIPSEND |
このコマンドは、サーバーにデータを送信するために使用されます |
回路図:
GSMモジュールとPICマイクロコントローラーのインターフェースの接続図を以下に示します。
GSMモジュールのTxピンとRxピンをそれぞれPICMCUPIC16F877AのRxピンとTxピンに接続しただけです。これにより、両方の間にシリアル接続が確立されます。また、GSMモジュールとPICモジュールの両方を共通に接地することを忘れないでください。また、LCDディスプレイを使用して、GSMモジュールのステータスを確認しました。接続が完了すると、ハードウェアは次のようになります。
PIC Perfボードは、PICマイクロコントローラーの使用方法を学習したPICチュートリアルシリーズ用に作成されました。Pickit 3を使用してプログラムを作成する方法がわからない場合は、MPLABXとXC8を使用したPICマイクロコントローラーのチュートリアルに戻ることをお勧めします。これらの基本情報はすべてスキップします。
PICマイクロコントローラーのプログラミング:
このプロジェクトの完全なプログラムは、このチュートリアルの下部にあります。ここでは、いくつかの重要な関数とコードについて説明します。このプログラムには、LCDとPICマイクロコントローラーのインターフェイスからのLCDコードも含まれています。LCDをPICマイクロコントローラーで使用する方法を知りたい場合は、このチュートリアルにアクセスしてください。
先に述べたように、シリアルモードの通信を介してATコマンドを使用してPICとGSMの間で通信します。したがって、最初に、Initialize _SIM900() を使用して、PICマイクロコントローラーのUSART通信モジュールを初期化する必要があります 。 関数。この関数内で、TxピンとRXピンを宣言し、9600ボーレートと8ビットモードで非同期の受信と送信を初期化します。
// *** SIM900のUARTを初期化します** // void Initialize_SIM900(void){// **** UARTのI / Oピンを設定します**** // TRISC6 = 0; //出力として設定されたTXピンTRISC7 = 1; // RXピンを入力として設定// ________ I / Oピンを設定__________ // / **必要なボーレートのSPBRGレジスタを初期化し、高速ボーレートのBRGHを設定** / SPBRG = 129; // SIM900は9600ボーレートで動作するため、129 BRGH = 1; //高baud_rateの場合// _________ baud_rate設定の終了_________ //// ****非同期シリアルポートを有効にする******* // SYNC = 0; //非同期SPEN = 1; //シリアルポートピンを有効にします// _____非同期シリアルポートを有効にします_______ // // **送受信の準備をします** // TXEN = 1; //送信を有効にするCREN = 1; //受信を有効にします// __ UARTモジュールを起動し、送信と受信の準備をします__ // // ** 8ビットモードを選択します** // TX9 = 0; //選択された8ビット受信RX9 = 0;// 8ビット受信モードが選択されました// __ 8ビットモードが選択されました__ //} // ________ UARTモジュールが初期化されました__________ //
次に、GSMモジュールとの間で情報を読み書きする必要があります。このために、関数_SIM900_putch()、_ SIM900_getch()、_ SIM900_send_string()、_ SIM900_print()を使用します。これらの関数は、TXREGやRCREGなどの送信および受信バッファレジスタを使用して、データをシリアルに読み書きします。
// ** 1バイトの日付をUARTに送信する関数** // void _SIM900_putch(char bt){while(!TXIF); // TXバッファが解放されるまでプログラムを保持しますTXREG = bt; //受信した値を送信バッファにロードします} // _____________関数の終了________________ // // ** UARTから1バイトの日付を取得する関数** // char _SIM900_getch(){if(OERR)//エラーをチェックします{ CREN = 0; //エラーの場合-> CREN = 1をリセット; //エラーの場合->リセット} while(!RCIF); // RXバッファが解放されるまでプログラムを保持しますreturnRCREG; //値を受信してメイン関数に送信します} // _____________関数の終了________________ // // **文字列をバイトに変換する関数** // void SIM900_send_string(char * st_pt){while(* st_pt)//存在する場合char _SIM900_putch(* st_pt ++);です。//バイトデータとして処理します} // ___________関数の終わり______________ // // **変更されたコードの終わり** // void _SIM900_print(unsigned const char * ptr){while(* ptr!= 0){_ SIM900_putch(* ptr ++); }
上記の機能は普遍的であり、どのアプリケーションでも変更する必要はありません。彼らは大まかな紹介をするためだけに説明されました。理解したい場合は、それらを深く掘り下げることができます。
ここで、main関数内で、USART接続を初期化し、以下のコード行を使用して、「AT」を送信するときに「OK」を受信できるかどうかを確認します。
do {Lcd_Set_Cursor(2,1); Lcd_Print_String( "モジュールが見つかりません"); } while(!SIM900_isStarted()); // GSMが「OK」を送り返すまで待ちますLcd_Set_Cursor(2,1); Lcd_Print_String( "Module Detected"); __delay_ms(1500);
関数SIM900_isStarted(); 「AT」をGSMに送信し、GSMからの応答「OK」を待ちます。はいの場合、1を返します。それ以外の場合は0を返します。
モジュールが検出されない場合、または接続に問題がある場合は、LCDに「モジュールが見つかりません」と表示されます。それ以外の場合は、モジュールが検出されたことが表示され、次の手順に進みます。SIMカードが以下で検出できるかどうかを確認します。コード行。
/ * SIMカードが検出されたかどうかを確認します* / do {Lcd_Set_Cursor(2,1); Lcd_Print_String( "SIMが見つかりません"); } while(!SIM900_isReady()); // GSMが "+ CPIN:READY"を送り返すまで待ちますLcd_Set_Cursor(2,1); Lcd_Print_String( "SIMが検出されました"); __delay_ms(1500);
関数SIM900_isReady()は「AT + CPIN?」を送信します。GSMに送信し、GSMからの応答「+ CPIN:READY」を待ちます。はいの場合、1を返します。それ以外の場合は0を返します。
SIMカードが見つかった場合は、LCDにSIMが検出されたことが表示されます。その後、私たちは「コマンドを使用して電話をかける試すことができATDの MOBILENUMBERを 。」。ここでは例として、ATD93643159XX;として自分の番号を使用しました。そこで、それぞれの携帯電話番号を置き換える必要があります。
/ *電話をかける* / do {_SIM900_print( "ATD93643XXXXX; \ r \ n"); //ここでは、番号93643XXXXX Lcd_Set_Cursor(1,1);に電話をかけています。Lcd_Print_String( "Placing Call…."); } while(_SIM900_waitResponse()!= SIM900_OK); // ESPが「OK」を送り返すまで待つLcd_Set_Cursor(1,1); Lcd_Print_String( "Call Placed…."); __delay_ms(1500);
通話が発信されると、LCDに「通話が発信されました」と表示され、指定された番号への着信があります。
また、GSMモジュールに接続されている携帯電話番号に電話をかけ、以下のコードを使用してLCD画面で通知を受け取ることもできます。
while(1){if(_SIM900_waitResponse()== SIM900_RING)//着信があるかどうかを確認する{Lcd_Set_Cursor(2,1); Lcd_Print_String( "着信!!。"); }}
GSMモジュールが着信を検出すると、LCDモジュールの2行目に着信を表示します。関数 _SIM900_waitResponse() は、GSMモジュールからの着信データをチェックします。 waitResponce() により「RING」に相当する SIM900_RINGを 受信すると、ステータス「Incomingcall」を表示します。
このような独自の機能を作成して、GSMモジュールを使用してほぼすべてのタイプのアクティベーションを実行できます。ハードコーディングしたい場合は、__ SIM900_print()関数を使用して、以下のようなATコマンドを送信できます。
_SIM900_print( "AT + CPIN?\ r \ n");
コマンドの後に「\ r \ n」を付けて、コマンドが終了していることを示す必要があることに注意してください。
シミュレーション:
プログラムがどのように機能するかを理解したら、シミュレーションを試して、ニーズに合わせて変更を加えることができます。シミュレーションはあなたに多くの時間を節約します。シミュレーションはProteusを使用して行われ、次のようになります。
ご覧のとおり、Proteusの仮想端末オプションを使用して、プログラムが期待どおりに応答しているかどうかを確認しました。ポップアップダイアログボックスから値を入力できます。たとえば、実行を押すとすぐに、上記のような黒いダイアログボックスが表示され、ATが表示されます。これは、GSMモジュールATが送信されたことを意味します。これで、ボックスに「OK」と入力してEnterキーを押すことでPICに返信できます。 PICはそれに応答します。同様に、すべてのATコマンドを試すことができます。
GSMおよびPICを使用した通話の発信と受信:
コードとハードウェアがどのように機能するかを理解したら、以下のプログラムをPICにアップロードして、モジュールの電源を入れます。すべてが正常に機能している場合、LCDには「モジュールが検出されました」、「SIMが検出されました」、「通話が開始されました」と表示されます。「発信済み」と表示されると、プログラムで指定された番号への着信があります。
GSMモジュールにある番号に電話をかけることもできます。LCDに「着信」と表示され、SIMが呼び出されていることが示されます。
プロジェクトの完全な動作は、以下のビデオに示されています。あなたがプロジェクトを理解し、それを楽しんだことを願っています。問題が発生した場合は、コメントセクションまたはフォーラムに質問を投稿してください。喜んでお手伝いさせていただきます。