TiDiGino il telecontrollo GSM basato su Arduino: il Factotum di Ettore Massimo Albani

Eccoci alla presentazione di un altro validissimo Firmware per il TiDiGino contest realizzato da Ettore Massimo Albani che si introduce così:

Premessa

È stato bello e stimolante per me partecipare al contest: una vera e propria fontana della giovinezza.

La sfida era quella, all’età di 57 anni, di imparare un nuovo linguaggio e di farlo con un progetto ben preciso in mente: un inseguitore solare ed un sistema di gestione dell’energia.

Per il mio compleanno a metà di Agosto mi sono fatto il regalo dell’Arduino Mega 2560 ed ho iniziato a studiare, facendo i primi sketch.

Spero che scuserete eventuali ingenuità nella programmazione: prima di dire di conoscere un linguaggio, occorre molto più tempo dei pochi mesi che ho avuto a disposizione.

Grazie per la pazienza.


La scheda


Il TiGiDino è il nuovo nato della serie di telecontrolli dotati di modulo GSM SIM900.

Diversamente dai suoi predecessori, il TiGiDino si basa sul processore ATmega2560, lo stesso adottato dall’Arduino MEGA 2560 e da questi deriva la sua struttura.

Vediamo in dettaglio le sue caratteristiche, confrontandole con quelle dell’Arduino MEGA 2560.

Si osserva che rispetto al modello normale ci sono in più:

  • modulo GSM;
  • DTMF;
  • pulsante utente;
  • ponticello removibile per auto reset;
  • 2 ingressi optoisolati;
  • 2 uscite a relè;
  • sensore di temperatura seriale con protocollo One Wire;
  • memoria EEPROM seriale da 32 KB
  • 5 LED: 2 rossi per le uscite relè, 1 verde per l’attività del modulo GSM e 2 disponibili per il programma.

Purtroppo, per limitare le dimensioni della scheda e limitare i costi, abbiamo dovuto rinunciare ad alcune cose:

  • Alimentazione solo esterna (12V, 1A)
  • I/O digitali o uscite PWM limitati a 10 (+2 se non si adoperano gli interrupt esterni);
  • ingressi analogici limitati a 6;
  • interrupt esterni limitati a 2;
  • porte seriali limitate ad 1 (+1 utilizzata dal modulo GSM);
  • connettore TWI (Twin Wire Interface) assente (utilizzato dalla memoria EEPROM seriale);

Tuttavia, pur con queste limitazioni, TiGiDino rappresenta un potente sistema di telecontrollo programmabile grazie alla interfaccia IDE di Arduino.

Quello che avrei desiderato in più sulla scheda:

  • un paio di LED per monitorare gli ingressi;
  • un LED collegato al pin 13 delle linee di I/O digitale per uguagliare quello presente su Arduino MEGA 2560
  • un cicalino piezoelettrico;
  • un microfono preamplificato ed un altoparlante per chiamate vocali;
  • sensore temperatura esterno (vedi Emulazione Temperatura).

Ho avuto modo di provare due esemplari di TiDiGino: il primo dopo qualche giorno ha presentato un problema hardware (la linea Reset del micro non funzionava più) e ho dovuto aspettare un secondo esemplare per continuare le prove.

Il secondo esemplare aveva ancora il resistore R20 saldato sul PCB, mentre avrebbe dovuto essere eliminato per non causare problemi quando la porta USB non è connessa.

Infatti, l’alimentazione del micro di interfaccia USB FT232RL è fornita direttamente dalla linea a 5 V proveniente dal PC: senza l’alimentazione la porta RTS (Request To Send) attraverso il resistore R20 porta a massa la corrispondente porta RST (Reset) del ATmega2560 che quindi rimane bloccato.

Poiché il TiDiGino è ancora in fase di testing avanzato (beta testing) è facile che l’assistenza non abbia ancora confidenza con questa informazione.

Comunque, nulla di grave, a patto che non vengano più distribuite schede con questo problema (NdR: attualmente tutti i TiDiGino vengono forniti senza la resistenza montata): essendo il componente a montaggio superficiale, non è agevole dissaldarlo, vista anche la vicinanza con altri componenti.

Futura Elettronica ha a catalogo un contenitore plastico già forato per fissaggio al muro: consiglio vivamente di acquistarlo insieme al TiDiGino.

Ricordatevi anche di acquistare un alimentatore a 12 V che possa erogare almeno 1 A di corrente continua anche di tipo non stabilizzato ed un cavo USB (maschio A – maschio micro A) per il collegamento al PC.

Se poi volete strafare, perché non aggiungere una batteria tampone da 12 V 7,2 Ah (tipo quelle usate nei sistemi antifurto)?

 

Installazione ambiente di sviluppo

Per poter programmare la scheda TiDiGino è necessario disporre sul PC o notebook dell’ambiente di sviluppo Arduino attualmente alla versione 0023 (NdR: al momento in cui scriviamo è stata rilasciata la versione Arduino1.0 che però mostra alcune incompatibilità, stiamo procedendo alla messa a punto del firmware).

A questo proposito vi faccio notare che Factotum è stato sviluppato con la versione 0022: non dovrebbero esserci problemi ad usare una versione più recente, poiché la versione 0023 possiede in più i riferimenti hardware (inf) per le versioni più recenti (R3) delle schede Arduino; comunque rammentate questo particolare se ci fossero problemi.

Se ancora non lo avete fatto, recatevi nel sito (purtroppo solo in lingua inglese):

www.arduino.cc

Scaricate il software (circa 85 MB) per il sistema operativo di cui disponete (Windows, Mac OS X oppure Linux).

L’ambiente di sviluppo è in realtà un’applicazione Java che consiglio di installare all’interno di una cartella (directory) chiamata Arduino.

Io posseggo Windows XP Pro e l’ho installato all’interno della cartella Documenti; questo il percorso completo:

C:\Documents and Settings\<nome utente>\Documenti\Arduino\Arduino-0023

Essendo un’applicazione Java non viene registrata nel registro dei programmi di Windows (Registry) e non viene neanche inserita nello Start: conviene creare a mano un collegamento al programma Arduino.exe da inserire sul Desktop per un più comodo accesso ad esso:


Ora bisogna aggiungere nella cartella libraries le librerie aggiuntive utilizzate da Factotum: per farlo copiate semplicemente le cartelle fornite:

  • Dallas
  • GSM_TDGINO contiene versione modificata di GSM.h per eliminare il DEBUG
  • M24LC256
  • OneWire

Poiché la libreria GSM_ TDGINO viene fornita con attivato il DEBUG e questo consuma molta memoria, raccomando di usare la mia versione che ha il DEBUG disattivato, altrimenti il programma potrebbe non funzionare correttamente.

Adesso l’operazione più delicata: bisogna sostituire il file pins_arduino.c con il file con lo stesso nome, ma contenente la mappa dei pin di TiDiGino.

Il file si trova nella cartella:

\Arduino\Arduino-0023\hardware\arduino\cores\arduino

Vi consiglio, però, di conservare il vecchio file anziché cancellarlo rinominandolo, ad esempio, pins_arduino_Original.c, magari conservando anche una copia del nuovo.

Prestate molta attenzione a non inserire spazi nel nome del file.


Come ultima operazione, copiate la cartella Factotum all’interno della cartella Arduino: vi consiglio di creare allo scopo una nuova cartella Progetti e di inserirci dentro la cartella Factotum.

Adesso possiamo collegare, finalmente, l’alimentazione al nostro TiDiGino e, quindi, collegare il cavetto USB al nostro PC o notebook.

Il TiDiGino, contrariamente alla scheda Arduino MEGA 2560 che usa il processore ATmega8, usa il processore FT232 come interfaccia USB, quindi i driver sono diversi e vanno caricati separatamente.

Niente paura, l’operazione è quasi del tutto automatica: basta indicare in fase di installazione del drive la cartella drivers di Arduino che contiene a sua volta la cartella FDTI USB Drivers.

Dopo aver caricato Factotum, vi troverete con una finestra simile a questa:


La prima cosa da fare è selezionare il tipo di scheda (Arduino MEGA 2560):


Poi si indica la Serial Port fornita dal drive USB:


Finalmente con l’icona Upload si può caricare Factotum sulla scheda.

Se tutto è stato fatto correttamente, i due LED Rx e Tx a bordo di TiDiGino inizieranno a lampeggiare velocemente, indicando l’uploading.

