- วัสดุที่ต้องการ:
- โมดูล GSM:
- การสื่อสารกับโมดูล GSM โดยใช้คำสั่ง AT:
- แผนภูมิวงจรรวม:
- การเขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC ของคุณ:
- จำลองสถานการณ์:
- การโทรออกและรับสายโดยใช้ GSM และ PIC:
โมดูล GSMมีความน่าสนใจในการใช้งานโดยเฉพาะอย่างยิ่งเมื่อโครงการของเราต้องการการเข้าถึงระยะไกล โมดูลเหล่านี้สามารถดำเนินการทั้งหมดที่โทรศัพท์มือถือปกติของเราทำได้เช่นโทรออก / รับสายส่ง / รับ SMS เชื่อมต่ออินเทอร์เน็ตโดยใช้ GPRS เป็นต้นนอกจากนี้คุณยังสามารถเชื่อมต่อไมโครโฟนและลำโพงปกติเข้ากับโมดูลนี้และสนทนากับคุณ โทรศัพท์มือถือ สิ่งนี้จะเปิดประตูไปสู่โครงการสร้างสรรค์มากมายหากสามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์ได้ ดังนั้นในบทช่วยสอนนี้เราจะเรียนรู้วิธีการเชื่อมต่อโมดูล GSM (SIM900A) กับไมโครคอนโทรลเลอร์ PIC ของเราและจะสาธิตโดยการโทรออกและรับสายโดยใช้โมดูล GSM ก่อนหน้านี้เราได้เชื่อมต่อกับ Arduino และ Raspberry Pi สำหรับการโทรและส่งข้อความ:
- โทรและส่งข้อความโดยใช้ Arduino และโมดูล GSM
- โทรและส่งข้อความโดยใช้ Raspberry Pi และโมดูล GSM
วัสดุที่ต้องการ:
- ไมโครคอนโทรลเลอร์ PIC (PIC16F877A)
- โมดูล GSM (SIM900 หรืออื่น ๆ)
- การเชื่อมต่อสายไฟ
- อะแดปเตอร์ 12V
- PicKit 3
โมดูล GSM:
โมดูล GSM สามารถใช้งานได้แม้ไม่มีไมโครคอนโทรลเลอร์โดยใช้โหมดคำสั่ง AT ดังที่แสดงไว้ด้านบนโมดูล GSM มาพร้อมกับอะแดปเตอร์ USART ซึ่งสามารถเชื่อมต่อโดยตรงกับคอมพิวเตอร์โดยใช้โมดูล MAX232 หรือสามารถใช้หมุด Tx และ Rx เพื่อเชื่อมต่อกับไมโครคอนโทรลเลอร์ คุณยังสามารถสังเกตเห็นหมุดอื่น ๆ เช่น MIC +, MIC-, SP +, SP- ฯลฯ ซึ่งสามารถเชื่อมต่อไมโครโฟนหรือลำโพงได้ โมดูลสามารถใช้พลังงานจากอะแดปเตอร์ 12V ผ่านแจ็คกระบอกสูบ DC ปกติ
ใส่ซิมการ์ดของคุณในช่องของโมดูลและเปิดเครื่องคุณจะสังเกตเห็นไฟ LED เปิด / ปิดเครื่อง ตอนนี้รอประมาณหนึ่งนาทีและคุณจะเห็นไฟ LED สีแดง (หรือสีอื่น ๆ) กะพริบทุกๆ 3 วินาที ซึ่งหมายความว่าโมดูลของคุณสามารถสร้างการเชื่อมต่อกับซิมการ์ดของคุณได้ ตอนนี้คุณสามารถดำเนินการเชื่อมต่อโมดูลของคุณกับโทรศัพท์หรือไมโครคอนโทรลเลอร์ได้
การสื่อสารกับโมดูล GSM โดยใช้คำสั่ง AT:
อย่างที่คุณคาดเดาได้โมดูล GSM สามารถสื่อสารผ่านการสื่อสารแบบอนุกรมและเข้าใจได้เพียงภาษาเดียวเท่านั้นนั่นคือ“ คำสั่ง AT ” สิ่งที่คุณอาจต้องการบอกหรือถามไปยังโมดูล GSM ควรใช้คำสั่ง AT เท่านั้น ตัวอย่างเช่นหากคุณต้องการทราบว่าโมดูลของคุณทำงานอยู่หรือไม่ คุณควรถาม (ส่ง) คำสั่งเช่น“ AT” และโมดูลของคุณจะตอบว่า“ ตกลง”
คำสั่ง AT เหล่านี้อธิบายไว้อย่างดีในแผ่นข้อมูลและสามารถพบได้ที่นี่ในแผ่นข้อมูลอย่างเป็นทางการ ตกลง! ตกลง! เป็นแผ่นข้อมูล 271 หน้าและคุณอาจใช้เวลาหลายวันในการอ่าน ดังนั้นฉันจึงให้คำสั่ง AT ที่สำคัญที่สุดด้านล่างเพื่อให้คุณเริ่มใช้งานได้เร็ว ๆ นี้
ที่ |
ตอบตกลงเพื่อรับทราบ |
ที่ + CPIN? |
ตรวจสอบคุณภาพสัญญาณ |
ที่ + COPS? |
ค้นหาชื่อผู้ให้บริการ |
ATD96XXXXXXXX; |
โทรไปยังหมายเลขเฉพาะลงท้ายด้วยอัฒภาค |
ที่ + CNUM |
ค้นหาจำนวนซิมการ์ด (อาจใช้ไม่ได้กับบางซิม) |
ATA |
รับสายเรียกเข้า |
ATH |
วางสายเรียกเข้าปัจจุบัน |
ที่ + COLP |
แสดงหมายเลขโทรเข้า |
AT + VTS = (หมายเลข) |
ส่งหมายเลข DTMF คุณสามารถใช้หมายเลขใดก็ได้บนปุ่มกดบนมือถือของคุณสำหรับ (หมายเลข) |
ที่ + CMGR |
AT + CMGR = 1 อ่านข้อความที่ตำแหน่งแรก |
ที่ + CMGD = 1 |
ลบข้อความที่ตำแหน่งแรก |
ที่ + CMGDA =” DEL ทั้งหมด” |
ลบข้อความทั้งหมดออกจากซิม |
ที่ + CMGL = "ทั้งหมด" |
อ่านข้อความทั้งหมดจากซิม |
ที่ + CMGF = 1 |
ตั้งค่าการกำหนดค่า SMS “ 1” ใช้สำหรับโหมดข้อความเท่านั้น |
ที่ + CMGS =“ +91 968837XXXX” > ข้อความ CircuitDigest
|
ส่ง SMS ไปที่หมายเลขเฉพาะที่นี่ 968837XXXX เมื่อคุณเห็น“>” เริ่มป้อนข้อความ กด Ctrl + Z เพื่อส่งข้อความ |
ที่ + CGATT? |
เพื่อตรวจสอบการเชื่อมต่ออินเทอร์เน็ตบนซิมการ์ด |
ที่ + CIPSHUT |
ในการปิดการเชื่อมต่อ TCP หมายถึงการยกเลิกการเชื่อมต่ออินเทอร์เน็ตจากฟอร์ม |
AT + CSTT =“ APN”,” ชื่อผู้ใช้”,” ผ่าน” |
เชื่อมต่อกับ GPRS ด้วยคีย์ APN และ Pass ของคุณ ได้จากผู้ให้บริการเครือข่าย |
ที่ + CIICR |
ตรวจสอบว่าซิมการ์ดมีชุดข้อมูลหรือไม่ |
ที่ + CIFSR |
รับ IP ของเครือข่ายซิม |
AT + CIPSTART =“ TCP”,” SERVER IP”,” PORT” |
ใช้เพื่อตั้งค่าการเชื่อมต่อ TCP IP |
ที่ + CIPSEND |
คำสั่งนี้ใช้เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ |
แผนภูมิวงจรรวม:
แผนผังการเชื่อมต่อสำหรับการเชื่อมต่อโมดูล GSM กับไมโครคอนโทรลเลอร์ PICแสดงอยู่ด้านล่าง
เราได้เชื่อมต่อพิน Tx และ Rx ของโมดูล GSM กับพิน Rx และ Tx ของ PIC MCU PIC16F877A ตามลำดับ สิ่งนี้จะสร้างการเชื่อมต่อแบบอนุกรมระหว่างทั้งสอง นอกจากนี้อย่าลืมกราวด์ทั่วไปทั้งโมดูล GSM และ PIC เรายังใช้จอ LCD เพื่อทราบสถานะของโมดูล GSM ของเรา เมื่อการเชื่อมต่อเสร็จสิ้นฮาร์ดแวร์ของคุณจะมีลักษณะดังนี้
บอร์ด PIC Perf สร้างขึ้นสำหรับซีรีย์การสอน PIC ของเราซึ่งเราได้เรียนรู้วิธีใช้ไมโครคอนโทรลเลอร์ PIC คุณอาจต้องการกลับไปที่บทเรียนไมโครคอนโทรลเลอร์ PIC เหล่านั้นโดยใช้ MPLABX และ XC8 หากคุณไม่ทราบวิธีเบิร์นโปรแกรมโดยใช้ Pickit 3 เนื่องจากฉันจะข้ามข้อมูลพื้นฐานเหล่านั้นทั้งหมด
การเขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC ของคุณ:
โปรแกรมที่สมบูรณ์สำหรับโครงการนี้สามารถพบได้ที่ด้านล่างของบทช่วยสอนนี้ ที่นี่ฉันจะอธิบายฟังก์ชั่นที่สำคัญและส่วนของโค้ด โปรแกรมนี้ยังมีรหัส LCD ซึ่งมาจาก Interfacing LCD กับ PIC Microcontroller คุณสามารถไปที่บทช่วยสอนนั้นหากคุณอยากรู้ว่า LCD สามารถใช้กับไมโครคอนโทรลเลอร์ PIC ได้อย่างไร
ดังที่กล่าวไว้ก่อนหน้านี้เราจะสื่อสารระหว่าง PIC และ GSM โดยใช้คำสั่ง AT ผ่านโหมด Serial ของการสื่อสาร ดังนั้นก่อนอื่นเราต้องเริ่มต้นโมดูลการสื่อสาร USART ในไมโครคอนโทรลเลอร์ PIC ของเราโดยใช้ Initialize _SIM900 (); ฟังก์ชัน ภายในฟังก์ชันนี้เราจะประกาศพิน Tx และ RX และเริ่มต้นการรับและส่งข้อมูลแบบอะซิงโครนัสที่อัตราการส่งข้อมูล 9600 และโหมด 8 บิต
// *** เริ่มต้น UART สำหรับ SIM900 ** // เป็นโมฆะ Initialize_SIM900 (โมฆะ) {// **** การตั้งค่าพิน I / O สำหรับ UART **** // TRISC6 = 0; // TX Pin ตั้งเป็นเอาต์พุต TRISC7 = 1; // RX Pin ตั้งเป็นอินพุต // ________ ชุดพิน I / O __________ // / ** เริ่มต้นการลงทะเบียน SPBRG สำหรับอัตราการรับส่งข้อมูลที่ต้องการและตั้งค่า BRGH สำหรับความเร็ว baud_rate ** / SPBRG = 129 // SIM900 ทำงานที่ 9600 Baud rate ดังนั้น 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 เพื่ออ่านหรือเขียนข้อมูลแบบอนุกรม
// ** ฟังก์ชันส่งวันที่หนึ่งไบต์ไปยัง UART ** // โมฆะ _SIM900_putch (ถ่าน bt) {while (! TXIF); // กดโปรแกรมค้างไว้จนกว่า TX บัฟเฟอร์ฟรี TXREG = bt; // โหลดบัฟเฟอร์เครื่องส่งด้วยค่าที่ได้รับ} // _____________ สิ้นสุดฟังก์ชัน ________________ // // ** ฟังก์ชันรับวันที่หนึ่งไบต์จาก UART ** // ถ่าน _SIM900_getch () {if (OERR) // ตรวจสอบข้อผิดพลาด { CREN = 0; // หากเกิดข้อผิดพลาด -> รีเซ็ต CREN = 1; // ถ้า error -> Reset} while (! RCIF); // กดโปรแกรมค้างไว้จนกว่า RX buffer จะเป็น RCREG ที่ส่งคืนฟรี // รับค่าและส่งไปยังฟังก์ชันหลัก} // _____________ สิ้นสุดฟังก์ชัน ________________ // // ** ฟังก์ชันแปลงสตริงเป็นไบต์ ** // โมฆะ SIM900_send_string (ถ่าน * st_pt) {while (* st_pt) // if there เป็นถ่าน _SIM900_putch (* st_pt ++);// ประมวลผลเป็นข้อมูลไบต์} // ___________ สิ้นสุดฟังก์ชัน ______________ // // ** สิ้นสุดรหัสที่แก้ไข ** // โมฆะ _SIM900_print (ไม่ได้ลงนาม const char * ptr) {while (* ptr! = 0) {_SIM900_putch (* ptr ++); }
ฟังก์ชันข้างต้นเป็นฟังก์ชันสากลและไม่จำเป็นต้องเปลี่ยนแปลงสำหรับแอปพลิเคชันใด ๆ พวกเขาได้รับการอธิบายเพื่อให้คำแนะนำคร่าวๆเท่านั้น คุณสามารถดำน้ำลึกลงไปได้หากต้องการผ่านความเข้าใจ
ตอนนี้ในฟังก์ชันหลักของเราเราเริ่มต้นการเชื่อมต่อ USART และตรวจสอบว่าเราสามารถรับ "ตกลง" เมื่อเราส่ง "AT" โดยใช้บรรทัดด้านล่างของรหัส
ทำ {Lcd_Set_Cursor (2,1); Lcd_Print_String ("ไม่พบโมดูล"); } ในขณะที่ (! SIM900_isStarted ()); // รอจนกว่า GSM จะส่งกลับ "OK" Lcd_Set_Cursor (2,1); Lcd_Print_String ("ตรวจพบโมดูล"); __delay_ms (1500);
ฟังก์ชันSIM900_isStarted (); จะส่ง“ AT” ไปยัง GSM และรอการตอบรับ“ ตกลง” จากมัน ถ้าใช่มันจะคืนค่า 1 else 0;
หากตรวจไม่พบโมดูลหรือหากมีปัญหาในการเชื่อมต่อจอ LCD จะแสดงข้อความ“ ไม่พบโมดูล” มิฉะนั้นจะแสดงโมดูลที่ตรวจพบและดำเนินการในขั้นตอนต่อไปซึ่งเราจะตรวจสอบว่าสามารถตรวจพบซิมการ์ดได้ตามด้านล่างนี้หรือไม่ บรรทัดของรหัส
/ * ตรวจสอบว่าตรวจพบซิมการ์ดหรือไม่ * / do {Lcd_Set_Cursor (2,1); Lcd_Print_String ("ไม่พบ SIM"); } ในขณะที่ (! SIM900_isReady ()); // รอจนกว่า GSM จะส่งกลับ "+ CPIN: READY" Lcd_Set_Cursor (2,1); Lcd_Print_String ("ตรวจพบซิม"); __delay_ms (1500);
ฟังก์ชันSIM900_isReady ()จะส่ง“ AT + CPIN?” ไปยัง GSM และรอการตอบกลับ“ + CPIN: READY” จากมัน ถ้าใช่มันจะคืนค่า 1 else 0;
หากพบซิมการ์ดเราจะได้รับ SIM ที่ตรวจพบแสดงบนจอ LCD จากนั้นเราสามารถลองโทรออกโดยใช้คำสั่ง“ ATD mobilenumber ; ”. นี่เป็นตัวอย่างที่ฉันใช้หมายเลขของฉันเป็น ATD93643159XX; คุณต้องเปลี่ยนหมายเลขโทรศัพท์ของคุณที่นั่น
/ * โทรออก * / do {_SIM900_print ("ATD93643XXXXX; \ r \ n"); // ที่นี่เรากำลังโทรไปที่หมายเลข 93643XXXXX Lcd_Set_Cursor (1,1); Lcd_Print_String ("วางสาย…. "); } ในขณะที่ (_SIM900_waitResponse ()! = SIM900_OK); // รอจนกว่า ESP จะส่งกลับ "ตกลง" Lcd_Set_Cursor (1,1); Lcd_Print_String ("วางสาย…. "); __delay_ms (1500);
เมื่อวางสายแล้ว LCD จะแสดง Call Placed และคุณควรรับสายเรียกเข้าไปยังหมายเลขที่ระบุนั้น
คุณยังสามารถโทรไปยังหมายเลขโทรศัพท์มือถือที่เชื่อมต่อกับโมดูล GSM และรับการแจ้งเตือนบนหน้าจอ LCD ของคุณโดยใช้รหัสด้านล่าง
ในขณะที่ (1) {if (_SIM900_waitResponse () == SIM900_RING) // ตรวจสอบว่ามีสายเรียกเข้าหรือไม่ {Lcd_Set_Cursor (2,1); Lcd_Print_String ("สายเรียกเข้า !!."); }}
เมื่อโมดูล GSM ตรวจพบสายเรียกเข้าระบบจะแสดงสายเรียกเข้าที่บรรทัดที่สองของโมดูล LCD ฟังก์ชัน _SIM900_waitResponse () จะตรวจสอบข้อมูลขาเข้าจากโมดูล GSM เมื่อได้รับ SIM900_RING ซึ่งเทียบเท่ากับ "RING" เนื่องจาก waitResponce () เราจะแสดงสถานะ "สายเรียกเข้า"
คุณสามารถสร้างฟังก์ชันของคุณเองเช่นนี้เพื่อเปิดใช้งานเกือบทุกประเภทโดยใช้โมดูล GSM หากคุณต้องการให้มีการเข้ารหัสสิ่งต่าง ๆ คุณสามารถใช้ฟังก์ชัน __SIM900_print () เพื่อส่งคำสั่ง AT ใด ๆ เช่นนี้ด้านล่าง
_SIM900_print ("ที่ + CPIN? \ r \ n");
โปรดจำไว้ว่าคำสั่งทั้งหมดที่คุณควรจะตามด้วย“ \ r \ n” เพื่อระบุว่าคำสั่งนั้นกำลังยุติ
จำลองสถานการณ์:
เมื่อคุณเข้าใจวิธีการทำงานของโปรแกรมแล้วคุณสามารถลองจำลองและเปลี่ยนแปลงเพื่อให้เหมาะกับความต้องการของคุณ การจำลองจะช่วยคุณประหยัดเวลาได้มาก การจำลองทำได้โดยใช้ Proteus และดูเหมือนด้านล่าง
อย่างที่คุณเห็นเราได้ใช้ตัวเลือกเทอร์มินัลเสมือนใน Proteus เพื่อตรวจสอบว่าโปรแกรมตอบสนองตามที่คาดไว้หรือไม่ เราสามารถป้อนค่าผ่านกล่องโต้ตอบป๊อปอัป ตัวอย่างเช่นทันทีที่เรากดเรียกใช้กล่องโต้ตอบสีดำเช่นด้านบนจะปรากฏขึ้นและแสดง AT ซึ่งหมายความว่าได้ส่งโมดูล GSM AT แล้วตอนนี้เราสามารถตอบกลับ PIC ได้โดยพิมพ์ในช่องว่า "ตกลง" และกด Enter และ PIC จะตอบสนองต่อมัน ในทำนองเดียวกันเราสามารถลองใช้คำสั่ง AT ทั้งหมดได้
การโทรออกและรับสายโดยใช้ GSM และ PIC:
เมื่อคุณเข้าใจวิธีการทำงานของโค้ดและฮาร์ดแวร์แล้วเพียงแค่อัปโหลดโปรแกรมด้านล่างไปที่ PIC และเปิดโมดูล LCD ของคุณควรแสดงข้อความ "Module Detected", "SIM detect" และ "call Placed" หากทุกอย่างทำงานได้ดี เมื่อคุณเห็น“ โทรออก” คุณจะได้รับสายเรียกเข้าไปยังหมายเลขที่ระบุในโปรแกรม
คุณยังสามารถลองโทรไปยังหมายเลขที่มีอยู่ในโมดูล GSM และหน้าจอ LCD ของคุณจะแสดง“ สายเรียกเข้า” เพื่อระบุว่ากำลังเรียกซิม
การทำงานที่สมบูรณ์แบบของโครงการจะแสดงในวิดีโอด้านล่างหวังว่าคุณจะเข้าใจโครงการและสนุกกับการทำ หากคุณมีปัญหาในการทำงานให้โพสต์คำถามของคุณในส่วนความคิดเห็นหรือในฟอรัมของเราเรายินดีที่จะช่วยเหลือคุณ