Arduino Embedded

SIM800L IL CELLULARE VIA SERIALE

Nell’articolo di oggi parleremo del SIM800L il cellulare via seriale, si tratta di un simpatico modulino GSM/GPRS quadriband (850Mhz/900Mhz/1800Mhz/1900Mhz) che si può interfacciare via seriale, acquistabile per circa 4€ su aliexpress completo di header ed antennio.

sim800lkit

La prima cosa bella di questo modulino prodotto dalla SimCom è ovviamente il prezzo, ma la seconda è il fatto che si interfaccia via seriale ed è controllabile con semplici comandi AT, questo lo rende anche estremamente versatile sulle varie piattaforme, esp8266, arduino, STM32, TexasIntrument, ecc ecc… insomma potete anche collegarlo al computer interfacciandolo tramite un convertitore TTL to USB, per poi comandarlo a mano via seriale oppure con qualche applicativo specifico.

La cosa da tenere a mente è che il modulo NON E’ 3G/HSUPA/HSDPA+/LTE e tecnologie superiori, torna utile per inviare notifiche via SMS, ricevere SMS (che poi andranno interpretati dal microcontrollore) aprire canali GPRS per inviare pacchetti di dati (roba leggera tipo testo et simila, niente foto video ecc…  ) con una portante massima di 85,6 kbps in download ed uguale un upload, per chi fosse interessato qui trovate il datasheet completo.

L’unica mezza “gabula” con cui fare i conti è che questi integrati devono essere alimentati da  3,4V a 4,4 V (consigliati 4V) per il funzionamento, questo significa che il normale 3.3V proveniente dai vari microcontrollori non basta a farlo accendere, e nei migliori casi in cui arriva ad accendersi il modulo sputa fuori via seriale “UNDERVOLTAGE POWER OFF” e si spegne, mentre con i 5V continuerà  a lamentarsi via seriale scrivendo “OVERVOLTAGE DANGER”, e tempo pochi minuti lo si brucia.

senza titolo-1 senza titolo-2

Per ovviare a tutto ciò bisogna sicuramente partire con un alimentazione a 5V per poi inserire un partitore resistivo sull’alimentazione ed uno sul pin RX del SIM800L, il partitore andrà realizzato con una resistenza da 10 Kohm ed una da 4,7 Kohm come da schema.

 

sim800l

Con un risultato simile…

senza titolo-3

facendo così riusciamo a portare la tensione a quanto serve al SIM800L per poterlo usare in tutta sicurezza, per i casi che ne prevedono un uso intensivo magari con la tensione di ingresso non troppo costante converrebbe forse valutare se è il caso di mettere un LDO da 4V con un un condensatore da 100uF in ingresso ed uno da 0.33uF in uscita….

Per comodità collegheremo il SIM800L ad un Arduino così da poter fare qualche prova, partendo dal vedere principali comandi AT che ci permettono di usarlo, per arrivare ad un programma più completo che vuole far capire quale è un applicazione reale del modulo GSM.

Il protocollo seriale AT è uno standard che fu sviluppato inizialmente dalla Hayes Smartmodem, diventato oggi praticamente standard unico, la particolarità di questo standard è quella che ogni comando è preceduto dalla scritta AT e seguita dai comandi che si intende utilizzare e da un comando di ritorno a capo.

I nostro SIM800L rileva automaticamente la velocità della seriale a cui è collegato, che deve essere tra 9600 bps e 57600 bps.
Per il primo test ho preparato uno sketch Arduino che sfruttando la libreria SoftwareSerial ci permette di creare un canale seriale aggiuntivo in cui collegare il SIM800L, e con poche righe di codice riusciamo a fare si che Arduino riversi sulla seriale dove siamo collegati noi con il computer tutto quello che arriva dal modulo e viceversa invierà allo stesso tutto quello che scriveremo noi, così da non dover trovare un adattatore TTL to USB che magari non tutti hanno a portata di mano.

#include "SoftwareSerial.h";

//Il pin TX del Sim800L è collegato al pin D8 dell' Arduino
#define SIM_TX_PIN 8

//Il pin RD del Sim800L è collegato al pin D7 dell' Arduino (occhio al partitore!)
#define SIM_RX_PIN 7

//Inizializziamo una seriale software su quei pin
SoftwareSerial serialSIM800(SIM_TX_PIN, SIM_RX_PIN);