Una volta terminata questa fase, si può lanciare il Serial Monitor (previa impostazione della velocità a 9600 baud) per interagire con Factotum:



Nell’esempio sopra riportato si osserva la versione del programma e la sua emulazione (TEMPERATURA).

Si noti come Factotum abbia caricato le variabili preferenziali e ripristinato le uscite (variabile RIP settata a true).

Poiché il funzionamento dell’emulazione era Automatico. Factotum ne segnala la condizione.

Il messaggio di Startup viene visualizzato e, poiché nell’esempio esisteva un numero preferenziale a cui inviare uno squillo, viene visualizzato l’evento.

Se ci fossero stati più numeri preferenziali a cui inviare squilli e/o SMS, ci sarebbe stata l’indicazione relativa.

Inviando TEMP? (campo in alto con il pulsante Send), si ottiene la temperatura minima, massima e ambientale.


Purtroppo esiste un problema: come sarà specificato più avanti, il modulo GSM allo startup potrebbe non configurarsi correttamente, risultando un apparente blocco.

Compare la scritta “Richiesta password…” come se il programma dovesse rispondere ad una chiamata vocale (DTMF) e rimane in quella situazione per 30 secondi, dopodiché la chiamata viene terminata ed il sistema prosegue normalmente le sue funzioni.


Il software

Il programma Factotum è il risultato del Contest proposto da Elettronica In per sviluppare un’applicazione per TiGiDino che consentisse di emulare i precedenti progetti di telecontrollo GSM:

  • TDG134 – Apricancello
  • TDG133 – Telecontrollo 2 in / 2 out (TDG140 + DTMF)
  • TDG139 – Termostato

Tre sono perciò le versioni disponibili: Apricancello, Telecontrollo, Temperatura.

Il codice compilato della versione più complessa occupa oltre 55 KB della memoria Flash del processore, oltre ovviamente lo spazio di memorizzazione delle variabili nella SRAM.

Non è stata utilizzata la memoria EEPROM da 4 KB interna al processore, proprio per dare modo agli sviluppatori di caricare un programma diverso (che usi questa memoria) senza cancellare i dati memorizzati nella memoria EEPROM seriale ausiliaria da 32 KB.

Anche la SIM (Subscriber Identity Module) del gestore telefonico scelto non viene utilizzata per memorizzare i numeri telefonici, poiché, in questo modo, è possibile sostituirla con un’altra senza perdere i numeri telefonici già memorizzati.

Sono stati aggiunti dei comandi speciali per consentire agli “smanettoni” di accedere a tutti gli altri ingressi/uscite disponibili (vedi Comandi aggiuntivi).

Le parti essenziali sono:

  • initialize inclusioni, direttive di compilazione, dichiarazioni di variabili e costanti;
  • setup inizializzazione classi, inizializzazione variabili;
  • loop ciclo principale che comprende:

  1. procedure di input;
  2. procedure elaborazione dati;
  3. procedure di output;

 

Resta da comprendere il complesso delle temporizzazioni nell’ambito del ciclo di loop.
Alcune procedure, infatti, sono sottoposte ad un contatore temporale o timer.

Il processore, una volta terminata la fase di inizialize e quella di setup, entra in quella di loop e vi permane sino a quando non viene attivato il reset oppure viene tolta l’alimentazione.

La velocità di ciclo complessiva non è stimabile a priori poiché esistono alcune procedure che usano una quantità di tempo variabile secondo il loro stato interno (ad esempio la procedura di risposta ad una chiamata vocale).

Ipotizziamo che sia di 5 cicli/secondo: la singola procedura di input, ad esempio, verrebbe eseguita 5 volte in un secondo.

Consideriamo la procedura di input relativa all’acquisizione della temperatura: il processore eseguirebbe, perciò, la misura della temperatura 5 volte ogni secondo.

Basterebbe avere una lettura ogni 3-4 secondi e, con il tempo risparmiato, il ciclo complessivo diventerebbe più breve, a tutto vantaggio di altre procedure più lunghe.

Ecco spiegato l’uso dei timer: è un artificio per consentire alle varie procedure di essere eseguite a scadenze prefissate, solo quando il loro contatore temporale supera un certo valore.

La funzione millis() restituisce il numero di millisecondi passati dal momento in cui il sistema è partito: essendo un valore unsigned long raggiunge il suo massimo dopo circa 50 giorni di funzionamento, dopodiché il conteggio riparte da zero.

Inserendo questo valore in una variabile contatore è possibile ad ogni ciclo confrontare il nuovo valore di millis() con quello memorizzato.

Se la differenza è maggiore od uguale al valore programmato (costante) il tempo è stato raggiunto, si esegue la procedura corrispondente e si reimposta la variabile contatore al nuovo valore di millis(); se, invece, la differenza è minore la procedura non viene eseguita.

Esiste, però, un caso in cui il valore della variabile contatore è maggiore di millis(): quando il contatore di millis() raggiunge il suo massimo e si azzera tra un controllo e l’altro.

In questo caso si considera il tempo scaduto e si ricade nel primo caso.

Senza questo controllo si rischia, dopo 50 giorni di funzionamento, di non vedere eseguite le procedure di timing.

...

// ---------- Utility - TimerCheck ----------

boolean TimeElapsed(unsigned long Timer, unsigned long StopTime) {

  unsigned long T = millis();

  if (Timer > T) return true;                     // internal timer resetted after ~50 days

  if ((T - Timer) > StopTime) return true;        // time elapsed
  else return false;
}
...

 

Ecco la dichiarazione delle costanti di tempo all’inizio del programma (Timing):

...

// ---------- DECLARATION - Timing ----------

const unsigned long LEDClockRefresh = 1000;
unsigned long LEDClockTimer = 0;	

const unsigned long GSMRefresh = 3000;          // 1000-n ms
unsigned long GSMTimer = 0;

const byte AnaInReads = 1;                      // 1-n cicli lettura
const unsigned long AnaInDelay = 120;           // 100-n µs (min time reading = 100 µs x channel)
const unsigned long AnaInRefresh = 20;          // 0-n ms
unsigned long AnaInTimer = 0;

const unsigned long DigInRefresh = 100;         // 0-n ms
const unsigned long DigInDebounce = 20;         // 20-n ms
unsigned long DigInTimer = 0;

const unsigned long OptInRefresh = 100;         // 0-n ms
const unsigned long OptInDebounce = 20;         // 20-n ms
unsigned long OptInTimer = 0;

const unsigned long TempRefresh = 1000;         // 0-n ms
unsigned long TempTimer = 0;

const unsigned long SerRxRefresh = 150;         // min-n ms [min = RxBuffer / (Baud / 11)]
unsigned long SerRxTimer = 0;                   // (@ 9600 baud = 128/873 = 140 ms)
...

 

Un esempio è il lampeggio del LED: per consentire di verificare che il programma è esecutivo, il LED3 lampeggia alla velocità di 1 Hz.

Se smette di lampeggiare non necessariamente significa che il sistema è bloccato, ma potrebbe essere impegnato in una procedura lunga (ad esempio rispondere ad una chiamata vocale).

Librerie aggiuntive

Il programma Factotum si avvale di alcune librerie aggiuntive richiamate nell’area INCLUDE:

 

...

#include <EEPROM.h>                             // ATmega2560 internal EEPROM

#include <Wire.h>                               // Two Wire I2C protocol (used by serial EEPROM)
#include <M24LC256.h>                           // serial EEPROM on TiDiGino

#include <stdlib.h>                             // for float to string conversion
#include <OneWire.h>                            // One Wire protocol (used by temperature sensor)
#include <DallasTemperature.h>                  // Dallas DS18B20 temperature sensor

#include <GSM.h>                                // for GSM SIM900 module

...

 

 

  • Wire.h protocollo Two Wire I2C per comunicare con la serial EEPROM;
  • M24LC256.h gestisce le routine di memorizzazione veloce della EEPROM seriale;
  • stdlib.h contiene la funzione dtostrf() per visualizzare valori float (temperatura);
  • OneWire.h gestisce il protocollo One Wire usato dal sensore di temperatura;
  • DallasTemperature.h gestisce il sensore di temperatura Dallas;
  • GSM.h gestisce il modulo GSM SIM900.

L’ultima libreria indicata (GSM.h) è la più importante poiché gestisce il modulo GSM SIM900.

Questa libreria è derivata da quella utilizzata dal GSM Shield for Arduino, opportunamente modificata da Boris Landoni per funzionare con TiDiGino.

