[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