[email protected] marzo 2010
SIMPLE GSM GATE CONTROL
Il telecontrollo qui proposto è adatto a tutte quelle applicazioni in cui serve un comando
sicuro e di basso costo. Questo sistema ha tutte queste qualità perché risponde solo ad
alcuni numero telefonici, senza effettivamente rispondere alla chiamata in arrivo
limitandosi a leggere l’ ID telefonico; dunque non ha costi di gestione e la parte più
impegnativa sul piano economico è il reperimento del cellulare Siemens C/M/S35 . Per il
fatto di poter attivare il relè di uscita sia in modo bistabile che monostabile, il dispositivo
può essere impiegato non solo come apricancello per condomini, aziende ma anche per
l’attivazione a grande distanza di apparati di vario genere.
La lista dei numeri abilitati non risiede nel telefono né nella SIM-card ma nella memoria
del microcontrollore cui è affidata la gestione dell’intero sistema. Quando il cellulare riceve
una telefonata, mediante la propria porta seriale dialoga con il micro comunicandogli il
numero telefonico di chi sta chiamando, se questo è tra quelli abilitati, chiude per pochi
secondi i contatti del relè. L’unica accortezza è che la persona che telefona non nasconda
il proprio numero.
[email protected] marzo 2010
Cenni alla teoria
Il protocollo usato nei modem GSM per setup e controllo è basato su set di comandi AT. L’
European Telecommunication Standard Institute (ETSI) GSM 07.05 definisce lo standard
dell’interfaccia dei comandi AT per i modem GSM compatibili. Da questo documento sono
stati selezionati i principali, quelli usati in questa applicazione.
Set di comandi AT
La seguente sezione descrive il set di comandi AT. I comandi possono essere provati
connettendo il modem GSM ad una delle porte COM del computer. Si scrive il comando di
test, si aggiunge CR (Carriage return => \r) prima di confermare.
Un comando AT prevede sempre il prefisso AT+ magari seguito da parametri e il carattere
CR (Carriage return) come invio del comando stesso. A volte questo comando avvia una
fase di inserimento di dati che si manifesta con un accento circonflesso chiuso.
Ad esempio:
• comando di test (ritorna la lista dei parametri per quel comando):
AT+CXXX=?<CR>
• comando di lettura (legge i valori impostati per quel comando): AT+CXXX?<CR>
• comando di scrittura (imposta i parametri di quel comando): AT+CXXX=<…
…><CR>
Elenco comandi più comuni:
Comando
Descrizione
AT+CGSN
AT+CIMI
AT+CGMR
AT+CBC
AT+CGMI
AT+CGMM
AT+CHUP
AT+CPBS
Ritorna il codice IMEI del telefono
Ritorna il numero seriale della SIM
Ritorna la versione del sw installato
Ritorna il livello di carica batteria (1 – 100)
Ritorna il nome del produttore
Ritorna il modello dell’apparato
Termina la chiamata in corso
Comando per la gestione delle rubriche
Stato AT
Il comando “AT” è un comando di richiesta di stato usato per verificare se un modem
compatibile è connesso e che l’interfaccia seriale sta funzionando in modo adeguato.
[email protected] marzo 2010
Echo off (ATE0)
Il comando “ATE0” è usato per configurare la comunicazione. Di solito i modem GSM sono
impostati per restituire ogni comando ricevuto con una conferma, per esempio
AT\r
AT\r\nOK\r\n
// comando inviato
//risposta con echo abilitato
Dopo l’invio di “AT”, il modem risponde con “AT\r\nOK\r\n”. Con echo off, “ATE0”, il
modem avrebbe risposto “\r\nOK\r\n”.
Il comando echo off riduce il traffico sulla linea seriale. Il comando “ATE1” riabilita ancora
l’eco.
Memoria messaggi predefinita (AT+CPMS)
Il comando “AT+CPMS” seleziona la memoria che sarà utilizzata per salvare, inviare,
cancellare, leggere e ricevere i messaggi SMS. I modem più moderi hanno differenti
locazioni.
• SM: Sim card
• ME: memoria telefono
• MT: insieme di tutti le possibili locazioni del telefono (SM,ME, altre). Il telefono
sceglierà la posizione preferita.
Formato Messaggi (AT+CMGF)
Il comando “AT+CMGF” è usato per impostare il formato si ingresso e uscita dei messaggi
SMS.
Sono disponibili 2 modalità:
• Modalità PDU
• Modalità testo semplice
[email protected] marzo 2010
Lettura Messaggio (AT+CMGR)
Il comando “AT+CMGR” è usato per leggere un messaggio da una data locazione di
memoria. L’esecuzione del comando restituisce un dato alla posizione [index] della
memoria [M1] (vedi AT+CPMS). Il dato comprendo lo stato e il messaggio vero e proprio
compresso in formato PDU. Per recuperare le informazioni, il messaggio deve essere
decompresso.
Cancellazione Messaggio (AT+CMGD)
Il comando “AT+CMGD” è usato per cancellare un messaggio ricevuto dalla memoria [M1]
(vedi AT+CPMS).
La base di tutto il funzionamento dell’applicazione sta nel messaggio inviato dal modem in
caso di chiamata entrante.
Viene infatti inviato un segnale di RING, che avverte il terminale della chiamata in
ingresso.
Un comando aggiuntivo consente di abilitare il “CallerID” ossia quel parametro che
consente di vedere il numero del chiamante.
Il comando in questione è “AT+CLIP=1” che, se usato in combinazione con “AT+CRC=1”
consente di sapere sia il numero che la tipologia di chiamata (fax, voce, dati); un esempio
di attività “Ring” con l’identificativo del chiamante attivato è la seguente:
RING
+CLIP:+39052556111,154
Questo conclude la breve carrellata dei comandi AT. Nel caso del Siemens S35, i comandi
sono stati dapprima testati tramite la porta seriale del PC (RS232) usando un collegamento
a 19200 b/s , 8 N 1 e una applicazione di test scritta in Visual Basic 6.0.
[email protected] marzo 2010
Il formato dei messaggi PDU
Ci sono due modi di inviare messaggi: nella modalità testo semplice e nella modalità PDU
(Protocol Description Unit). La modalità predefinita è spesso PDU, e nel caso del Siemens
S35 anche l’unica.
Nel linguaggio PDU si usano 3 tipi speciali di dato:
• “Octet”: gruppi di 8 bit in codifica esadecimale (0x00=>0xFF). Esempio : E8.
• “Semi-Octet”: gruppi di 8 bit informato decimale (0=>153). Esempio 11
• “Septet”: gruppi di 7 bit in formato intero (0=>127). Esempio 126
La stringa PDU non contiene solamente il messaggio, ma anche numerose altre
informazioni ed è differente per i messaggi uscenti ed entranti. In questo caso analizziamo
un messaggio entrante (quelli gestiti dall’applicazione).
+CMGR: 1,,36
0791934329002000040C919343208372290000901142808453401331D98CE68AB966B9190D269BE164B79C0C
Header
Stringa
PDU
Dato
07
91
934329002000
04
0C
91
934320837229
00
00
90114280845340
13
31D98CE68…
Descrizione
Numero di “Octets” nell’intestazione : 0x07=7
Tipo di numero. 91=> internazionale (+…)
Numero centro servizi: +393492200000. I nibble dei byte sono scambiati. Se
la lunghezza del numero è dispari, il nibble non usato è riempito con 0x0F.
Primo “Octect” del SMS. Messaggio inviato da centro messaggi
Lunghezza del numero : 0x0C= 12
Tipo numero. 91 => internazione (+…)
Numero del mittente
Identificatore protocollo
Schema di codifica
Time Stamp “Semi-Octects”: 24/11/09 08:48:35 GMT+1,00
Lunghezza del messaggio 0x13= 19
Testo del messaggio codificato (1234.1.393402382791)
[email protected] marzo 2010
Codifica del messaggio
L’alfabeto GSM predefinito usa 7 bit per rappresentare i caratteri. Il messaggio “hello”
consiste in 5 caratteri chiamati “septet” quando sono rappresentati con 7 bit ognuno. La
stringa in ”septet” deve essere codificata in una sequenza di “octet” per essere trasferita
tramite SMS
Quando si riceve un messaggio una sequenza di “octet” viene restituita dal modem. Per
estrapolare le informazioni, serve un metodo di decompressione:
[email protected] marzo 2010
Un diagramma di flusso di massima potrebbe essere quello suggerito da Vemund Kval
Bakken a pagina 8 di ”AVR323: Interfacing GSM modems”
[email protected] marzo 2010
Schema elettrico e funzionamento
Sebbene sia stato provato con un cellulare Siemens serie 35, il circuito può funzionare
anche con i Siemens S25 / S45/ M45 (verificare il connettore alimentazione/dati). Il cuore
del sistema è un microcontrollore P16F88 (ma può essere adattato per altri modelli che
abbiano almeno 4K di memoria) che svolge tutti i compiti del caso, ossia comunica con il
telefonino, memorizza e confronta i numeri telefonici, gestisce il funzionamento del relè di
uscita e di carica del GSM.
Dopo l’accensione e l’inizializzazione dell linee I/O, il PIC interroga il cellulare mediante il
canale TX della porta seriale di quest’ultimo, al fine di chiedergli il proprio codice IMEI, che
l’apparecchio invia sul canale RX.
Il relè di uscita può lavorare ad impulso, quindi chiudersi per un certo periodo a seguito di
una telefonata proveniente da un numero abilitato (monostabile) oppure in modalità
bisabile: in questo caso il relè di uscita cambia la propria condizione ad ogni comando
ricevuto. Il modo di funzionamento del relè “GATE” si imposta mediante il ponticello
“MONO/BI”: aperto => monostabile, chiuso=>bisabile.
Il tempo di attivazione in caso di comando monostabile è preimpostato nel firmware del
PIC (MONOSTABLE_ONTIME). Questa impostazione va eseguita prima di alimentare il
circuito o di aver premuto il tasto “RESET”.
Nel modo bistabile è prevista la funzione di ripristino, nel senso che ogni comando scrive
in EEPROM lo stato che il relè “GATE” deve assumere; all’accensione, dopo
l’inizializzazione, il microcontrollore legge il rispettivo dato in memoria, in modo che se il
dispositivo è stato privato dell’alimentazione quando il relè era attivo, al ritorno della
tensione rimette relè “GATE” nella condizione originale.
Il relè siglato “BATT” serve a dare al cellulare la corrente per la ricarica della batteria.
Viene utilizzato un contatore interno al PIC che prevede di interrompere la carica per 30
secondi ogni circa 12 ore circa, accendendo anche il led “CHG” in modo da segnalare
[email protected] marzo 2010
l’interruzione di alimentazione alla ricarica. E’ stato utilizzato un relè a bassa tensione (5V)
e con una resistenza di bobina di circa 170 Ohm. La corrente di eccitazione quindi essendo
dell’ordine di 30mA può essere assorbita da una coppia di Pin del PIC senza problemi (17 e
18); impostando i pin a livello alto la corrente che circola non è sufficiente a mandare in
conduzione la bobina, ne consegue che il relè rimane diseccitato e la batteria si può
ricaricarsi in quanto collegata al piedino “normalmente aperto”. Quando il livello dei pin 17
e 18 viene impostato a massa, la corrente viene assorbita e il relè, eccitandosi, toglie
tensione dalla ricarica. La resistenza R8 serve a limitare ulteriormente la corrente di
ricarica.
Il resto del circuito è piuttosto semplice e prevede un tasto di RESET per far ripartire il
programma sul micro; la parte di alimentazione è esterna al modulo e deve comprendere
+5V e +V (questa tensione, anche non stabilizzata viene usata per alimentare il relè
“GATE”).
Il diodo D2 permette di abbassare la tensione di alimentazione del PIC intorno ai 4,3V in
modo da adeguare i livelli di tensione sulla linea RX; allo stesso modo un partitore sulla
linea TX permette di ridurre ulteriormente questi 4,3V ad un livello compatibile con i livelli
presenti sul connettore del cellulare (0 – 3,6V).
Il led “STATUS” è usato con vari significati durante le varie fasi di avvio/esecuzione:
normalmente emette 3 lampeggi ogni 10 secondi (verifica della presenza SMS).
Il quarzo da 8Mhz permette di avere una velocità adeguata ed una precisione sufficiente
per la comunicazione seriale a 19200 b/s: affidabilità non sempre garantita nelle prove con
l’oscillatore interno.
In fase di avvio, il led “STATUS” lampeggia per circa 1 minuto per dare tempo ad una
eventuale prima connessione al cellulare per configurazione; dopodiché si spegne e
iniziano 3 lampeggi cadenzati ogni 10 secondi. Se il led rimane accesso la comunicazione
con il cellulare non è andata a buon fine.
E’ possibile collegare a scopo di debug un terminale RS232 (19200 b/s 8N1) sulle porte 12
e 13 del PIC (segnali TX/RX)
Layout su millefiori e realizzazione:
[email protected] marzo 2010
Impostazione del sistema
Prima di usare il circuito, è necessario predisporre il cellulare: inserendo una SIM valida,
disattivando il codice PIN (perché in caso di prolungata assenza dell’alimentazione il
telefono deve tornare operativo senza alcun intervento manuale) e cancellando tutti i
messaggi in memoria (consultare la guida di riferimento); è bene anche conoscere il
numero IMEI del cellulare in quanto sarà richiesto in fase di teleprogrammazione: in
questo caso è possibile digitare sul telefono la sequenza: *#06#.
La capienza della lista dei numeri abilitati è fissata in 22 numeri telefonici. Inviando
messaggi SMS al cellulare con un apposito formato sarà possibile : aggiungere un numero
alla lista degli abilitato, cancellare un numero dalla lista. In tutti i casi si manda un
messaggio SMS con la seguente sintassi:
1234.c.nnnnnnnnnnnn
•
•
•
dove 1234 sono le ultime 4 cifre del numero IMEI del cellulare
c è il comando e vale 1 per le aggiunte, 0 per le cancellazioni
nnnnnnnnnnnn
è
il
numero
di
telefono
nella
forma
<pref.int.le><pref><numero> es: 390521304019 senza il simbolo +
Se il messaggio non è conforme alla sintassi indicata o le prime 4 cifre non corrispondono
alla parte finale dell’IMEI il messaggio viene ignorato. Come conferma il telefono invia uno
squillo breve in caso positivo o uno squillo lungo in caso negativo. NB questa funzione si
basa sul fatto che mediamente per comporre un numero e attendere il primo squillo
passano un certo numero di secondi (ONE_RING o TEN_RINGS); ma questo è influenzato
anche da altri fattori come la qualità del segnale sia del trasmittente che del ricevitore:
tanto maggiore sarà il tempo di composizione/attesa quanto minore la qualità del segnale.
Programma
Il programma è stato scritto in C (mikroC) e riutilizza, per la funzioni della decodifica PDU,
i sorgenti di una application-note AVR (vedi file AVRSMS_zip.c).
Prevede come sviluppi futuri la possibilità di usare una memoria seriale esterna tipo
24LCXXX al posto della EEPROM del PIC (vedi file Memory.c).
La comunicazione col telefono avviene principalmente attraverso 2 procedure
“GET_Data” e “GET_Data_TimeOut”; entrambe utilizzano un buffer di massimo 55
caratteri “CmdBuf” che viene sovrascritto ogni volta. La prima è bloccante e attende la
ricezione di un numero n di caratteri <cr>, la seconda, non bloccante, attende fino ad un
determinato intervallo di tempo (“max_timeout_USART” circa 40ms). Il buffer non è
sufficiente per contenere tutta la stringa PDU dell’SMS, ma in caso di ricezione di un
messaggio, viene conservato in “TelNoSender” il numero del mittente per dare una
segnalazione (tramite squillo) dell’avvenuta operazione.
Per trasmettere i comandi al telefono viene usata la funzione “PUT_Data”, la quale
preleva dalla ROM una stringa e la scrive sulla usart harware.
[email protected] marzo 2010
La funzione “DecodeIMEI” si occupa di estrarre dal buffer di ricezione il numero IMEI e
conservare nella variabile “this_IMEI” gli ultimi 4 caratteri numerici (in modo da
confrontarli con i primi 4 caratteri dell’SMS ricevuto).
La funzione “Buffer_Contain” si occupa di verificare se all’interno del buffer di
ricezione è presente una sequenza di caratteri tipica di una risposta ad un certo comando
La funzione “DecodeRING” si occupa di estrarre dal buffer di ricezione il numero del
chiamante e inserirlo nell’array “BCDNo” in formato BCD per occupare meno spazio; è in
grado anche di interrompere la chiamata usando il comando “AT+CHUP\r”.
La funzione “DecodeMESS” si occupa di estrarre dal buffer di ricezione il messaggio,
controllando la codifica con i primi 4 caratteri dell’IMEI , il comando (aggiunta ,
cancellazione) e il numero del telefono da aggiungere alla lista
La funzione “SMSFeedback” si occupa di dare una messaggio squillo corto/lungo a chi
invia il messaggio di teleaggiornamento
La funzione “ONOFF_Pin” si occupa di commutare il relè a seconda della impostazione
(monostabile/bistabile)
Il loop principale è così composto
1. GET_Data_TimeOut
2.
ci sono elementi nel buffer ?
Decode_RING
C’è un numero chiamante ?
Il numero è nell’elenco abilitato ?
OnOff_PIN
3. Decrementa contatore timer SMS
4. Timer SMS a zero ?
Imposta contatore SMS a valore inziale
Leggi SMS alla posizione 1
Decrementa Timer batteria
SMS valido ?
Comando aggiungi ?
Se non già in lista, aggiungi numero, dai feedback
Comando cancella ?
Se già in lista, elimina dalla lista
Cancella SMS
Timer batteria a zero ?
Gestisci batteria
[email protected] marzo 2010
Pinout connettore
Applicable to A/C/S/M/SL, 4x, x25, x35,
Pin
Name
Dir
Description
1
GND
-
Ground
2
SELFSERVICE
in/out Recognition/control battery charger
3
LOAD
in
Charging voltage
4
BATTERY
out
Battery (S25 only)
5
DATA OUT
(TX)
out
Data sent
6
DATA IN
(RX)
in
Data received
7
Z_CLK
-
Clock line for accessory bus. Use as
DCD In data operation
8
Z_DATA
-
Data line for accessory bus. Use as CTS
in data operation
9
MICG
-
Ground for microphone
10
MIC
in
Microphone input
11
AUD
out
Loudspeaker
12
AUDG
-
Ground for external speaker
Le righe evidenziate sono quelle usate in questa applicazione.
[email protected] marzo 2010
Alimentatore
un semplice alimentatore universale può essere realizzato seguendo il classico schema per
il 317 (tratto da Nuova Elettronica)
R2A R2B sono state sostituite
da un trimmer da 2.2K
[email protected] marzo 2010
Schemi millefori
Lato componenti
Lato rame