Poiché la libreria modificata non aveva indicazioni di come usarla (escludendo gli esempi forniti non del tutto esaustivi), ho seguito le indicazioni di quella originale fornite da GSM Playground Sketches:

www.hwkitchen.com/news/gsm-playground-sketches/

Si faccia attenzione che nel manuale ci sono delle piccole differenze rispetto alla versione per TiDiGino (ad esempio il TurnOn() non ha nessun parametro).

Come afferma la documentazione a corredo (vedi allegato), la tecnica usata per la comunicazione con il modulo è del tipo blocking, ovvero il processore è bloccato finché la comunicazione non termina. Fortunatamente sono stati inseriti dei timer di timeout per uscire da pericolose situazioni di blocco totale.

Il funzionamento della libreria è discreto, ma alla volte si presentano delle anomalie:

  • in caso di caduta della tensione a seguito di un blackout oppure a seguito di un reset, al suo ripristino il modulo GSM non sempre si inizializza correttamente, indicando una chiamata a cui il sistema sta rispondendo; avendo inserito un timeout di 30 secondi, basta aspettare che la chiamata venga chiusa e il sistema riprende il suo funzionamento normale.
  • i toni emessi dal DTMF hanno un ritardo di risposta troppo elevato (> 1200 ms) e perciò i beep sono troppo distanziati.

Per la verità inizialmente la libreria funzionava molto male, ma questo succedeva prima che scoprissi il problema: l’echo.

L’echo è una modalità usata nei terminali per visualizzare sullo schermo ciò che si batte sulla tastiera o si invia.

La cosa può sembrare scontata ma non lo è: il fatto che si inviino dei caratteri non implica necessariamente che essi siano visualizzato sul dispositivo di “ascolto”.

Gli esempi forniti a corredo riportano la presenza del metodo aggiuntivo Echo(1) che consente di attivare l’echo dei comandi AT, mentre nella libreria originale questo comando è stato disattivato.

Probabilmente il metodo è stato aggiunto per effettuare il debug del sistema: peccato che, con il comando echo inserito, la ricezione degli SMS non potesse funzionare e forse anche altre funzioni!

La spiegazione del perché è piuttosto complessa, ma possiamo dire che la presenza sul buffer di ricezione dell’echo del penultimo comando inviato veniva interpretato come la risposta all’ultimo comando inviato.

Ho impiegato diverso tempo per capire che il problema non era all’interno del mio software, ma nella libreria: è normale dare per scontato che la libreria sia funzionante, non vi pare?

Perciò, nel Setup di Factotum occorre inserire il comando Echo(0) e non Echo(1)!

 

...
...
  // ---------- SETUP - GSM & DTMF ----------

  pinMode(GSMDCDPin, INPUT);
  pinMode(GSMRNGPin, INPUT);
  pinMode(GSMCTSPin, INPUT);
  pinMode(GSMLEDPin, INPUT);
  pinMode(GSMStaPin, INPUT);

  pinMode(DTMFSTDPin, INPUT);
  pinMode(DTMFQ1Pin, INPUT);
  pinMode(DTMFQ2Pin, INPUT);
  pinMode(DTMFQ3Pin, INPUT);
  pinMode(DTMFQ4Pin, INPUT);

  pinMode(GSMDTRPin, OUTPUT);
  pinMode(GSMRTSPin, OUTPUT);
  pinMode(GSMResPin, OUTPUT);
  pinMode(GSMPwrPin, OUTPUT);

  gsm.TurnOn(115200);                           // module power on
  gsm.Echo(0);                                  // disable AT echo
  gsm.CheckRegistration();			    // verifica registrazione alla rete
...
...

 

Tutte queste cose hanno contribuito non poco all’allungamento della fase di debug (decine e decine di telefonate ed SMS persi per questi problemi).

A mio avviso la libreria è da considerare più un punto d’inizio che la soluzione definitiva e sarebbe opportuno riscriverla per un migliore abbinamento con TiDiGino.

Tuttavia, poiché gli organizzatori del contest hanno fornito questa versione, questa non è stata modificata, accettandone le limitazioni.

Mappa di memoria

Come già accennato, Factotum adopera esclusivamente la memoria seriale EEPROM per le sue variabili. Essa è stata suddivisa in cinque aree:


Area Indirizzo Iniziale 

(hex)

Indirizzo Finale 

(hex)

Descrizione
Generale 0000 00FF Contiene i valori delle variabili generali
Ingressi 0100 01FF Contiene i valori delle variabili ingressi
Temperatura 0200 02FF Contiene i valori delle variabili temperatura
Uscite 0300 03FF Contiene i valori delle variabili uscite
Rubrica 1000 1FFF Contiene la rubrica dei numeri telefonici (256)


 

La mappa si commenta da sola: nella prima parte vengono salvati i valori delle variabili personalizzate dall’utente, mentre nell’ultima vengono salvati i numeri telefonici da chiamare e/o a cui mandare un SMS (vedi allegato 3).

Si noti che i “buchi” (gap) presenti (aree di memoria libera) hanno il solo scopo di suddividere le varie zone per poter più facilmente apportare delle aggiunte successive.

Ad ogni attivazione del programma, la EEPROM seriale viene analizzata sul suo primo byte per sapere se è vergine o meno (contenuto FF se vergine): se lo è vengono salvate tutte le variabili nell’area di memoria corrispondente, altrimenti il sistema le caricherà dalla stessa area.

E’ del tutto evidente che all’inizio le variabile operative e quelle in memoria saranno identiche.

Successivamente, man mano che il sistema viene personalizzato (cambiando, ad esempio, il messaggio iniziale di attivazione) sarà possibile riallineare i due contenuti usando il comando speciale SAV (save) che memorizza le variabili nella EEPROM: ciò consentirà ai successivi riavvii del sistema di usare le variabili personalizzate anziché quelle preimpostate.

Avrei potuto memorizzare immediatamente i parametri nella EEPROM seriale, ma in questo modo è possibile testare il risultato delle modifiche apportate prima di memorizzarle definitivamente.

A tale scopo ho anche aggiunto il comando RES;<psw> che consente di resettare il sistema anche da remoto. Si noti che non è un vero reset hardware, ma piuttosto una re-inizializzazione.

Una certa attenzione va rivolta all’uso del pulsante utente.

Infatti, tenendolo premuto mentre si riavvia il sistema la memoria EEPROM seriale viene completamente cancellata.

La cosa può essere utile, in caso di malfunzionamento del sistema, per ripristinare le impostazioni originali ed è segnalata sia sul Monitor Seriale con un apposito messaggio, sia attraverso 3 rapidi lampeggi del LED3 (giallo).

 

Memoria SRAM

Un grosso problema che ho dovuto affrontare è quello del relativamente limitato spazio della memoria SRAM.

A quanto sembra, oltre una certa occupazione di memoria, Arduino MEGA 2560 entra in crisi.

Con una occupazione di circa 60 KB della memoria Flash da parte del programma, lo spazio SRAM si riduce a circa 2,5 KB degli 8 KB iniziali. Può sembrare molto, ma per un programma come questo che si basa su una forte interazione “verbale” con l’utente, la memoria libera viene presto saturata dal contenuto delle variabili stringa, con un conseguente crash del sistema.

Per esempio, inserendo i comandi aggiuntivi con l’emulazione Telecontrollo, al momento della ricezione di un SMS (che richiede ben 161 byte per la sua allocazione), il sistema attualmente si resetta, segno che è stata esaurito lo spazio in memoria SRAM.

Ho dovuto faticare non poco per limitare la dimensione delle stringhe allo stretto necessario (ecco il motivo per cui, ad esempio, i messaggi di allarme sono stati limitati a 30 caratteri dei 100 originari).

Certo si potrebbero usare delle tecniche particolari, come quella di memorizzare le variabili stringa nella memoria Flash oppure in quella della EEPROM interna all’ATmega2560, ma mi sembra assurdo che i progettisti di Arduino non abbiano pensato a questa limitazione. Sarebbe bastato portare a 16K la memoria SRAM!

Comunque, conto di risolvere il problema nelle successive versioni del programma.

Ora come ora, per far funzionare correttamente Factotum occorre rinunciare alle modalità di debug della libreria GSM: in pratica bisogna trasformare in commento le definizioni nell’area DEFINE (parte iniziale del file GSM.h).

 

