Saturday, November 14, 2020

[គន្លឹះ] ផ្ញើសារ SMS និង CALL ប្រើ GSM ជាមួយ Arduino

GSM ជាមួយ Arduino


ដើម្បីធ្វើទំនាក់ទំនងជាមួយគ្រឿងអេឡិចត្រូនិចបានដោយប្រើប្រាស់សារ SMS ឫ Call គេត្រូវការឧបករណ៍ជាចាំបាច់គឺ GSM (Global System for Mobile Communications) ដោយដាក់ Sim ឲ្យដំណើរការដូចទូរស័ព្ទដែលត្រូវការសេវាដើម្បីផ្ញើសារ ឫតេបានដូចជាទូរស័ព្ទដែរ។

GSM Module មានម៉ូដែលផ្សេងៗគ្នា

GSM ដែលអាចប្រើបានជាមួយ Microcontroller ដូចជា Arduino ជាដើមភាគច្រើនត្រូវបានគេផ្គុំជា Module (រូបខាងលើ) មានតូចមានធំទៅតាមសមត្ថភាពនិងតម្រូវការប្រើប្រាស់ ដែលអាចទំនាក់ទំនងគ្នាបានជាមួយ UART Serial។

GSM SIM800 (ឆ្វេងសម្រាប់ PCB Design) រូបរាងផ្សេងៗគ្នា

យើងនឹងលើកយក GSM SIM800L ជាឧទាហរណ៍ជាមួយ Arduino (GSM ម៉ូដែលនីមួយៗមានការប្រើប្រាស់ដូចៗគ្នា តែមួយចំនួនមាន Function បន្ថែមទៅតាមម៉ូដែល) ដោយអាចឲ្យយើងបញ្ជា Arduino បានដោយផ្ញើសារទៅបញ្ជា ឫឲ្យ Arduino ផ្ញើសារជាពត៌មានផ្សេងៗទៅកាន់ទូរស័ព្ទវិញ។

របៀបប្រើប្រុងប្រយ័ត្ពពេលតស្វៀគ្វី GSM៖ប្រាស់ SIM800L

ជ្រើសរើសអង់តែនឲ្យ GSM


ការជ្រើសរើសអង់តែនពិតជាសំខាន់សម្រាប់ឲ្យ GSM ដំណើរការបានល្អិមិនរអាក់រអួល។ អង់តែនដែលត្រូវបានប្រើច្រើនមាន ២ ដូចរូបខាងលើ៖

  1. Helical GSM antenna ដែលភាគច្រើនភ្ជាប់មកជាមួយពេលទិញ ដែលវាមានសមត្ថភាពមធ្យម អាចឲ្យ GSM ដំណើរការធម្មតាដរាបណាវានៅក្រៅប្រអប់ ឫប្រើប្រអប់ជ័រស្តើងៗមិនខ័ណ្ឌសេវាទូរស័ព្ទ។ ក្នុងករណីប្រើប្រអប់អាល៊ុយមីញ៉ូមអាចមានបញ្ហាគ្មានសេវា។
  2. 3dBi GSM antenna ដែលវាមានសសៃខ្សែភ្ជាប់ទៅ GSM ហើយវាមានដំណើរការល្អជាងអង់តែនទីមួយបើសិនជានៅតំបន់មានសេវាខ្សោយ។ អង់តែនប្រភេទនេះល្អត្រង់ថា យើងអាចដាក់ GSM នៅក្នុងប្រអប់បែបណាក៏បាន ដោយគ្រាន់តែរករន្ធទុកចាប់ក្បាលអង់តែនឲ្យនៅក្រៅប្រអប់ជាការស្រេច។

ជើងរបស់ SIM800L

