Arduino SMS i nie tylko

Moduł GSM do Arduino pozwala na przekształcenie Arduino w telefon komórkowy :) No – mniej więcej.

Arduino z modułem GSM (prowizoryczny zasilacz w tle)
Arduino z modułem GSM (prowizoryczny zasilacz w tle)

Ale od początku. Najpierw potrzebujemy moduł GSM do Arduino oraz aktywną kartę SIM. Kartę wsadzamy do modułu i możemy przystąpić do testów. Pierwsza sprawa zasilanie. Moduł GSM jest dość wymagający jeśli chodzi o zasilanie. Nie każdy port USB będzie w stanie zasilić Arduino z modułem GSM. Objaw będzie taki, że po wklepaniu PINu komunikacja znika, to trzeba zorganizować dodatkowe zasilanie. Jak – o tym później.

Testujemy moduł

Moduł może pracować w dwóch trybach komunikacji szeregowej. Albo „rozmawia” z Arduino albo z komputerem dopiętym do port USB Arduino. Ten pierwszy tryb to jest normalny tryb produkcyjny drugi może zostać wykorzystany do testów. Aby skorzystać z tego drugiego trybu:

  1. wyjmujemy ATMega z Arduino (Arduino będzie służyło tylko jako zasilanie oraz skorzystamy z konwertera USB/Serial)
  2. ustawiamy na module zworki trybu pracy na USB gateway
  3. wsadzamy kartę SIM
  4. podpinamy Arduino do komputera
  5. przytrzymujemy przycisk ON/OFF na module przez dwie sekundy
  6. uruchamiamy program terminala (gtkterm) wybieramy port szeregowy i ustawiamy 115200 8,N,1 tryb końca linii CR (nie CR+LF) i używając DUŻYCH liter piszemy komendy AT
    • AT – oczekiwana odpowiedź OK – to jest znak że jest komunikacja z modemem
    • AT+CPIN=”ABCD”  – gdzie ABCD jest PINem wsadzonej karty SIM – powinniśmy dostać odpowiedź OK jeżeli PIN jest dobry, +CME ERROR 16 jeśli zły
    • moduł zaczyna szukać sieci GSM – jeżeli w ciągu kilku następnych sekund nadal będzie odpowiadać OK na komendę AT, znaczy że port USB dał radę zasilić układ. Jeżeli komunikacja zamrze – trzeba szykować dodatkowe zasilanie
    • jeżeli wszystko działa możemy popróbować kilku komend:
      • AT+COPS? – zwraca nazwę operatora sieci komórkowej
      • AT+CPBR=# zwraca wpis z książki adresowej na karcie gdzie # to numer z książki adresowej
      • AT*PSCPOF – wyłącz moduł
      • ATD##########; – zadzown pod numer kryjacy sie za ciągiem # (oczywiście na razie rozmawiać się nie da)
      • ATH – rozłącz rozmowę
    • wysyłanie SMS – wykonaj następujące kroki:
      • AT+CSCA? – ściągnij numer centrum SMS
      • AT+CMGF=1 – tryb wysyłania SMSów – 1 to tekstowy
      • AT+CMGS=”#######” – numer na jaki chcemy wysłać SMS
      • po AT+CMGS zaczynamy wpisywac tresc wiadomosci w jednej lini i konczymy znakiem o kodzie 1A szesnastkowo
      • czekamy na SMS’a ;)

Pełna lista komend AT dla modemu Sagem HiLO.

Moduł GSM ma wyjście do mikrofonu i głośnika, więc po podłączeniu tychże Arduino może działać jako telefon komórkowy :)

Zasilanie

Na module jest zworka określająca źródło zasilania. Ustawiona w pozycji oznaczonej 5V wybiera Arduino (a więc port USB) jako źródło zasilania dla modułu GSM. Wybrani ext pozwoli nam zasilić sam moduł z oddzielnego zasialacza. Producent sugeruje, że całość (Arduino + moduł GSM) powinny być zasilane 12 V, 2A. Dla zasilaczy o wydajności mniejszej niż 2A należy dodać kondensator 220 μF. W moich testach udało mi się bez problemu uruchomić całość zasilając Arduino przez USB a moduł GSM z zasilacza 12V/0.5 A z kondensatorem 200 μF oraz konwerterem napięcia na 5V (L7805).

1 - złącze zasilania i zworka wyboru źródła, 2 - wybór trybu komunikacji
1 - złącze zasilania i zworka wyboru źródła, 2 - wybór trybu komunikacji

Sterowanie z Arduino

Moduł GSM gdy zworka komunikacji szeregowej jest ustawiona na Arduino podłącza się do portu szeregowego Arduino i wysyłając z Arduino komendy na port szeregowy (przez Serial.println) sterujemy modułem GSM. Przykładowy kod:

int led = 13;
int onModulePin = 2;        // the pin to switch on the module (without press on button) 
int timesToSend = 1;        // Numbers of SMS to send
int count = 0;

void switchModule(){

  digitalWrite(onModulePin,HIGH);
  delay(2000);
  digitalWrite(onModulePin,LOW);

}

void setup(){

  pinMode(led, OUTPUT);
  pinMode(onModulePin, OUTPUT);
  Serial.begin(115200);               // the GPRS baud rate
  switchModule();                    // swith the module ON

  for (int i=0;i<5;i++){
    delay(5000);
  } 
   Serial.println("AT+CMGF=1");         // set the SMS mode to text
}

void loop(){

  while (count < timesToSend){
    delay(1500);

    Serial.print("AT+CMGS=");               // send the SMS the number
    Serial.print(34,BYTE);                  // send the " char
    Serial.print("*********");              // send the number change ********* by the actual number
    Serial.println(34,BYTE);                // send the " char
    delay(1500);
    Serial.print("Arduino SMS...");     // the SMS body
    delay(500);
    Serial.println(0x1A,BYTE);                // end of message command 1A (hex)
    delay(5000);        
    count++;
  }

  if (count == timesToSend){
    Serial.println("AT*PSCPOF");             // switch the module off
    count++;
  }

}

Na koniec – moduł GSM ma dość nietypowy kształt, prawda? Otóż doskonale on współgra z innym shieldem – GPSowym :)

Arduino z shieldem GSM i GPS
Arduino z shieldem GSM i GPS

Ale o tym już następnym razem.