/*
 GSM.h - library for the GSM Playground - GSM Shield for Arduino
 Released under the Creative Commons Attribution-Share Alike 3.0 License
 http://www.creativecommons.org/licenses/by-sa/3.0/
 www.hwkitchen.com

 library version 1.01 by Boris Landoni

 */

#ifndef __GSM

#define __GSM

#include "WProgram.h"

// DEFINE
// #define DEBUG_PRINT
// #define DEBUG_GSMRX
// #define DEBUG_LED_ENABLED
// #define DEBUG_SMS_ENABLED
...
...

 

Le emulazioni

Sono disponibili tre emulazioni: Apricancello, Telecontrollo e Temperatura.

Avrei voluto usare una variabile per attivare queste emulazioni, ma, purtroppo, a causa della limitazione di memoria accennata prima, l’unico sistema per poter attivare queste emulazioni è quello di usare le direttive di compilazione (anche in questo caso, eliminando le limitazioni di memoria nelle future versioni del programma, il problema sarà risolto).

In pratica bisogna modificare nell’area DEFINE le prime tre definizioni, lasciando attiva solo quella che interessa.

Nell’esempio sottostante viene attivata, ad esempio, l’emulazione TEMPERATURA, mentre le precedenti due sono state opportunamente trasformate in commento:

 

/*
 FACTOTUM 1.0 per TiDiGino vers. 1.0
 by Ettore Massimo Albani 30/11/2011
 www.cyberhs.it
 [email protected]
 */

// ========================= DEFINE =========================

//#define APRICANCELLO                            // emulazione apricancello (~ 45 KB Flash)
//#define TELECONTROLLO                           // emulazione telecontrollo (~ 51 KB Flash)
#define TEMPERATURA                             // emulazione termostato (~ 52 KB Flash)

#define COMANDIEXP                              // comandi aggiuntivi (~ 5 KB Flash)

//#define DEBUG                                   // solo per debug

...
...

 

Si noti la presenza della definizione COMANDIEXP che inserisci alcuni comandi aggiuntivi utili per una interazione con le altre risorse del sistema (vedi paragrafo comandi aggiuntivi).

Il passo successivo sarà quello di eseguire l’upload del programma sulla scheda TiGiDino connessa al PC tramite la porta USB.

I comandi

Esistono quattro modi diversi per fornire i comandi al TiGiDino dotato del programma Factotum:

  1. diretto – tramite un PC ed un qualsiasi programma terminale mediante la connessione USB;
  2. remoto – tramite un SMS inviato da un qualsiasi cellulare, purché il numero telefonico appartenga ad uno degli otto numeri autorizzati;
  3. remoto – tramite una telefonata usando la tastiera DTMF, purché si disponga della password di autorizzazione;
  4. remoto – tramite una telefonata, purché il numero telefonico appartenga ad uno dei 256 numeri della lista apricancello (compresi i primi otto autorizzati).

Si noti che, mentre i primi due metodi possono utilizzare tutti i comandi a disposizione, il terzo metodo è limitato ai soli comandi che gestiscono le due uscite, mentre il quarto può funzionare solo con l’emulazione apricancello, essendo l’uscita collegata all’apricancello.

L’elenco completo di tutti comandi è in allegato 4.

Si è cercato il più possibile di non modificare i comandi originali (come richiesto dal contest) e di rendere la sintassi unica per tutti, semplificando il loro inserimento tramite SMS.

A tale scopo, i caratteri separatori <:> e <;> possono essere sostituiti da un semplice spazio (molto più facile da inserire in un SMS) o qualsiasi altro carattere: il programma non si basa sulla loro presenza per verificare la sintassi del comando (eccezione i comandi PEEK e POKE).

Naturalmente occorrerà prestare attenzione a non inserire due spazi al posto di uno, come pure non inserirlo affatto!

Ad esempio, il comando NOR 21 oppure NOR:21 fornirà lo stesso risultato (temperatura normale impostata a 21 °C), ma scrivendo NOR21 la temperatura sarà impostata a 1 °C.

Ancora, nell’inserimento numerico non confondete lo “0” (zero) con la “O” (maiuscola o minuscola). Quindi, occhio alla sintassi!

Per evitare ambiguità, si è evitato l’uso del punto e della virgola come simboli separatori delle cifre decimali: come conseguenza non è possibile inserire cifre decimali, ma solo intere, eventualmente con segno negativo.

L’unica occasione in cui si potrebbe sentire questa esigenza è nel settaggio delle variabili di temperatura ALLMAX, ALLMIN e NOR, ma con piccole modifiche si potrebbe rimediare a questo inconveniente.

Comandi tramite USB

È il sistema più pratico per personalizzare Factotum. Naturalmente bisogna disporre di un PC, di un programma di comunicazione seriale (tipo HyperTerminal) e di un cavetto USB maschio A – maschio B mini.

La porta USB del TiGiDino viene riconosciuta automaticamente, ma bisogna fornire i drive per il chip FT232.

Contrariamente ai comandi tramite SMS, la variabile RISP non viene resettata dopo aver inviata la risposta: quindi è possibile disattivare la risposta in maniera indefinita.

Tramite i comandi aggiuntivi PEEK e POKE, esiste la possibilità di accedere all’intera mappa di memoria tramite un programma esterno.

Comandi tramite SMS

Ad ogni comando inviato tramite SMS da un numero telefonico preferenziale viene inviato un SMS di risposta.

È possibile inviare più comandi nello stesso SMS avendo l’accortezza di separarli con il carattere “,”: in questo modo si risparmia tempo e denaro con l’unico limite dei 160 caratteri a disposizione per un SMS.

Esiste anche la possibilità di evitare la risposta usando il comando RISP:OFF che setta la corrispondente variabile booleana RISP a false.

Questo comando deve essere dato all’interno di ogni SMS a cui non si desidera avere risposta in quanto la variabile viene ripristinata a true dopo il suo utilizzo.

Si consiglia di inviare questo comando solo dopo aver preso confidenza con il sistema.

Comandi tramite DTMF

Con questa modalità è possibile fornire dei comandi relativi agli ingressi optoisolati ad alle uscite a relè.

L’elenco completo di tutti comandi è in allegato 5.

Quando il modulo riceve una chiamata vocale, risponde con tre beep stando ad indicare la richiesta della password che è un numero di 5 digit.

Al quinto digit viene verificata la sua validità e la risposta è un beep.

Se, invece, la password è errata, vengono emessi nuovamente tre beep e la verifica riprende.

Tutto questo deve verificarsi in un tempo prestabilito dal timer che è stato predisposto per 30 secondi, dopo i quali la chiamata viene terminata.

Passata la verifica della password, possiamo fornire i comandi indicati nella tabella, ricevendo le risposte o le conferme sotto forma di beep.

Comandi aggiuntivi

Oltre ai comandi standard, se in fase di compilazione è stato predisposto il define COMANDIEXP, sono disponibili dei comandi aggiuntivi utili per conoscere lo stato degli ingressi e delle uscite non gestiti direttamente da Factotum.

Si noti che ho ripartito in questo modo le altre porte di I/O a disposizione:

 

Porte Pin Note
Digital Input 62, 4, 5, 6, 7 Il pin 62 corrisponde al pulsante utente
Digital Output 8, 9, 10, 11
PWM Output 12, 13
Interrupt 2, 3 Non gestiti attualmente
Analog Input A0, A1, A2, A3, A4, A5 Attivato resistore interno di pull up da 20K

 

Per quello che riguarda gli ingressi analogici, per evitare false letture, viene effettuata una media di n letture consecutive (con n personalizzabile attraverso la costante AnaInReads = 1÷n).

Un comando aggiuntivo che ho dovuto eliminare per problemi di memoria è l’utilissimo HELP: avrebbe consentito di ottenere l’elenco completo di tutti i comandi con relativo significato e sintassi.

Comunque non escludo, una volta risolto il problema della memoria, che le successive versioni possano contenere questo comando.

Il programma prevede una funzionalità di monitoraggio sulla serial 0 connessa al PC.

Tutti gli eventi vengono visualizzati nella finestra del Serial Monitor dell’IDE di Arduino configurato con queste impostazioni: auto scroll, 9600 baud, no line ending.

I due ultimi comandi PEEK e POKE danno la possibilità di leggere e scrivere le informazioni dalla/nella memoria EEPROM seriale.

Sono questi comandi pensati per una personalizzazione di Factotum attraverso l’interazione con un programma di comunicazione esterno.

Si noti che questi due comandi utilizzano i caratteri separatori <:> e <;> che, quindi, non possono essere omessi.