1.  NET  ជើងសម្រាប់ផ្សារភ្ជាប់ទៅនឹងអង់តែន។
2.  VCC  ភ្លើងសម្រាប់ចិញ្ចឹម GSM អាចនៅចន្លោះ  3.4V - 4.4V  និងផ្តល់ចរន្តយ៉ាងហោចណាស់ 2A។ ប្រើប្រាស់ 5V អាចធ្វើអោយឆេះ ឫ 3.3V មិនអាចឲ្យដំណើរការបានឡើយ។ គួរតែប្រើថ្ម Li-Po ឫ Buck converter តង់ស្យុងប្រហាក់ប្រហែល 3.7V និងចរន្ត 2A។
3.  RST  ជើងសម្រាប់ Reset GSM ដោយទាញឲ្យ Low រយៈពេល 100ms។
4.  RXD  ជើងសម្រាប់ទទួលពត៌មានជា Serial Communication។
5.  TXD  ជើងសម្រាប់បញ្ចេញពត៌មានជា Serial Communication។
6.  GND  ជាជើង Ground ដែលត្រូវតែភ្ជាប់ទៅ GND របស់ Arduino។
7.  SPK-  ជើងអវិជ្ជមានសម្រាប់តទៅ​ Speaker។
8.  SPK+  ជើងវិជ្ជមានសម្រាប់តទៅ​ Speaker។
9.  MIC-  ជើងអវិជ្ជមានសម្រាប់តទៅ​ Microphone។
10. MIC+  ជើងវិជ្ជមានសម្រាប់តទៅ​ Microphone។
11.  DTR  ជើងសម្រាប់បញ្ជាឲ្យ GSM សម្រាក(sleep mode)។​ HIGH ដើម្បីសម្រាក។
12.  RING  ជើងបង្ហាញពីការតេចូល។ ធម្មតាវា HIGH វានឹងភ្លិបភ្លែតពេលមានតេចូល។
អានបន្ថែមនៅ SIM800L Hardware Design

គួរតែប្រើ Buck Converter ឫ ថ្ម Li-Po ចន្លោះ 3.7V

ប្រុងប្រយ័ត្នពេលតស្វៀគ្វី GSM៖
មិនត្រូវភ្ជាប់ VCC មុន GND​ និងមិនត្រូវផ្តាច់ GND មុន VCC។ បើមិនប្រុងប្រយ័ត្ន Module  គ្មាន Ground ហើយអាចឲ្យចរន្តទាំងអស់ហូរទៅតាមជើង Serial នឹងបណ្តាលឲ្យឆេះ GSM ដោយមិនដឹងមូលហេតុ។

Arduino  ត្រូវទាក់ទងទៅ GSM ដោយប្រើ UART Serial ដែលសៀគ្វីដូចគម្រូខាងក្រោម។ ដោយលែក GSM មិនអាចដំណើរការដោយ 5V បាននោះទេ ដូននេះជើងទទួលទិន្ន័យរបស់ GSM (RXD) មិនអាចទទួលទិន្ន័យចូលដោយ 5V ដែលផ្តល់ដោយ Arduino បានឡើយ។ ដើម្បីជៀសវាងបញ្ហាឆេះខូច ឬបញ្ហាផ្សេង គួតែប្រើប្រាស់រេស៊ីស្តរពីរដែលមានតម្លៃ និងតដូចខាងក្រោម ដើម្បីទម្លាក់ឲ្យខ្សែនេះចូលទៅ GSM តែ 3.3V ប៉ុណ្ណោះ។

ការភ្ជាប់ជើង Arduino (Software Serial) និង GSM SIM800L
សៀគ្វីគម្រូ Arduino និង​ GSM SIM800L

Arduino ត្រូវប្រើប្រាស់ AT Command ដើម្បីប្រាប់ទៅ GSM ឲ្យធ្វើអ្វីមួយដូចជាដឹងពីទំនាក់ទំនងរវាង GSM និង Arduino ឬ​ស្ថានភាពសេវាទូរស័ព្ទ ឬ ឲ្យGSMតេទៅលេខណាមួយ ​​-ល-។ ដោយ Arduino ប្រើប្រាស់ Software Serial ដើម្បីបង្កើតជាខ្សែ ​Serail ថ្មីមួយជៀសវាងភ្ជាប់ទៅជើង Serail ដើម (RX0, TX0) ដែលនាំឲ្យពិបាកពេលបញ្ចូលកូដត្រូវផ្តាច់ខ្សែ។ 

ប្រើកូដនេះដើម្បីតេស្ត AT Command៖
#include <SoftwareSerial.h> SoftwareSerial myGSM(3, 2); // RX, TX void setup() { Serial.begin(9600); while (!Serial) {} ; // wait for serial port to connect. Needed for Native USB only Serial.println("Started..."); myGSM.begin(9600); //Set GSM Baud Rate myGSM.println("AT"); //Test AT Command } void loop() { if (myGSM.available()) Serial.write(myGSM.read()); if (Serial.available()) myGSM.write(Serial.read()); }
AT Command មានដូចជា៖
  • AT ប្រើតេស្តទំនាក់ទំនងរវាង Arduino និង GSM បើទាក់ទងគ្នាបានវានឹងឆ្លើយ OK។
  • AT+CSQ ប្រើឲ្យ GSM មើលសេវាស៊ីមដែលវាបានប្រើ ជាតួលេខតំបូង មានតម្លៃប្រហែល 5dB ឫច្រើនជានេះបើសេវាខ្លាំង។