void setup() {
//Inizializziamo la seriale lato arduino
Serial.begin(9600);

//Inizializziamo la seriale virtuale lato sim800l
serialSIM800.begin(9600);
delay(500);

}

void loop() {
if(serialSIM800.available()){
Serial.write(serialSIM800.read());
}
if(Serial.available()){
serialSIM800.write(Serial.read());
}
}

Una volta inserita la SIM, colleghiamo ed alimentiamo il nostro modulino GSM, che inizierà a lampeggiare velocemente mentre è in fase di registrazione sulla rete, ovviamente se la sim inserita richiede il pin il nostro modulino non riuscirà a registrarsi, scrivendo via seriale alcuni messaggi di errore, per verificare quindi se è necessario inserire il pin scriveremo nella seriale AT+CPIN?, il modulo ci risponderà con una delle seguenti opzioni: READY(nessun pin richiesto), SIM PIN, SIM PUK, SIM PIN2, SIM PUK2.

Inserite quello che vi viene richiesto, ad esempio in caso di semplice pin AT+CPIN=”PIN”, una volta accettato il pin il modulo si registrerà sulla rete e potrete e risponderà via seriale con dei messaggi tipo “Cell Ready”, “SMS Ready”.
Ad esempio potremmo verificare lo stato di registrazione e l’operatore scrivendo AT+CREG?

E così via, se guardate il manuale dei comandi AT del SIM800L, potrete fare tutto quello che serve tra cui, chiamare e rispondere alle chiamate in ingresso di cui si può regolare il volume sia del microfono che dello speaker, inviare e ricevere SMS, aprire connessioni gprs su cui poi inviare dei dati sia via http che ftp, insomma veramente tutto.

Arriviamo ad un esempio di applicazione concreta, ecco un semplice codice che attiva un relè (pin10) quando il sim800l riceve un SMS con su scritto CASA:ON, ed ovviamente lo disattiva quando riceve CASA:OFF

 


#include "SoftwareSerial.h";

//Definiamo una SoftwareSerial con i pin 8 ed 7 che devono essere collegati rispettivamente al TX ed RX del SIM800L
SoftwareSerial SIM800L(8,7);

String lastLine;
int str_len;
char lastCharRead;
int CASA = 10;

void setup() {
//Inizializziamo la seriale dell'arduino verso il computer (fisica)
Serial.begin(57600);
while(!Serial);

//Inizializziamo la seriale dell'arduino verso il SIM800L (software)
SIM800L.begin(57600);
delay(1000);

Serial.println("Serial ok!");
delay(10000);
SIM800L.print("AT+CMGF=1\r\n");
delay(1000);
SIM800L.print("AT+CNMI=1,2,0,0,0\r\n");
delay(1000);
Serial.println("Inizializzato, in attesa di SMS");
pinMode(CASA, OUTPUT);
}
char currentLine[500] = "";
int currentLineIndex = 0;

bool nextIsMessage = false;

void loop() {

if(SIM800L.available()){
lastCharRead = SIM800L.read();

if(lastCharRead == '\r' || lastCharRead == '\n'){
lastLine = String(currentLine);
Serial.println(lastLine);
if(lastLine.startsWith("+CMT:")){
nextIsMessage = true;

} else if (lastLine.length() > 0) {
if(nextIsMessage) {
if(lastLine.startsWith("CASA:") >= 0){
if(lastLine.endsWith("ON")) {
digitalWrite(CASA, HIGH);
}else if(lastLine.endsWith("OFF")) {
digitalWrite(CASA, LOW);
}else {
Serial.println("Per l'opzione CASA scegliere tra ON e OFF");
}
}

nextIsMessage = false;
SIM800L.println("AT+CMGD=1,4\r\n");
delay(500);
Serial.println("Messaggio cancellato!");
}

}

for( int i = 0; i < sizeof(currentLine); ++i ) {
currentLine[i] = (char)0;
}
currentLineIndex = 0;
} else {
currentLine[currentLineIndex++] = lastCharRead;
}
}
}

Le potenzialità sono molteplici, si tratta solo di sviluppare…. alla prossima!

Ciao

About the author

giutrec

Iscriviti al blog tramite email

Inserisci il tuo indirizzo e-mail per iscriverti a questo blog, e ricevere via e-mail le notifiche di nuovi post.

Unisciti a 27 altri iscritti