Ecco un esempio di visualizzazione degli ingressi analogici:

Si noti che l’ingresso A2 è stato portato a massa, mentre gli altri sono liberi (resistore di pullup interno da 20 K).

In questo altro esempio sono visualizzati le uscite digitali, gli ingressi digitali e le uscite PWM dopo aver settato l’uscita PWM 10 a 55:

Si noti l’errore di assegnazione PWM e la risposta del sistema.

I numeri preferenziali e l’autoapprendimento

La rubrica è composta da 256 numeri telefonici, ma i primi 8 hanno una funzione speciale e vengono detti preferenziali poiché è con essi che è possibile impostare le preferenze.

Il numero preferenziale, infatti, consente di fornire comandi al TiDiGino sottoforma di SMS per personalizzare l’ambiente secondo le proprie esigenze o preferenze.

Quando il programma parte per la prima volta oppure viene resettato con la cancellazione forzata della memoria seriale EEPROM (vedi “Mappa di memoria”), non ha inserito alcun numero preferenziale da cui accettare gli SMS e, quindi, personalizzare TiDiGino.

L’unico modo è tramite un collegamento locale con un PC via USB.

Tuttavia, esiste un’ulteriore possibilità detta di autoapprendimento.

Si chiama semplicemente TiDiGino con il cellulare il cui numero telefonico si desidera diventi il primo della lista dei preferenziali: se la locazione è vuota, il programma memorizza il numero e da quel momento gli SMS (da quel numero) verranno accettati.

Per memorizzare gli altri numeri, si può usare il comando NUM<1÷8>:<num>;<psw> mentre il comando NUM<1÷8>;<psw> li cancella.

Per avere una lista completa di tutti gli 8 numeri preferenziali si deve usare il comando NUM?;<psw> che fornisce un’uscita (su monitor o tramite SMS) come questa:

 

1: +393458007xxx V numero che riceverà solo squilli (V)

2: — S V

3: — S V

4: +390498056xxx S V numero che riceverà sia SMS (S) che squilli (V)

5: — S V

6: — S V

7: — S V

8: — S V

 

I comandi SMS<123…8>:<ON/OFF>;<psw> e VOC<123…8>:<ON/OFF>;<psw> consentono di attivare o disattivare per ognuno dei numeri preferenziali l’invio di SMS e/o squilli in caso di allarme ingressi.

Esempio:

SMS248:ON;12345 attiva invio SMS per numeri preferenziali 2, 4 e 8

VOC1268:OFF;12345 disattiva squilli per numeri preferenziali 1, 2, 6 e 8

Emulazione Apricancello

Questa è l’emulazione meno complessa. Utilizza l’area rubrica delle EEPROM seriale per memorizzare, oltre agli 8 numeri preferenziali, altri 248 numeri telefonici, per un totale di 256 numeri.

I numeri telefonici sono stati previsti con un massimo di 16 caratteri, compreso il prefisso internazionale.

È stato aggiunto il comando PRE:<prefix> che consente di inserire il prefisso di default che per l’Italia è “+39”. Ricordo che il “+” corrisponde al doppio zero “00”. La sua lunghezza massima è di 5 caratteri.

Nel caso il numero telefonico inserito non contenga il prefisso, questo viene automaticamente aggiunto dal programma.

Il numero telefonico (a parte il prefisso) non può essere più lungo di 10 caratteri (11 per zone ad alta concentrazioni di telefoni).

Quindi 11 caratteri più 5 di prefisso sono appunto 16 caratteri.

Si noti che il limite di memorizzazione di 256 numeri telefonici è più che altro pratico, poiché lo spazio di memoria consentirebbe la memorizzazione di altri 1536 numeri!

Ad ogni chiamata ricevuta dal modulo GSM, viene controllata l’identità del chiamante ovvero il numero di telefono. Se il numero di telefono corrisponde ad un elemento della lista, viene attivato il relè 1 connesso al sistema apricancello e quindi il programma termina la telefonata.

In questo modo il chiamante non spende nulla per la telefonata (un bel risparmio!).

La stessa apertura può essere fatta anche in locale, tenendo premuto il pulsante utente della scheda per almeno un ciclo di loop (circa 1 secondo).

I numeri preferenziali possono anche inviare SMS contenenti i comandi.

Emulazione Telecontrollo

Una spiegazione delle funzioni di allarme è d’obbligo.

Gli ingressi optoisolati possono essere processati se la variabile ALI (allarme ingressi) è true. La variabile viene controllata dal relativo comando ALI (che fantasia!): se posto in ON la variabile assume valore true, viceversa con OFF essa assume valore false.

I livelli degli ingressi di allarme possono essere A (alto), B (basso) e V (variazione): impostando il comando LIV<1/2>:<A/B/V> relativo ad uno dei due ingressi si stabilisce quando il livello di tensione deve essere considerato allarme.

Un ingresso entrato in stato di allarme non viene considerato subito tale, ma deve passare un certo tempo (detto di osservazione o di preallarme). Questo tempo è controllato dalle variabili OSS1 e OSS2 ed è settato dal relativo comando OSS<1/2>:<0÷59> (tempo espresso in secondi).

Una volta trascorso questo tempo, se l’ingresso non ha subito variazioni, l’allarme diventa effettivo.

È a questo punto che parte il timer del tempo di inibizione controllato dalle variabili INI1 ed INI2 e settato dal relativo comando INI<1/2>:<0÷59> (tempo espresso in minuti).

In pratica, esprime il tempo per il quale l’allarme non deve generare altri SMS e/o squilli agli otto possibili numeri preferenziali.

I comandi SMS<123…8>:<ON/OFF>;<psw> e VOC<123…8>:<ON/OFF>;<psw> consentono di attivare o disattivare per ognuno dei numeri preferenziali l’invio di SMS e/o squilli in caso di allarme ingressi.

Esempio:

SMS248:ON;12345 attiva invio SMS per numeri preferenziali 2, 4 e 8

VOC1268:OFF;12345 disattiva squilli per numeri preferenziali 1, 2, 6 e 8

Emulazione Temperatura

Il sensore per la temperatura ambientale DS18B20 (DALLAS-MAXIM) consente di scegliere vari livelli di risoluzione:

  • 9 bit risoluzione 0,5°C
  • 10 bit risoluzione 0,25°C
  • 11 bit risoluzione 0,125°C
  • 12 bit risoluzione 0,0625°C

Si è scelto di usare la massima risoluzione di 12 bit per garantire l’apprezzamento del decimo di grado.

Il range di temperatura del sensore è compreso tra -55°C e +125°C, anche se la precisione di ±0.5°C è garantita tra -10°C e +85°C.

Comunque, per un controllo di temperatura ambientale sono valori più che sufficienti.

Purtroppo questa precisione della misura è falsata dal fatto che dopo qualche minuto di funzionamento del sistema, la temperatura rilevata sale di circa 2 gradi rispetto a quella ambiente.

Tuttavia, non credo che il problema sia la vicinanza di qualche componente “caldo” sulla scheda e neanche di qualche esoterica influenza del generatore RF del modulo GSM.

La logica vorrebbe che il sia pur minimo consumo di corrente (da 1 a 4 mA) da parte del dispositivo fosse sufficiente ad innalzare la temperatura del diodo interno di rilevamento, ma possibile che i progettisti non se ne siano accorti?

La casa costruttrice del sensore pare fosse a conoscenza di un problema simile per il sensore DS1820 (vedi rapporto DALLAS allegato) sottoposto alla temperatura di vapore, imputando la causa ad un resistore collegato all’oscillatore interno del sistema di conteggio che è sensibile agli stress meccanici.

Lo stesso documento afferma che i problemi sono stati risolti con il DS18S20, ma non parla del DS18B20 usato in questo caso. Noto soltanto che con il DS18S20 la risoluzione è scesa a soli 9 bit (risoluzione 0,5°C): come mai?

Il documento è del 7 marzo 2000 e dopo un anno la DALLAS è stata acquisita dalla MAXIM: forse nell’acquisizione i tecnici si sono accorti dei problemi ed hanno ridotto la risoluzione per evitare “rogne” con la clientela? Mah!

Il fatto è che il problema c’è e non è trascurabile (due gradi sono tanti…).

Si potrebbe pensare ad un offset di un paio di gradi da sottrarre progressivamente nell’arco di 5 minuti alla temperatura rilevata per tener conto di questo effetto indesiderato, ma sarebbe un palliativo poco elegante.