អានបន្ថែមនៅ SIM800 Series AT Command

បន្ទាប់ពីបញ្ចូលកូដទៅក្នុង Arduino រួចមក ចុចបើក Serial Monitor ប្រើ Baud Rate  9600 និងជ្រើសយក  Both NL & CR  រួចសាកល្បងវាបញ្ចូល AT Command ខាងលើ៖
សាកល្បង Serial ជាមួយ GSM

ដើម្បីផ្ញើសារ SMS បាន៖

  1. AT+CMGF=1 ឲ្យ GSM ដំនើរការក្នុងគោលការណ៍ SMS។
  2. AT+CMGS=\"+855XXXXXXXX\" ប្រាប់លេខទូរស័ព្ទដែលចង់ផ្ញើសារទៅ GSM។
  3. "SMS text message" ប្រាប់អក្សរសារដែលចង់ផ្ញើទៅ GSM។
  4. 26 ប្រាប់ GSM ឲ្យបញ្ចប់ការផ្ញើសារ SMS។
#include <SoftwareSerial.h> //Create software serial object to communicate with SIM800L SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2 void setup() { //Begin serial communication with Arduino and Arduino IDE (Serial Monitor) Serial.begin(9600); //Begin serial communication with Arduino and SIM800L mySerial.begin(9600); Serial.println("Initializing..."); delay(1000); mySerial.println("AT"); //Once the handshake test is successful, it will back to OK updateSerial(); mySerial.println("AT+CMGF=1"); // Configuring TEXT mode updateSerial(); mySerial.println("AT+CMGS=\"+855XXXXXXXX\"");//country code and xxxxxxxxxxx with phone number to sms updateSerial(); mySerial.print("Hello, I am SIM800L."); //text content updateSerial(); mySerial.write(26); } void loop() { } void updateSerial()​​ { delay(500); while (Serial.available()) { mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port } while(mySerial.available()) { Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port } }

ឲ្យ ​GSM ចាំទទួលសារពីអ្នកផ្សេងត្រូវប្រើ AT+CNMI=1,2,0,0,0​ ដូចខាងក្រោម៖
#include <SoftwareSerial.h> SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2 void setup() { Serial.begin(9600); mySerial.begin(9600); Serial.println("Initializing..."); delay(1000); mySerial.println("AT"); //Once the handshake test is successful, it will back to OK updateSerial(); mySerial.println("AT+CMGF=1"); // Configuring TEXT mode updateSerial(); mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled updateSerial(); } void loop() { updateSerial(); } void updateSerial() { delay(500); while (Serial.available()) { mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port } while(mySerial.available()) { Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port } }

ឲ្យ GSM តេទៅលេខណាមួយ ប្រើត្រូវប្រើ ATD command៖
  • ATD+ +855xxxxxxxxxx; ប្រាប់លេខទូរស័ព្ទដែលចង់ទេទៅ GSM។
  • ATH បិទការតេ​(Hangs up)។
#include <SoftwareSerial.h> //Create software serial object to communicate with SIM800L SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2 void setup() { Serial.begin(9600); mySerial.begin(9600); Serial.println("Initializing..."); delay(1000); mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK updateSerial(); mySerial.println("ATD+ +855xxxxxxxxx;"); //country code and xxxxxxxxxxx with phone number to dial updateSerial(); delay(20000); // wait for 20 seconds... mySerial.println("ATH"); //hang up updateSerial(); } void loop() { } void updateSerial() { delay(500); while (Serial.available()){ mySerial.write(Serial.read()); } while(mySerial.available()) { Serial.write(mySerial.read()); } }

ដើម្បីឲ្យ GSM រកចាំការ Call ចូល មិនចាំបាច់មាន AT command ឡើយ គ្រាន់តែពេលតេចូលមក៖
  • ATA ដើម្បីលើកទូរស័ព្ទដែលបានតេចូលមក។
  • ATH បិទការតេ​(Hangs up)។
#include <SoftwareSerial.h> //Create software serial object to communicate with SIM800L SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2 void setup() { Serial.begin(9600); mySerial.begin(9600); Serial.println("Initializing..."); } void loop() { updateSerial(); } void updateSerial() { delay(500); while (Serial.available()) { mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port } while(mySerial.available()) { Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port } }

ការប្រើប្រាស់ GSM បានកាន់តែទូលំទូលាយ អាស្រ័យលើការសិក្សាលើ AT Command ។ យល់ដឹងពី AT Command បានកាន់តែច្រើន កាន់តែងាយស្រួលប្រើប្រាស់ GSM។