Mi domando, allora, se non sia meglio utilizzare un più economico NATIONAL LM35, vista la presenza degli ingressi analogici inutilizzati.

Volendo proprio usare un sensore One Wire sarebbe stato meglio predisporne un montaggio separato dalla scheda del TiDiGino e, magari, prevedere un secondo sensore delle stesso tipo per la rilevazione della temperatura esterna: il protocollo, infatti, prevede la possibilità di più dispositivi presenti sullo stesso bus.

È stata aggiunto il comando IST:<0÷20> collegato alla variabile IST che esprime l’isteresi in decimi di grado (valore di default 5 corrispondente a 0,5°C) per evitare ravvicinate attivazioni/disattivazioni del relè 1 collegato alla caldaia.

In pratica, il relè si attiva sotto la temperatura di (NOR – IST) e si disattiva sopra la temperatura di (NOR + IST)

Certo sarebbe stato meglio predisporre un controllo di tipo PID (Proporzionale Integrativo Derivativo) per prevedere il naturale ritardo nella risposta del sistema Ambiente-Caldaia (dovuto al volano termico), cosa che è presente nei moderni crono-termostati.

Tuttavia, considerando le finalità di questo apparecchio (controllo remoto dell’impianto di riscaldamento della casa in montagna e simili), questa funzione non è indispensabile.

Per lo stesso motivo, il range di temperatura è stato ridotto a valori compresi tra -10°C e +85°C, in modo da garantire la precisione della misura.

Naturalmente i comandi NOR, ALLMIN ed ALLMAX verificano la congruenza delle temperature all’interno di questo range ed anche tra loro (non è possibile, ad esempio, inserire un NOR a 18°C con un ALLMIN settato a 20°C).

Per quanto riguarda il pulsante utente, tenendolo premuto per almeno un ciclo di loop (1 secondo), commuta la modalità di funzionamento (Automatico/Manuale/Termostato) in modo ciclico.

Il LED3 si attiva quando il funzionamento è automatico, mentre il LED4 si attiva quando il funzionamento è su termostato. In caso di funzionamento manuale, invece, i due LED risultano spenti.

 

LED Colore Segnalazione Note
1 Rosso Stato uscita 1 Caldaia accesa/spenta
2 Rosso Stato uscita 2 non utilizzata
3 Giallo Funzionamento automatico Se spenti indicano il funzionamento manuale
4 Giallo Funzionamento termostato

 

Per quanto riguarda gli ingressi optoisolati:

 

Ingresso Optoisolato Funzione Allarme Note
1 Caldaia in avaria Allarme caldaia Collegare in parallelo spia avaria caldaia
2 Termostato nessuno Collegare in parallelo al termostato ambiente (se presente)


È possibile fornire comandi diretti alle uscite a relè, ma solo per il relè 2.

Il relè 1 (caldaia) , essendo controllato dalla procedura di controllo temperatura, può essere controllato solo se il funzionamento è manuale.

I comandi SMS<123…8>:<ON/OFF>;<psw> e VOC<123…8>:<ON/OFF>;<psw> consentono di attivare o disattivare, per ognuno dei numeri preferenziali, l’invio di SMS e/o squilli in caso di allarme temperatura e/o caldaia.

Difetti conosciuti

La prima regola di un programmatore è quella di non essere il collaudatore del proprio software; questa regola, in questo caso, non è stata osservata con la conseguenza che è possibile che nel software ci siano delle sviste o degli errori in alcuni punti.

Lascio ai validi tecnici di Futura Elettronica l’onere delle prove, pregandoli di segnalarmi qualsiasi anomalia.

Certo sarebbe desiderabile che non esistessero difetti, ma purtroppo questo non può accadere, almeno per le versioni iniziali del programma:

  • in caso di caduta della tensione a seguito di un blackout, al suo ripristino il modulo GSM non sempre si inizializza correttamente (presenza sul mio prototipo del resistore R20?);
  • nel caso di assenza della SIM, la velocità di ciclo scende sensibilmente;
  • il comando FIL:<ON/OFF>, pur essendo presente e funzionante, non viene gestito (non riesco a comprenderne l’utilità);
  • il comando SIC:<ON/OFF> non viene gestito poiché i comandi DTMF sono tutti condizionati dall’inserimento della password (una tantum);
  • i beep DTMF generati dal modulo GSM richiedono un tempo eccessivamente lungo;
  • le temperature ALLMIN, ALLMAX e NOR sono numeri interi e quindi non possono contenere decimali;
  • la temperatura rilevata dal sensore sale di due gradi rispetto a quella ambientale dopo 5 minuti circa dall’accensione del sistema e ciò è fuorviante ai fini del controllo ambientale;
  • non è indispensabile ma sarebbe meglio aggiungere un LED per indicare l’attività del processore: il LED3 usato allo scopo è già utilizzato dall’emulazione Temperatura, mentre sarebbe più utile collegarne uno al classico pin 13 in modo da essere compatibile con la serie Arduino.

Ad alcuni di essi si può rimediare, ma per altri è richiesta una maggiore quantità di tempo per prove e migliorie.

 

PINOUT

ATmega2560 Arduino MEGA 2560 TiDiGino
Pin Pin Name Pin Port Port Name Pin Port Port Name
2 PE0 (RXD0-PCINT8) 0 0 RX0 0 0 RX0
3 PE1 (TXD0) 1 1 TX0 1 1 TX0
6 PE4 (OC3B-INT4) 2 2 PWM-INT4 2 2 PWM-INT4
7 PE5 (OC3C-INT5) 3 3 PWM-INT5 3 3 PWM-INT5
1 PG5 (OC0B) 4 4 PWM 4 4 PWM
5 PE3 (OC3A-AIN1) 5 5 PWM 5 5 PWM
15 PH3 (OC4A) 6 6 PWM 6 6 PWM
16 PH4 (OC4B) 7 7 PWM 7 7 PWM
17 PH5 (OC4C) 8 8 PWM 8 8 PWM
18 PH6 (OC2B) 9 9 PWM 9 9 PWM
23 PB4 (OC2A-PCINT4) 10 10 PWM 10 10 PWM
24 PB5 (OC1A-PCINT5) 11 11 PWM 11 11 PWM
25 PB6 (OC1B-PCINT6) 12 12 PWM 12 12 PWM
26 PB7 (OC0A-OC1C-PCINT7) 13 13 PWM (LED) 13 13 PWM
64 PJ1 (TXD3-PCINT10) 14 14 TX3 14 DTMF STD
63 PJ0 (RXD3-PCINT9) 15 15 RX3 15 <n.c.>
13 PH1 (TXD2) 16 16 TX2 16 <n.c.>
12 PH0 (RXD2) 17 17 RX2 17 <n.c.>
46 PD3 (TXD1-INT3) 18 18 TX1-INT3 GSM15 18 GSM15 TX1
45 PD2 (RXD1-INT2) 19 19 RX1-INT2 GSM16 19 GSM16 RX1
44 PD1 (SDA-INT1) 20 20 SDA-INT1 20 SDA (EEPROM2)
43 PD0 (SCL-INT0) 21 21 SCL-INT0 21 SCL (EEPROM2)
78 PA0 (AD0) 22 22 Digital I/O 22 <n.c.>
77 PA1 (AD1) 23 23 Digital I/O 23 <n.c.>
76 PA2 (AD2) 24 24 Digital I/O 24 <n.c.>
75 PA3 (AD3) 25 25 Digital I/O 25 LED3
74 PA4 (AD4) 26 26 Digital I/O 26 LED4
73 PA5 (AD5) 27 27 Digital I/O GSM18 27 GSM DCD
71 PA7 (AD7) 29 29 Digital I/O GSM14 29 GSM RTS
60 PC7 (A15) 30 30 Digital I/O 30 <n.c.>
59 PC6 (A14) 31 31 Digital I/O 31 <n.c.>
72 PA6 (AD6) 31 31 Digital I/O GSM17 31 GSM DTR
58 PC5 (A13) 32 32 Digital I/O 32 <n.c.>
57 PC4 (A12) 33 33 Digital I/O 33 <n.c.>
56 PC3 (A11) 34 34 Digital I/O GSM12 34 GSM RING
55 PC2 (A10) 35 35 Digital I/O GSM06 35 GSM RESET
54 PC1 (A9) 36 36 Digital I/O 36 RLYOUT 1
53 PC0 (A8) 37 37 Digital I/O 37 RLYOUT 2
50 PD7 (T0) 38 38 Digital I/O 38 <n.c.>
70 PG2 (ALE) 39 39 Digital I/O GSM13 39 GSM CTS
52 PG1 (RD) 40 40 Digital I/O 40 <n.c.>
51 PG0 (WR) 41 41 Digital I/O 41 <n.c.>
42 PL7 42 42 Digital I/O 42 <n.c.>
41 PL6 43 43 Digital I/O 43 <n.c.>
40 PL5 (OC5C) 44 44 Digital I/O 44 <n.c.>
39 PL4 (OC5B) 45 45 Digital I/O 45 <n.c.>
38 PL3 (OC5A) 46 46 Digital I/O 46 <n.c.>
37 PL2 (T5) 47 47 Digital I/O 47 <n.c.>
36 PL1 (ICP5) 48 48 Digital I/O 48 <n.c.>
35 PL0 (ICP4) 49 49 Digital I/O 49 <n.c.>
22 PB3 (MISO-PCINT3) 50 50 MISO (ICSP1) ICSP1 50 MISO
21 PB2 (MOSI-PCINT2) 51 51 MOSI (ICSP4) ICSP4 51 MOSI
20 PB1 (SCK-PCINT1) 52 52 SCK (ICSP3) ICSP3 52 SCK
19 PB0 (SS-PCINT0) 53 53 Digital I/O (SS) 53 <n.c.>
97 PF0 (ADC0) A0 54 Analog 0 A0 54 Analog 0
96 PF1 (ADC1) A1 55 Analog 1 A1 55 Analog 1
95 PF2 (ADC2) A2 56 Analog 2 A2 56 Analog 2
94 PF3 (ADC3) A3 57 Analog 3 A3 57 Analog 3
93 PF4 (ADC4-TCK) A4 58 Analog 4 A4 58 Analog 4
92 PF5 (ADC5-TMS) A5 59 Analog 5 A5 59 Analog 5
91 PF6 (ADC6-TDO) A6 60 Analog 6 60 <n.c.>
90 PF7 (ADC7-TDI) A7 61 Analog 7 61 <n.c.>
89 PK0 (ADC8-PCINT16) A8 62 Analog 8 62 P2 (pulsante utente)
88 PK1 (ADC9-PCINT17) A9 63 Analog 9 63 TEMP
87 PK2 (ADC10-PCINT18) A10 64 Analog 10 64 <n.c.>
86 PK3 (ADC11-PCINT19) A11 65 Analog 11 65 <n.c.>
85 PK4 (ADC12-PCINT20) A12 66 Analog 12 66 <n.c.>
84 PK5 (ADC13-PCINT21) A13 67 Analog 13 67 <n.c.>
83 PK6 (ADC14-PCINT22) A14 68 Analog 14 68 <n.c.>
82 PK7 (ADC15-PCINT23) A15 69 Analog 15 69 <n.c.>
65 PJ2 (XCK3-PCINT11) 72 <n.c.> 72 DTMF Q1
66 PJ3 (PCINT12) 73 <n.c.> 73 DTMF Q2
67 PJ4 (PCINT13) 74 <n.c.> 74 DTMF Q3
68 PJ5 (PCINT14) 75 <n.c.> 75 DTMF Q4
69 PJ6 (PCINT 15) 76 <n.c.> GSM19 76 GSM NETLED (|| LED5)
79 PJ7 77 <n.c.> GSM01 77 GSM ON/OFF
9 PE7 (CLKO-ICP3-INT7) 83 <n.c.> 83 IN2
8 PE6 (T3-INT6) 84 <n.c.> 84 IN1
10 VCC VCC VCC
31 VCC VCC VCC
61 VCC VCC VCC
80 VCC VCC VCC
100 AVCC VCC VCC
98 AREF Aref Aref
11 GND GND GND
32 GND GND GND
62 GND GND GND
81 GND GND GND
99 AGND GND GND
30 RESET RES RES
4 PE2 (XCK0-AIN0) <n.c.> <n.c.>
14 PH2 (XCK2) <n.c.> <n.c.>
27 PH7 (T4) <n.c.> <n.c.>
28 PG3 (TOSC2) <n.c.> <n.c.>
29 PG4 (TOSC1) <n.c.> <n.c.>
33 XTAL2 <n.c.> <n.c.>
34 XTAL1 <n.c.> <n.c.>
47 PD4 (ICP1) <n.c.> <n.c.>
48 PD5 (XCK1) <n.c.> <n.c.>
49 PD6 (T1) <n.c.> <n.c.>
GSM03 GSM03 VCC
GSM10 GSM10 ADC
GSM11 GSM11 AGND
GSM02 GSM02 GND
GSM05 GSM05 MIC-
GSM04 GSM04 MIC+
GSM08 GSM08 SPK-
GSM09 GSM09 SPK+
GSM07 GSM07 VRTC

 

Mappa di memoria

EEPROM seriale – Mappa di memoria
Gruppo Variabile Tipo Adr Ini Len Adr Fin Valore Predefinito Descrizione
dec hex dec x totale dec hex
Generale AVV boolean 0 0000 1 1 1 0 0000 true Invio SMS all’avvio
FIL boolean 1 0001 1 1 1 1 0001 false Filtra chiamate entranti
PRE String 2 0002 5 1 5 6 0006 +39 Prefisso internazionale
PWD String 7 0007 5 1 5 11 000B 12345 Password
RISP boolean 12 000C 1 1 1 12 000C true Invia SMS di risposta
TSU String 13 000D 30 1 30 42 002A System startup Testo messaggio Accensione
TTP[] byte[] 43 002B 1 8 8 50 0032 3 Trattamento numeri telefonici primari
51 0033 205 1 205 255 00FF <area libera>
Ingressi ALI boolean 256 0100 1 1 1 256 0100 true Allarme ingressi
INI1 byte 257 0101 1 1 1 257 0101 5 Minuti inibizione ingresso 1
INI2 byte 258 0102 1 1 1 258 0102 5 Minuti inibizione ingresso 2
LIV1 String 259 0103 1 1 1 259 0103 A Livello allarme ingresso 1 (A, B, V)
LIV2 String 260 0104 1 1 1 260 0104 A Livello allarme ingresso 2 (A, B, V)
OSS1 byte 261 0105 1 1 1 261 0105 1 Secondi osservazione ingresso 1
OSS2 byte 262 0106 1 1 1 262 0106 1 Secondi osservazione ingresso 2
TIN1A String 263 0107 30 1 30 292 0124 Ingresso 1 alto Testo allarme Alto ingresso 1
TIN1B String 293 0125 30 1 30 322 0142 Ingresso 1 basso Testo allarme Basso ingresso 1
TIN2A String 323 0143 30 1 30 352 0160 Ingresso 2 alto Testo allarme Alto ingresso 2
TIN2B String 353 0161 30 1 30 382 017E Ingresso 2 basso Testo allarme Basso ingresso 2
TIZ1 boolean 383 017F 1 1 1 383 017F false Azzera tempo inibizione ingresso 1
TIZ2 boolean 384 0180 1 1 1 384 0180 false Azzera tempo inibizione ingresso 2
385 0181 127 1 127 511 01FF <area libera>
Temperatura ALL boolean 512 0200 1 1 1 512 0200 false Allarmi temperatura attivi
ALLMAX char 513 0201 1 1 1 513 0201 25 Temperatura allarme massima
ALLMIN char 514 0202 1 1 1 514 0202 15 Temperatura allarme minima
FUN String 515 0203 1 1 1 515 0203 A Funzionamento (A, M, T)
IST byte 516 0204 1 1 1 516 0204 2 Isteresi (decimi di grado)
NOR char 517 0205 1 1 1 517 0205 21 Temperatura normale
THI char 518 0206 30 1 30 547 0223 Allarme temperatura massima Testo allarme temperatura massima
TIN char 548 0224 30 1 30 577 0241 Allarme caldaia Testo allarme caldaia
TLO char 578 0242 30 1 30 607 025F Allarme temperatura minima Testo allarme temperatura minima
608 0260 160 1 160 767 02FF <area libera>
Uscite OUT1 byte 768 0300 1 1 1 768 0300 3 Secondi attivazione uscita 1
OUT2 byte 769 0301 1 1 1 769 0301 3 Secondi attivazione uscita 2
RIP boolean 770 0302 1 1 1 770 0302 true Ripristino Relé dopo blackout
TAC byte 771 0303 1 1 1 771 0303 5 Secondi attivazione apricancello
TIM1 byte 772 0304 1 1 1 772 0304 3 Secondi inversione momentanea uscita 1
TIM2 byte 773 0305 1 1 1 773 0305 3 Secondi inversione momentanea uscita 2
RelayVal[] boolean 774 0306 1 1 1 774 0306 false Stato relé 1
RelayVal[] boolean 775 0307 1 1 1 775 0307 false Stato relé 2
776 0308 248 1 248 1023 03FF <area libera>
Gap 1024 0400 16 192 3072 4095 0FFF <non utilizzata>
Rubrica char 4096 1000 16 256 4096 8191 1FFF Numeri telefonici
8192 2000 16 1536 24576 32767 7FFF <area libera>


Comandi

TiDiGino – Comandi
Gruppo Funzione Sintassi Variabile Collegata Valore Predefinito
Generale Invio SMS o squilli all’avvio AVV:<ON/OFF> AVV true
Filtro chiamate entranti
(accetta solo numeri autorizzati)
FIL:<ON/OFF> FIL false
Prefisso internazionale 

(max 5 caratteri)

PRE:<prefix> PRE +39
Cambio Password
(numero di 5 cifre)
PWD:<psw>;<newpsw> PWD 12345
Reset
(ricarica impostazioni personalizzate)
RES;<psw>
Invia SMS di risposta RISP:<ON/OFF> RISP true
Salva impostazioni personalizzate SAV;<psw>
Visualizza stato Ingressi e Uscite STA?
Comandi DTMF con password SIC:<ON/OFF> false
Testo startup
(max 30 caratteri)
TSU:<testo> TSU System startup
Ingressi Optoisolati Visualizza tempi di inibizione ingressi INI? INI1, INI2
Visualizza allarme ingressi ALI? ALI
Allarme ingressi ALI:<ON/OFF> ALI false
Tempo inibizione ingresso 1/2
(0÷59 minuti per evitare dopo allarme altri SMS o squilli)
INI<1/2>:<0÷59> INI1, INI2 5
Visualizza livelli allarme LIV?
Livello allarme ingresso Alto/Basso/Variazione
(presenza tensione in ingresso)
LIV<1/2>:<A/B/V> LIV1, LIV2 A
Visualizza tempi osservazione ingressi
(tempo di preallarme)
OSS? OSS1, OSS2
Tempo di osservazione Ingresso 1/2
(0÷59 secondi – tempo di preallarme)
OSS<1/2>:<0÷59> OSS1, OSS2 1
Testo allarme alto ingresso ½ 

(max 30 caratteri)

TIN<1/2>A:<testo> TIN1A, TIN2A Ingresso 1 alto
Testo allarme basso ingresso ½
(max 30 caratteri)
TIN<1/2>B:<testo> TIN1B, TIN2B Ingresso 1 basso
Azzera tempo di inibizione ingresso x a fine allarme TIZ<1/2>:<ON/OFF> TIZ1, TIZ2 false
Temperatura Visualizza le temperature di allarme ALL? NOR, ALLMAX, ALLMIN
Allarmi temperatura ALL:<ON/OFF> ALL false
Temperatura allarme massima
(-10 ÷ +85 °C)
ALLMAX:<±><0÷99> ALLMAX 25
Temperatura allarme minima
(-10 ÷ +85 °C)
ALLMIN:<±><0÷99> ALLMIN 17
Visualizza tipo funzionamento FUN? FUN
Tipo di funzionamento
(A=Automatico, M=Manuale, T=Termostato)
FUN:<A/M/T> FUN A
Isteresi
(decimi di grado)
IST:<0÷20> IST 5
Temperatura normale
(-10 ÷ +85 °C)
NOR:<±><0÷99> NOR 21
Richiedere la temperatura TEMP? TempVal, TempMax, TempMin
Testo allarme temperatura massima 

(max 30 caratteri)

THI:<testo> THI Allarme Temperatura Massima
Testo allarme caldaia
(max 30 caratteri)
TIN:<testo> TIN Allarme Caldaia
Testo allarme temperatura minima
(max 30 caratteri)
TLO:<testo> TLO Allarme Temperatura Minima
Azzera temperature minima e massima TRES TempMax, TempMin -55, 125
Uscite a Relè Attiva/Disattiva Relé x OUT<1/2>:<ON/OFF> RelayVal[] false
Tempo di attivazione Relé x
(0=Bistabile)
OUT<1/2>:<0÷59> OUT1, OUT2 0
Visualizza stato Ripristino RIP?
Ripristino Relé dopo blackout RIP:<ON/OFF> RIP true
Tempo di attivazione apricancello
(0=Bistabile)
TAC:<0÷59> TAC 3
Tempo di inversione momentanea stato Relé x (1÷9 secondi) TIM<1/2>:<1÷9> TIM1, TIM2 3
Rubrica Cancellazione totale lista apricancello
(tranne i primi 8 numeri)
DAC;<psw>
Cancella numero da lista apricancello DAC:<num>;<psw>
Visualizza numeri apricancello 

(pagina gruppi di 8)

MAC?:<2÷32>;<psw>
Memorizza numero lista apricancello (max 16 caratteri) MAC:<num>;<psw>
Visualizza numeri preferenziali
(prime 8 posizioni)
NUM?;<psw>
Cancella numero preferenziale in posizione <1÷8> NUM<1÷8>;<psw>
Memorizza numero preferenziale in posizione <1÷8> (max 16 caratteri) NUM<1÷8>:<num>;<psw>
Numeri preferenziali a cui verranno inviati gli SMS SMS<123…8>:<ON/OFF>;<psw> TTP[] 3
Numeri preferenziali a cui verrà fatto uno squillo VOC<123…8>:<ON/OFF>;<psw> TTP[] 3
Aggiuntivi Visualizza ingressi analogici AIN? AnaInVal[]
Visualizza ingressi digitali DIN? DigInVal[]
Visualizza uscite digitali DOUT? DigOutVal[]
Imposta uscita digitale DOUT<4÷13>:<0/1> DigOutVal[] 0
Visualizza uscite PWM PWM? PWMVal[]
Imposta uscita PWM PWM<4÷13>:<0÷255> PWMVal[] 0
Visualizza contenuto memoria EEPROM seriale PEEK<adr>;<size>
Scrive valore nella memoria EEPROM seriale POKE<adr>;<size>:<val>
Note:
– è possibile usare indifferentemente il maiuscolo o il minuscolo;
– i caratteri di separazione “:” e “;” possono essere sostituiti da un semplice spazio (unica eccezione sono i comandi PEEK e POKE), ma attenzione a non inserirne più di uno!
 

il comando FIL:<ON/OFF>, pur essendo presente e funzionante, non viene gestito (non riesco a comprenderne l’utilità);

il comando SIC:<ON/OFF> non viene gestito poiché i comandi DTMF sono tutti condizionati dall’inserimento della password (una tantum);

 

Comandi DTMF

TiDiGino – Comandi DTMF
Tipo Tasto Funzione Normale Risposta Funzione Programmazione Risposta
Uscite 

 

1 Cambia stato relè 1
(modalità bistabile)
1 beep relè ON
2 beep relè
OFF
Tempo monostabile relè 1
(tra 1 e 9)
1 beep comando accettato
2 beep comando non accettato
2 Cambia stato relè 2
(modalità bistabile)
Tempo monostabile relè 2
(tra 1 e 9)
3 Cambia stato relè 1
(modalità monostabile)
4 Cambia stato relè 2
(modalità monostabile)
5 Stato del relè 1
6 Stato del relè 2
Ingressi 7 Stato dell’ingresso 1 1 beep presenza di tensione
2 beep assenza di tensione
8 Stato dell’ingresso 2
Generale 9
0 Termina telefonata
Programma * Entra nella modalità di programmazione
# Esci dalla modalità di programmazione
Note:
durante la fase di connessione e riconoscimento, il sistema inviando tre beep consecutivi comunica che per procedere è richiesta la password; una volta che la password inserita è stata riconosciuta, il sistema emette un beep, che indica che la password è stata accettata.


Download

Dalla pagina http://code.google.com/p/tidigino potete scaricare le ultime release del firmware

Lo Sketch FACTOTUM
Librerie
Definizione PIN


1 Commento

  1. Salve io con l'IDE 1.0.0 non riesco a fare l'upload di factotum su tidigino.. Mi potrebbe spiegare cortesemente come si fa? perchè al momento della compilazione mi da tanti errori.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu